diff options
-rw-r--r-- | binutils/ChangeLog | 7 | ||||
-rw-r--r-- | binutils/objcopy.c | 29 | ||||
-rw-r--r-- | binutils/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | binutils/testsuite/binutils-all/group-6.d | 9 | ||||
-rw-r--r-- | binutils/testsuite/binutils-all/group-6.s | 4 | ||||
-rw-r--r-- | binutils/testsuite/binutils-all/objcopy.exp | 1 |
6 files changed, 56 insertions, 2 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 4f6d032..144dbff 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,10 @@ +2011-09-15 H.J. Lu <hongjiu.lu@intel.com> + + PR binutils/13180 + * objcopy.c (is_strip_section_1): New. + (is_strip_section): Use it. Remove the group section if all + members are removed. + 2011-09-08 Nick Clifton <nickc@redhat.com> * po/ja.po: Updated Japanese translation. diff --git a/binutils/objcopy.c b/binutils/objcopy.c index b64f3d0..31ac0a2 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -925,10 +925,10 @@ group_signature (asection *group) return NULL; } -/* See if a section is being removed. */ +/* See if a non-group section is being removed. */ static bfd_boolean -is_strip_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec) +is_strip_section_1 (bfd *abfd ATTRIBUTE_UNUSED, asection *sec) { if (sections_removed || sections_copied) { @@ -955,10 +955,22 @@ is_strip_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec) return FALSE; } + return FALSE; +} + +/* See if a section is being removed. */ + +static bfd_boolean +is_strip_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec) +{ + if (is_strip_section_1 (abfd, sec)) + return TRUE; + if ((bfd_get_section_flags (abfd, sec) & SEC_GROUP) != 0) { asymbol *gsym; const char *gname; + asection *elt, *first; /* PR binutils/3181 If we are going to strip the group signature symbol, then @@ -972,6 +984,19 @@ is_strip_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec) && !is_specified_symbol (gname, keep_specific_htab)) || is_specified_symbol (gname, strip_specific_htab)) return TRUE; + + /* Remove the group section if all members are removed. */ + first = elt = elf_next_in_group (sec); + while (elt != NULL) + { + if (!is_strip_section_1 (abfd, elt)) + return FALSE; + elt = elf_next_in_group (elt); + if (elt == first) + break; + } + + return TRUE; } return FALSE; diff --git a/binutils/testsuite/ChangeLog b/binutils/testsuite/ChangeLog index efc1055..597357b 100644 --- a/binutils/testsuite/ChangeLog +++ b/binutils/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2011-09-15 H.J. Lu <hongjiu.lu@intel.com> + + PR binutils/13180 + * binutils-all/group-6.d: New. + * binutils-all/group-6.s: Likewise. + + * binutils-all/objcopy.exp: Run group-6 for ELF targrts. + 2011-07-22 H.J. Lu <hongjiu.lu@intel.com> * binutils-all/elfedit.exp: Run elfedit-4. diff --git a/binutils/testsuite/binutils-all/group-6.d b/binutils/testsuite/binutils-all/group-6.d new file mode 100644 index 0000000..3319745 --- /dev/null +++ b/binutils/testsuite/binutils-all/group-6.d @@ -0,0 +1,9 @@ +#PROG: objcopy +#objcopy: --remove-section .text.foo +#name: copy removing all group member +#objdump: -fw + +#... +.*: +file format .* +architecture: .* +#pass diff --git a/binutils/testsuite/binutils-all/group-6.s b/binutils/testsuite/binutils-all/group-6.s new file mode 100644 index 0000000..e4c2bda --- /dev/null +++ b/binutils/testsuite/binutils-all/group-6.s @@ -0,0 +1,4 @@ + .text + .byte 0 + .section .text.foo,"axG",%progbits,foo,comdat + .byte 0 diff --git a/binutils/testsuite/binutils-all/objcopy.exp b/binutils/testsuite/binutils-all/objcopy.exp index 7ad8497..a22e98c 100644 --- a/binutils/testsuite/binutils-all/objcopy.exp +++ b/binutils/testsuite/binutils-all/objcopy.exp @@ -937,6 +937,7 @@ if [is_elf_format] { objcopy_test_readelf "ELF group" group-3.s objcopy_test_readelf "ELF group" group-4.s run_dump_test "group-5" + run_dump_test "group-6" run_dump_test "copy-1" run_dump_test "note-1" } |