clang -fstack-size-section emits a non-alloc SHF_LINK_ORDER section .stack_sizes linking to .text [ 2] .text PROGBITS 0000000000000000 000040 000006 00 AX 0 0 16 [ 3] .stack_sizes PROGBITS 0000000000000000 000046 000009 00 L 2 0 1 Below is a hypothetical -ffunction-sections -fstack-size-section output. The contents of .stack_sizes are irrelevant to the feature request, so arbitrary .byte 1 and .byte 2 are used. # a.s .section .text.live,"ax",@progbits .globl live live: nop # "o" is an llvm-mc extension that sets the SHF_LINK_ORDER flag and sets sh_link to the referenced section number. .section .stack_sizes,"o",@progbits,.text.live,unique,0 .byte 1 .section .text.dead,"ax",@progbits .globl dead dead: nop .section .stack_sizes,"o",@progbits,.text.dead,unique,1 .byte 2 .section .text.main,"ax",@progbits .globl _start _start: callq live@PLT llvm-mc -filetype=obj -triple=x86_64 a.s -o a.o ld.bfd --gc-sections a.o -o a.bfd # size(.stack_sizes) = 2 ld.lld --gc-sections a.o -o a.lld # size(.stack_sizes) = 1 As the result shows, lld can garbage collect non-SHF_ALLOC sections. The rule is: a non-SHF_ALLOC section is discarded if it has the SHF_LINK_ORDER flag and its sh_link references a discarded section. I havn't found other examples leveraging non-alloc SHF_LINK_ORDER sections in the wild. Just wanted to ask: is this garbage collecting rule GNU linkers want to have as well? The "Possible Duplicates" feature suggested that I posted a related feature request a few months ago. https://sourceware.org/bugzilla/show_bug.cgi?id=24526 It'd be nice to have feedback on that as well.
The master branch has been updated by H.J. Lu <hjl@sourceware.org>: https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=b7d072167715829eed0622616f6ae0182900de3e commit b7d072167715829eed0622616f6ae0182900de3e Author: H.J. Lu <hjl.tools@gmail.com> Date: Thu Feb 6 18:04:58 2020 -0800 ELF: Support the section flag 'o' in .section directive As shown in https://sourceware.org/bugzilla/show_bug.cgi?id=25490 --gc-sections will silently remove __patchable_function_entries section and generate corrupt result. This patch adds the section flag 'o' to .section directive: .section __patchable_function_entries,"awo",@progbits,foo .section __patchable_function_entries,"awoG",@progbits,foo,foo,comdat .section __patchable_function_entries,"awo",@progbits,bar,unique,4 .section __patchable_function_entries,"awoG",@progbits,foo,foo,comdat,unique,1 which specifies the symbol name which the section references. Assmebler will set its elf_linked_to_section to a local section where the symbol is defined. Linker is updated to call mark_hook if gc_mark of any of its linked-to sections is set after all sections, except for backend specific ones, have been garbage collected. bfd/ PR gas/25381 * bfd-in2.h: Regenerated. * elflink.c (_bfd_elf_gc_mark_extra_sections): Call mark_hook on section if gc_mark of any of its linked-to sections is set and don't set gc_mark again. * section.c (asection): Add linked_to_symbol_name to map_head union. gas/ PR gas/25381 * config/obj-elf.c (get_section): Also check linked_to_symbol_name. (obj_elf_change_section): Also set map_head.linked_to_symbol_name. (obj_elf_parse_section_letters): Handle the 'o' flag. (build_group_lists): Renamed to ... (build_additional_section_info): This. Set elf_linked_to_section from map_head.linked_to_symbol_name. (elf_adjust_symtab): Updated. * config/obj-elf.h (elf_section_match): Add linked_to_symbol_name. * doc/as.texi: Document the 'o' flag. * testsuite/gas/elf/elf.exp: Run PR gas/25381 tests. * testsuite/gas/elf/section18.d: New file. * testsuite/gas/elf/section18.s: Likewise. * testsuite/gas/elf/section19.d: Likewise. * testsuite/gas/elf/section19.s: Likewise. * testsuite/gas/elf/section20.d: Likewise. * testsuite/gas/elf/section20.s: Likewise. * testsuite/gas/elf/section21.d: Likewise. * testsuite/gas/elf/section21.l: Likewise. * testsuite/gas/elf/section21.s: Likewise. ld/ PR ld/24526 PR ld/25021 PR ld/25490 * testsuite/ld-elf/elf.exp: Run PR ld/25490 tests. * testsuite/ld-elf/pr24526.d: New file. * testsuite/ld-elf/pr24526.s: Likewise. * testsuite/ld-elf/pr25021.d: Likewise. * testsuite/ld-elf/pr25021.s: Likewise. * testsuite/ld-elf/pr25490-2-16.rd: Likewise. * testsuite/ld-elf/pr25490-2-32.rd: Likewise. * testsuite/ld-elf/pr25490-2-64.rd: Likewise. * testsuite/ld-elf/pr25490-2.s: Likewise. * testsuite/ld-elf/pr25490-3-16.rd: Likewise. * testsuite/ld-elf/pr25490-3-32.rd: Likewise. * testsuite/ld-elf/pr25490-3-64.rd: Likewise. * testsuite/ld-elf/pr25490-3.s: Likewise. * testsuite/ld-elf/pr25490-4-16.rd: Likewise. * testsuite/ld-elf/pr25490-4-32.rd: Likewise. * testsuite/ld-elf/pr25490-4-64.rd: Likewise. * testsuite/ld-elf/pr25490-4.s: Likewise. * testsuite/ld-elf/pr25490-5-16.rd: Likewise. * testsuite/ld-elf/pr25490-5-32.rd: Likewise. * testsuite/ld-elf/pr25490-5-64.rd: Likewise. * testsuite/ld-elf/pr25490-5.s: Likewise. * testsuite/ld-elf/pr25490-6-16.rd: Likewise. * testsuite/ld-elf/pr25490-6-32.rd: Likewise. * testsuite/ld-elf/pr25490-6-64.rd: Likewise. * testsuite/ld-elf/pr25490-6.s: Likewise.
Fixed for 2.35