aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2018-02-13 14:09:48 +1030
committerAlan Modra <amodra@gmail.com>2018-02-13 22:55:49 +1030
commit6e5e9d58c1eeef5677c90886578a895cb8c164c5 (patch)
treecb2ae019115967a391262d5f9533e0fd19e7944f /bfd
parentf2731e0c374e5323ce4cdae2bcc7b7fe22da1a6f (diff)
downloadgdb-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/ChangeLog8
-rw-r--r--bfd/elf.c25
-rw-r--r--bfd/elflink.c7
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.
diff --git a/bfd/elf.c b/bfd/elf.c
index 0503154..934052d 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -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