diff options
author | Alan Modra <amodra@gmail.com> | 2018-02-13 14:09:48 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2018-02-13 22:55:49 +1030 |
commit | 6e5e9d58c1eeef5677c90886578a895cb8c164c5 (patch) | |
tree | cb2ae019115967a391262d5f9533e0fd19e7944f /bfd | |
parent | f2731e0c374e5323ce4cdae2bcc7b7fe22da1a6f (diff) | |
download | gdb-6e5e9d58c1eeef5677c90886578a895cb8c164c5.zip gdb-6e5e9d58c1eeef5677c90886578a895cb8c164c5.tar.gz gdb-6e5e9d58c1eeef5677c90886578a895cb8c164c5.tar.bz2 |
PR22836, "-r -s" doesn't work with -g3 using GCC 7
This fixes the case where all of a group is removed with ld -r, the
situation in the PR, and failures where part of a group is removed
that contain relocs.
bfd/
PR 22836
* elf.c (_bfd_elf_fixup_group_sections): Account for removed
relocation sections. If size reduces to just the flag word,
remove that too and mark with SEC_EXCLUDE.
* elflink.c (bfd_elf_final_link): Strip empty group sections.
binutils/
* testsuite/binutils-all/group-7.s,
* testsuite/binutils-all/group-7a.d,
* testsuite/binutils-all/group-7b.d,
* testsuite/binutils-all/group-7c.d: New tests.
* testsuite/binutils-all/objcopy.exp: Run them.
ld/
* testsuite/ld-elf/pr22836-2.d,
* testsuite/ld-elf/pr22836-2.s: New test.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/elf.c | 25 | ||||
-rw-r--r-- | bfd/elflink.c | 7 |
3 files changed, 36 insertions, 4 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index c931414..35fc174 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,13 @@ 2018-02-13 Alan Modra <amodra@gmail.com> + PR 22836 + * elf.c (_bfd_elf_fixup_group_sections): Account for removed + relocation sections. If size reduces to just the flag word, + remove that too and mark with SEC_EXCLUDE. + * elflink.c (bfd_elf_final_link): Strip empty group sections. + +2018-02-13 Alan Modra <amodra@gmail.com> + PR 22829 * elf.c (assign_file_positions_for_non_load_sections): Rewrite PT_GNU_RELRO setup. @@ -7604,7 +7604,16 @@ _bfd_elf_fixup_group_sections (bfd *ibfd, asection *discarded) but the SHT_GROUP section is, then adjust its size. */ else if (s->output_section == discarded && isec->output_section != discarded) - removed += 4; + { + struct bfd_elf_section_data *elf_sec = elf_section_data (s); + removed += 4; + if (elf_sec->rel.hdr != NULL + && (elf_sec->rel.hdr->sh_flags & SHF_GROUP) != 0) + removed += 4; + if (elf_sec->rela.hdr != NULL + && (elf_sec->rela.hdr->sh_flags & SHF_GROUP) != 0) + removed += 4; + } s = elf_next_in_group (s); if (s == first) break; @@ -7614,18 +7623,26 @@ _bfd_elf_fixup_group_sections (bfd *ibfd, asection *discarded) if (discarded != NULL) { /* If we've been called for ld -r, then we need to - adjust the input section size. This function may - be called multiple times, so save the original - size. */ + adjust the input section size. */ if (isec->rawsize == 0) isec->rawsize = isec->size; isec->size = isec->rawsize - removed; + if (isec->size <= 4) + { + isec->size = 0; + isec->flags |= SEC_EXCLUDE; + } } else { /* Adjust the output section size when called from objcopy. */ isec->output_section->size -= removed; + if (isec->output_section->size <= 4) + { + isec->output_section->size = 0; + isec->output_section->flags |= SEC_EXCLUDE; + } } } } diff --git a/bfd/elflink.c b/bfd/elflink.c index d1eb820..6eb47ee 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -11618,6 +11618,13 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info) else o->flags |= SEC_EXCLUDE; } + else if ((o->flags & SEC_GROUP) != 0 && o->size == 0) + { + /* Remove empty group section from linker output. */ + o->flags |= SEC_EXCLUDE; + bfd_section_list_remove (abfd, o); + abfd->section_count--; + } } /* Count up the number of relocations we will output for each output |