aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2017-05-19 12:40:10 +0930
committerAlan Modra <amodra@gmail.com>2017-05-19 17:49:34 +0930
commiteb026f09eb6fcb96a5de1e655cdde041ba44affb (patch)
tree47bbe22ebbb48572a0ced8894d05fc2939d91289
parent50e1d299ef1d21b0833c2fe1484d3cc374e6486f (diff)
downloadfsf-binutils-gdb-eb026f09eb6fcb96a5de1e655cdde041ba44affb.zip
fsf-binutils-gdb-eb026f09eb6fcb96a5de1e655cdde041ba44affb.tar.gz
fsf-binutils-gdb-eb026f09eb6fcb96a5de1e655cdde041ba44affb.tar.bz2
garbage collect debug sections when no alloc sections are kept
The pr20882 testcase fails on a number of targets that add attribute or note sections to object files, and the default linker script says those sections should be kept. This patch changes --gc-sections to drop debug and special sections like .comment when no SEC_ALLOC section in an object file is kept. The assumption is that debug sections are describing code and data that will become part of the final image in memory. * elflink.c (_bfd_elf_gc_mark_extra_sections): Don't keep debug and special sections when no non-note alloc sections in an object are kept.
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elflink.c8
2 files changed, 11 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index a85199a..a5ec80a 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2017-05-19 Alan Modra <amodra@gmail.com>
+
+ * elflink.c (_bfd_elf_gc_mark_extra_sections): Don't keep
+ debug and special sections when no non-note alloc sections in an
+ object are kept.
+
2017-05-18 Alan Modra <amodra@gmail.com>
* arc-got.h: Don't compare boolean values against TRUE or FALSE.
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 387c6fd..71da4c9 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -12961,7 +12961,9 @@ _bfd_elf_gc_mark_extra_sections (struct bfd_link_info *info,
{
if ((isec->flags & SEC_LINKER_CREATED) != 0)
isec->gc_mark = 1;
- else if (isec->gc_mark)
+ else if (isec->gc_mark
+ && (isec->flags & SEC_ALLOC) != 0
+ && elf_section_type (isec) != SHT_NOTE)
some_kept = TRUE;
if (!debug_frag_seen
@@ -12970,8 +12972,8 @@ _bfd_elf_gc_mark_extra_sections (struct bfd_link_info *info,
debug_frag_seen = TRUE;
}
- /* If no section in this file will be kept, then we can
- toss out the debug and special sections. */
+ /* If no non-note alloc section in this file will be kept, then
+ we can toss out the debug and special sections. */
if (!some_kept)
continue;