From 4c8e8a7ee091749d21a6f1ef57f75faa190860fd Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Fri, 16 Sep 2011 04:23:19 +0000 Subject: [PATCH] Remove the group section if all members are removed. binutils/ 2011-09-15 H.J. Lu PR binutils/13180 * objcopy.c (is_strip_section_1): New. (is_strip_section): Use it. Remove the group section if all members are removed. binutils/testsuite/ 2011-09-15 H.J. Lu 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. --- binutils/ChangeLog | 7 +++++ binutils/objcopy.c | 29 +++++++++++++++++++-- binutils/testsuite/ChangeLog | 8 ++++++ binutils/testsuite/binutils-all/group-6.d | 9 +++++++ binutils/testsuite/binutils-all/group-6.s | 4 +++ binutils/testsuite/binutils-all/objcopy.exp | 1 + 6 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 binutils/testsuite/binutils-all/group-6.d create mode 100644 binutils/testsuite/binutils-all/group-6.s diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 4f6d0328e8c..144dbffafcc 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,10 @@ +2011-09-15 H.J. Lu + + 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 * po/ja.po: Updated Japanese translation. diff --git a/binutils/objcopy.c b/binutils/objcopy.c index b64f3d046c4..31ac0a2bb3e 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 efc10553df9..597357b0bfe 100644 --- a/binutils/testsuite/ChangeLog +++ b/binutils/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2011-09-15 H.J. Lu + + 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 * 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 00000000000..33197456852 --- /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 00000000000..e4c2bdac149 --- /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 7ad84971289..a22e98c90bd 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" } -- 2.30.2