aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2018-01-11 09:42:12 -0800
committerH.J. Lu <hjl.tools@gmail.com>2018-01-11 09:42:12 -0800
commit8b6f4cd34fdde524ea035c65f7d48aaa3fb449b5 (patch)
treef2792cd8a1968d5db78c810fa7ae93874055f367 /bfd
parent65f14869fd3fbee8ed4c4ca49de8aaa86dbc66cb (diff)
downloadgdb-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')
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elflink.c10
2 files changed, 15 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index a174a4c..8f2feae 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2018-01-11 H.J. Lu <hongjiu.lu@intel.com>
+
+ 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-section.
+
2017-09-27 Kuan-Lin Chen <kuanlinchentw@gmail.com>
PR 22662
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 )))
{