From: Alan Modra Date: Fri, 19 May 2017 03:10:10 +0000 (+0930) Subject: garbage collect debug sections when no alloc sections are kept X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=eb026f09eb6fcb96a5de1e655cdde041ba44affb;p=binutils-gdb.git 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. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a85199a65bf..a5ec80a76e2 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2017-05-19 Alan Modra + + * 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 * arc-got.h: Don't compare boolean values against TRUE or FALSE. diff --git a/bfd/elflink.c b/bfd/elflink.c index 387c6fdd135..71da4c9fd03 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;