diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2018-01-11 09:42:12 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2018-01-11 09:42:12 -0800 |
commit | 8b6f4cd34fdde524ea035c65f7d48aaa3fb449b5 (patch) | |
tree | f2792cd8a1968d5db78c810fa7ae93874055f367 /bfd/elflink.c | |
parent | 65f14869fd3fbee8ed4c4ca49de8aaa86dbc66cb (diff) | |
download | gdb-8b6f4cd34fdde524ea035c65f7d48aaa3fb449b5.zip gdb-8b6f4cd34fdde524ea035c65f7d48aaa3fb449b5.tar.gz gdb-8b6f4cd34fdde524ea035c65f7d48aaa3fb449b5.tar.bz2 |
ld: Keep PREINIT_ARRAY/INIT_ARRAY/FINI_ARRAY sections for -r --gc-sections
We must keep all PREINIT_ARRAY, INIT_ARRAY as well as FINI_ARRAY sections
for ld -r --gc-sections.
bfd/
PR ld/22677
* elflink.c (bfd_elf_gc_sections): Keep all PREINIT_ARRAY,
INIT_ARRAY as well as FINI_ARRAY sections for ld -r --gc-sections.
ld/
PR ld/22677
* scripttempl/elf.sc (PREINIT_ARRAY): New.
Don't add .preinit_array for ld -r.
* testsuite/ld-elf/pr22677.d: New file.
* testsuite/ld-elf/pr22677.s: Likewise.
Diffstat (limited to 'bfd/elflink.c')
-rw-r--r-- | bfd/elflink.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/bfd/elflink.c b/bfd/elflink.c index 15d9c7e..4c92a04 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -13428,11 +13428,19 @@ bfd_elf_gc_sections (bfd *abfd, struct bfd_link_info *info) /* Start at sections marked with SEC_KEEP (ref _bfd_elf_gc_keep). Also treat note sections as a root, if the section is not part - of a group. */ + of a group. We must keep all PREINIT_ARRAY, INIT_ARRAY as + well as FINI_ARRAY sections for ld -r. */ for (o = sub->sections; o != NULL; o = o->next) if (!o->gc_mark && (o->flags & SEC_EXCLUDE) == 0 && ((o->flags & SEC_KEEP) != 0 + || (bfd_link_relocatable (info) + && ((elf_section_data (o)->this_hdr.sh_type + == SHT_PREINIT_ARRAY) + || (elf_section_data (o)->this_hdr.sh_type + == SHT_INIT_ARRAY) + || (elf_section_data (o)->this_hdr.sh_type + == SHT_FINI_ARRAY))) || (elf_section_data (o)->this_hdr.sh_type == SHT_NOTE && elf_next_in_group (o) == NULL ))) { |