From 709001e957fd1ae39f44b1e0690dfca64dddf044 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Sat, 23 Oct 2010 18:05:10 +0000 Subject: [PATCH] 2010-10-23 Mark Mitchell * config/obj-elf.c (elf_adjust_symtab): New. Move group section processing here from elf_frob_file. Ensure that group signature symbols have the name of the group. (elf_frob_file): Move group section processing to elf_adjust_symtab. * config/obj-elf.h (elf_adjust_symtab): Declare. (obj_adjust_symtab): Define. * config/tc-arm.c (arm_adjust_symtab): Call elf_adjust_symtab. 2010-10-23 Mark Mitchell * gas/elf/elf.exp: Add group0c test. * gas/elf/group0c.d: New. * gas/elf/group0a.d: Expect ".group" for the name of group sections. * gas/elf/group0b.d: Likewise. * gas/elf/group1a.d: Likewise. * gas/elf/group1b.d: Likewise. * gas/elf/groupautoa.d: Likewise. * gas/elf/groupautob.d: Likewise. * gas/elf/section4.d: Likewise. * gas/ia64/group-1.d: Likewise. Adjust hard-coded constants. 2010-10-22 Mark Mitchell * binutils-all/group-5.d: Expect ".group" for the name of group sections. * binutils-all/strip-2.d: Likewise. 2010-10-23 Mark Mitchell * ld-elf/group10.d: Expect ".group" for the name of group sections. * ld-elf/group2.d: Likewise. * ld-elf/group7.d: Likewise. --- binutils/testsuite/ChangeLog | 6 +++ binutils/testsuite/binutils-all/group-5.d | 4 +- binutils/testsuite/binutils-all/strip-2.d | 4 +- gas/ChangeLog | 11 +++++ gas/config/obj-elf.c | 53 +++++++++++++---------- gas/config/obj-elf.h | 5 +++ gas/config/tc-arm.c | 2 + gas/testsuite/ChangeLog | 14 ++++++ gas/testsuite/gas/elf/elf.exp | 1 + gas/testsuite/gas/elf/group0a.d | 2 +- gas/testsuite/gas/elf/group0b.d | 2 +- gas/testsuite/gas/elf/group0c.d | 7 +++ gas/testsuite/gas/elf/group1a.d | 2 +- gas/testsuite/gas/elf/group1b.d | 2 +- gas/testsuite/gas/elf/groupautoa.d | 2 +- gas/testsuite/gas/elf/groupautob.d | 2 +- gas/testsuite/gas/elf/section4.d | 2 +- gas/testsuite/gas/ia64/group-1.d | 12 ++--- ld/testsuite/ChangeLog | 7 +++ ld/testsuite/ld-elf/group10.d | 2 +- ld/testsuite/ld-elf/group2.d | 4 +- ld/testsuite/ld-elf/group7.d | 2 +- 22 files changed, 103 insertions(+), 45 deletions(-) create mode 100644 gas/testsuite/gas/elf/group0c.d diff --git a/binutils/testsuite/ChangeLog b/binutils/testsuite/ChangeLog index 7cd27fce63..9a9fa8bc96 100644 --- a/binutils/testsuite/ChangeLog +++ b/binutils/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2010-10-22 Mark Mitchell + + * binutils-all/group-5.d: Expect ".group" for the name of group + sections. + * binutils-all/strip-2.d: Likewise. + 2010-10-12 Andreas Schwab * binutils-all/m68k/objdump.exp: Add fnop test. diff --git a/binutils/testsuite/binutils-all/group-5.d b/binutils/testsuite/binutils-all/group-5.d index d40fffe942..3c88ba9069 100644 --- a/binutils/testsuite/binutils-all/group-5.d +++ b/binutils/testsuite/binutils-all/group-5.d @@ -6,13 +6,13 @@ #readelf: -Sg --wide #... - \[[ 0-9]+\] foo_group[ \t]+GROUP[ \t]+.* + \[[ 0-9]+\] \.group[ \t]+GROUP[ \t]+.* #... \[[ 0-9]+\] \.text.*[ \t]+PROGBITS[ \t0-9a-f]+AXG.* #... \[[ 0-9]+\] \.data.*[ \t]+PROGBITS[ \t0-9a-f]+WAG.* #... -COMDAT group section \[[ 0-9]+\] `foo_group' \[foo_group\] contains 2 sections: +COMDAT group section \[[ 0-9]+\] `\.group' \[foo_group\] contains 2 sections: \[Index\] Name \[[ 0-9]+\] .text.* \[[ 0-9]+\] .data.* diff --git a/binutils/testsuite/binutils-all/strip-2.d b/binutils/testsuite/binutils-all/strip-2.d index 5c54b7ecb8..9922f475dc 100644 --- a/binutils/testsuite/binutils-all/strip-2.d +++ b/binutils/testsuite/binutils-all/strip-2.d @@ -5,13 +5,13 @@ #name: strip with section group 2 #... - \[[ 0-9]+\] foo_group[ \t]+GROUP[ \t]+.* + \[[ 0-9]+\] \.group[ \t]+GROUP[ \t]+.* #... \[[ 0-9]+\] \.text.*[ \t]+PROGBITS[ \t0-9a-f]+AXG[ \t]+.* #... \[[ 0-9]+\] \.data.*[ \t]+PROGBITS[ \t0-9a-f]+WAG[ \t]+.* #... -COMDAT group section \[[ 0-9]+\] `foo_group' \[foo_group\] contains 2 sections: +COMDAT group section \[[ 0-9]+\] `\.group' \[foo_group\] contains 2 sections: \[Index\] Name \[[ 0-9]+\] .text.* \[[ 0-9]+\] .data.* diff --git a/gas/ChangeLog b/gas/ChangeLog index 817adc447a..b3fb6253d6 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,14 @@ +2010-10-23 Mark Mitchell + + * config/obj-elf.c (elf_adjust_symtab): New. Move group section + processing here from elf_frob_file. Ensure that group signature + symbols have the name of the group. + (elf_frob_file): Move group section processing to + elf_adjust_symtab. + * config/obj-elf.h (elf_adjust_symtab): Declare. + (obj_adjust_symtab): Define. + * config/tc-arm.c (arm_adjust_symtab): Call elf_adjust_symtab. + 2010-10-22 Rainer Orth * config/tc-sparc.h [TE_SOLARIS] (ELF_TARGET_FORMAT): Define as diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index 43820f51e0..9f7361648f 100644 --- a/gas/config/obj-elf.c +++ b/gas/config/obj-elf.c @@ -2081,32 +2081,29 @@ static void free_section_idx (const char *key ATTRIBUTE_UNUSED, void *val) } void -elf_frob_file (void) +elf_adjust_symtab (void) { struct group_list list; unsigned int i; - bfd_map_over_sections (stdoutput, adjust_stab_sections, NULL); - /* Go find section groups. */ list.num_group = 0; list.head = NULL; list.elt_count = NULL; - list.indexes = hash_new (); + list.indexes = hash_new (); bfd_map_over_sections (stdoutput, build_group_lists, &list); - + /* Make the SHT_GROUP sections that describe each section group. We can't set up the section contents here yet, because elf section indices have yet to be calculated. elf.c:set_group_contents does the rest of the work. */ - for (i = 0; i < list.num_group; i++) + for (i = 0; i < list.num_group; i++) { const char *group_name = elf_group_name (list.head[i]); const char *sec_name; asection *s; flagword flags; struct symbol *sy; - int has_sym; bfd_size_type size; flags = SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_GROUP; @@ -2122,17 +2119,7 @@ elf_frob_file (void) } } - sec_name = group_name; - sy = symbol_find_exact (group_name); - has_sym = 0; - if (sy != NULL - && (sy == symbol_lastP - || (sy->sy_next != NULL - && sy->sy_next->sy_previous == sy))) - { - has_sym = 1; - sec_name = ".group"; - } + sec_name = ".group"; s = subseg_force_new (sec_name, 0); if (s == NULL || !bfd_set_section_flags (stdoutput, s, flags) @@ -2145,8 +2132,20 @@ elf_frob_file (void) /* Pass a pointer to the first section in this group. */ elf_next_in_group (s) = list.head[i]; - if (has_sym) - elf_group_id (s) = sy->bsym; + /* Make sure that the signature symbol for the group has the + name of the group. */ + sy = symbol_find_exact (group_name); + if (!sy + || (sy != symbol_lastP + && (sy->sy_next == NULL + || sy->sy_next->sy_previous != sy))) + { + /* Create the symbol now. */ + sy = symbol_new (group_name, now_seg, (valueT) 0, frag_now); + symbol_get_obj (sy)->local = 1; + symbol_table_insert (sy); + } + elf_group_id (s) = symbol_get_bfdsym (sy); size = 4 * (list.elt_count[i] + 1); bfd_set_section_size (stdoutput, s, size); @@ -2155,15 +2154,21 @@ elf_frob_file (void) frag_wane (frag_now); } -#ifdef elf_tc_final_processing - elf_tc_final_processing (); -#endif - /* Cleanup hash. */ hash_traverse (list.indexes, free_section_idx); hash_die (list.indexes); } +void +elf_frob_file (void) +{ + bfd_map_over_sections (stdoutput, adjust_stab_sections, NULL); + +#ifdef elf_tc_final_processing + elf_tc_final_processing (); +#endif +} + /* It removes any unneeded versioned symbols from the symbol table. */ void diff --git a/gas/config/obj-elf.h b/gas/config/obj-elf.h index c734aab757..ccfa8d294c 100644 --- a/gas/config/obj-elf.h +++ b/gas/config/obj-elf.h @@ -197,6 +197,11 @@ void elf_copy_symbol_attributes (symbolS *, symbolS *); (elf_copy_symbol_attributes (DEST, SRC)) #endif +void elf_adjust_symtab (void); +#ifndef obj_adjust_symtab +#define obj_adjust_symtab elf_adjust_symtab +#endif + #ifndef SEPARATE_STAB_SECTIONS /* Avoid ifndef each separate macro setting by wrapping the whole of the stab group on the assumption that whoever sets SEPARATE_STAB_SECTIONS diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 69ff36a680..8dd342bdec 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -21957,6 +21957,8 @@ arm_adjust_symtab (void) /* Remove any overlapping mapping symbols generated by alignment frags. */ bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0); + /* Now do generic ELF adjustments. */ + elf_adjust_symtab (); #endif } diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index f980f33896..e2cf0c2b88 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,17 @@ +2010-10-23 Mark Mitchell + + * gas/elf/elf.exp: Add group0c test. + * gas/elf/group0c.d: New. + * gas/elf/group0a.d: Expect ".group" for the name of group + sections. + * gas/elf/group0b.d: Likewise. + * gas/elf/group1a.d: Likewise. + * gas/elf/group1b.d: Likewise. + * gas/elf/groupautoa.d: Likewise. + * gas/elf/groupautob.d: Likewise. + * gas/elf/section4.d: Likewise. + * gas/ia64/group-1.d: Likewise. Adjust hard-coded constants. + 2010-10-22 Nick Clifton * gas/all/fwdexp.d: Also look for f8ffffff. diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp index 4aa2b2e6a8..5236913465 100644 --- a/gas/testsuite/gas/elf/elf.exp +++ b/gas/testsuite/gas/elf/elf.exp @@ -104,6 +104,7 @@ if { ([istarget "*-*-*elf*"] } run_dump_test "group0a" run_dump_test "group0b" + run_dump_test "group0c" run_dump_test "group1a" run_dump_test "group1b" run_dump_test "groupautoa" diff --git a/gas/testsuite/gas/elf/group0a.d b/gas/testsuite/gas/elf/group0a.d index 8aedc0caa4..e6b9366c8b 100644 --- a/gas/testsuite/gas/elf/group0a.d +++ b/gas/testsuite/gas/elf/group0a.d @@ -3,7 +3,7 @@ #source: group0.s #... -[ ]*\[.*\][ ]+\.foo_group[ ]+GROUP.* +[ ]*\[.*\][ ]+\.group[ ]+GROUP.* #... [ ]*\[.*\][ ]+\.foo[ ]+PROGBITS.*[ ]+AXG[ ]+.* [ ]*\[.*\][ ]+\.bar[ ]+PROGBITS.*[ ]+AG[ ]+.* diff --git a/gas/testsuite/gas/elf/group0b.d b/gas/testsuite/gas/elf/group0b.d index 803b8ec797..fc74ea6398 100644 --- a/gas/testsuite/gas/elf/group0b.d +++ b/gas/testsuite/gas/elf/group0b.d @@ -3,7 +3,7 @@ #source: group0.s #... -COMDAT group section \[ 1\] `.foo_group' \[.foo_group\] contains 2 sections: +COMDAT group section \[ 1\] `\.group' \[.foo_group\] contains 2 sections: [ ]+\[Index\][ ]+Name [ ]+\[.*\][ ]+.foo [ ]+\[.*\][ ]+.bar diff --git a/gas/testsuite/gas/elf/group0c.d b/gas/testsuite/gas/elf/group0c.d new file mode 100644 index 0000000000..dd3ce908a5 --- /dev/null +++ b/gas/testsuite/gas/elf/group0c.d @@ -0,0 +1,7 @@ +#readelf: -sW +#name: group section name +#source: group0.s + +#... +.*NOTYPE[ ]+LOCAL[ ]+DEFAULT[ ]+[0-9]+[ ]+\.foo_group +#pass diff --git a/gas/testsuite/gas/elf/group1a.d b/gas/testsuite/gas/elf/group1a.d index a5b3298757..27da751f75 100644 --- a/gas/testsuite/gas/elf/group1a.d +++ b/gas/testsuite/gas/elf/group1a.d @@ -3,7 +3,7 @@ #source: group1.s #... -[ ]*\[.*\][ ]+\.foo_group[ ]+GROUP.* +[ ]*\[.*\][ ]+\.group[ ]+GROUP.* #... [ ]*\[.*\][ ]+\.text[ ]+PROGBITS.*[ ]+AX[ ]+.* #... diff --git a/gas/testsuite/gas/elf/group1b.d b/gas/testsuite/gas/elf/group1b.d index 704752ba6a..405e2036f7 100644 --- a/gas/testsuite/gas/elf/group1b.d +++ b/gas/testsuite/gas/elf/group1b.d @@ -3,7 +3,7 @@ #source: group1.s #... -COMDAT group section \[ 1\] `.foo_group' \[.foo_group\] contains 1 sections: +COMDAT group section \[ 1\] `\.group' \[.foo_group\] contains 1 sections: [ ]+\[Index\][ ]+Name [ ]+\[.*\][ ]+.text #pass diff --git a/gas/testsuite/gas/elf/groupautoa.d b/gas/testsuite/gas/elf/groupautoa.d index a34c35cfa6..57ef2b7fb0 100644 --- a/gas/testsuite/gas/elf/groupautoa.d +++ b/gas/testsuite/gas/elf/groupautoa.d @@ -3,7 +3,7 @@ #source: groupauto.s #... -[ ]*\[.*\][ ]+some_group[ ]+GROUP.* +[ ]*\[.*\][ ]+\.group[ ]+GROUP.* #... [ ]*\[.*\][ ]+\.text[ ]+PROGBITS.*[ ]+AX[ ]+.* #... diff --git a/gas/testsuite/gas/elf/groupautob.d b/gas/testsuite/gas/elf/groupautob.d index 0ff100725a..1bd211027d 100644 --- a/gas/testsuite/gas/elf/groupautob.d +++ b/gas/testsuite/gas/elf/groupautob.d @@ -3,7 +3,7 @@ #source: groupauto.s #... -COMDAT group section \[ 1\] `some_group' \[some_group\] contains 2 sections: +COMDAT group section \[ 1\] `\.group' \[some_group\] contains 2 sections: [ ]+\[Index\][ ]+Name [ ]+\[.*\][ ]+.text [ ]+\[.*\][ ]+.note.bar diff --git a/gas/testsuite/gas/elf/section4.d b/gas/testsuite/gas/elf/section4.d index 5cda69ba73..f5bab79ce7 100644 --- a/gas/testsuite/gas/elf/section4.d +++ b/gas/testsuite/gas/elf/section4.d @@ -2,7 +2,7 @@ #name: label arithmetic with multiple same-name sections #... -[ ]*\[.*\][ ]+foo[ ]+GROUP.* +[ ]*\[.*\][ ]+\.group[ ]+GROUP.* #... [ ]*\[.*\][ ]+\.text[ ]+PROGBITS.* #... diff --git a/gas/testsuite/gas/ia64/group-1.d b/gas/testsuite/gas/ia64/group-1.d index eef78d92d5..3c824a74ff 100644 --- a/gas/testsuite/gas/ia64/group-1.d +++ b/gas/testsuite/gas/ia64/group-1.d @@ -8,7 +8,7 @@ Section Headers: Size EntSize Flags Link Info Align \[ 0\] NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0 - \[ 1\] \._foo GROUP 0000000000000000 00000040 + \[ 1\] \.group GROUP 0000000000000000 00000040 0000000000000008 0000000000000004 7 6 4 \[ 2\] \.text PROGBITS 0000000000000000 00000050 0000000000000000 0000000000000000 AX 0 0 16 @@ -19,14 +19,14 @@ Section Headers: \[ 5\] \.text PROGBITS 0000000000000000 00000050 0000000000000010 0000000000000000 AXG 0 0 16 \[ 6\] \.shstrtab STRTAB 0000000000000000 00000060 - 0000000000000032 0000000000000000 0 0 1 + 0000000000000033 0000000000000000 0 0 1 \[ 7\] \.symtab SYMTAB 0000000000000000 000002d8 - 00000000000000a8 0000000000000018 8 7 8 - \[ 8\] \.strtab STRTAB 0000000000000000 00000380 - 0000000000000006 0000000000000000 0 0 1 + 00000000000000c0 0000000000000018 8 8 8 + \[ 8\] \.strtab STRTAB 0000000000000000 00000398 + 000000000000000c 0000000000000000 0 0 1 Key to Flags: #... -COMDAT group section \[ 1\] `\._foo' \[\._foo\] contains 1 sections: +COMDAT group section \[ 1\] `\.group' \[\._foo\] contains 1 sections: \[Index\] Name \[ 5\] \.text diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index cbba0c080f..dbb22bd3b8 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2010-10-23 Mark Mitchell + + * ld-elf/group10.d: Expect ".group" for the name of group + sections. + * ld-elf/group2.d: Likewise. + * ld-elf/group7.d: Likewise. + 2010-10-21 Joseph Myers * ld-tic6x/attr-arch-c62x-c62x.d, ld-tic6x/attr-arch-c62x-c64x+.d, diff --git a/ld/testsuite/ld-elf/group10.d b/ld/testsuite/ld-elf/group10.d index d22a70ae89..6fcf83fa8d 100644 --- a/ld/testsuite/ld-elf/group10.d +++ b/ld/testsuite/ld-elf/group10.d @@ -3,7 +3,7 @@ #readelf: -Sg --wide #... -group section \[[ 0-9]+\] `foo_group' \[foo_group\] contains 4 sections: +group section \[[ 0-9]+\] `\.group' \[foo_group\] contains 4 sections: \[Index\] Name \[[ 0-9]+\] \.text.* \[[ 0-9]+\] \.rodata\.str.* diff --git a/ld/testsuite/ld-elf/group2.d b/ld/testsuite/ld-elf/group2.d index 86ca952256..664c49af7b 100644 --- a/ld/testsuite/ld-elf/group2.d +++ b/ld/testsuite/ld-elf/group2.d @@ -7,13 +7,13 @@ # xstormy also uses a non-standard script, putting .data before .text. #... - \[[ 0-9]+\] foo_group[ \t]+GROUP[ \t]+.* + \[[ 0-9]+\] \.group[ \t]+GROUP[ \t]+.* #... \[[ 0-9]+\] \.text.*[ \t]+PROGBITS[ \t0-9a-f]+AXG.* #... \[[ 0-9]+\] \.data.*[ \t]+PROGBITS[ \t0-9a-f]+WAG.* #... -COMDAT group section \[[ 0-9]+\] `foo_group' \[foo_group\] contains 2 sections: +COMDAT group section \[[ 0-9]+\] `\.group' \[foo_group\] contains 2 sections: \[Index\] Name \[[ 0-9]+\] .text.* \[[ 0-9]+\] .data.* diff --git a/ld/testsuite/ld-elf/group7.d b/ld/testsuite/ld-elf/group7.d index 401836aaa6..602a4c8acc 100644 --- a/ld/testsuite/ld-elf/group7.d +++ b/ld/testsuite/ld-elf/group7.d @@ -9,7 +9,7 @@ # well with unique group sections under ld -r. #... -COMDAT group section \[[ 0-9]+\] `foo_group' \[foo_group\] contains 2 sections: +COMDAT group section \[[ 0-9]+\] `\.group' \[foo_group\] contains 2 sections: \[Index\] Name \[[ 0-9]+\] .text.foo \[[ 0-9]+\] .data.foo -- 2.34.1