Bug 24526 - [gold] Generalize GC support for SHF_LINK_ORDER
Summary: [gold] Generalize GC support for SHF_LINK_ORDER
Status: NEW
Alias: None
Product: binutils
Classification: Unclassified
Component: gold (show other bugs)
Version: 2.35
: P2 normal
Target Milestone: ---
Assignee: Cary Coutant
Depends on:
Reported: 2019-05-05 08:32 UTC by Fangrui Song
Modified: 2020-02-07 02:09 UTC (History)
1 user (show)

See Also:
Last reconfirmed: 2020-02-03 00:00:00


Note You need to log in before you can comment on or make changes to this bug.
Description Fangrui Song 2019-05-05 08:32:18 UTC
There was a discussion https://groups.google.com/d/msg/generic-abi/_CbBM6T6WeM/9nNnwRNHAQAJ to extend the semantics of SHF_LINK_ORDER to represent metadata sections. All parties were in favor of the the wording:

... Furthermore, relocations from this section into the referenced section should not be taken as evidence that the referenced section should be retained.

The patch https://sourceware.org/ml/binutils/2017-04/msg00000.html was posted, but doesn't seem to have been applied yet.

Projects thay may benefit from it:
Linux kernel https://lwn.net/Articles/741617/
LLVM !associated metadata https://llvm.org/docs/LangRef.html#associated-metadata
Comment 1 Fangrui Song 2019-09-20 11:57:29 UTC
This is a feature request to both GNU ld and gold.

# a.s
.globl _start
.quad .foo

.section .foo,"a"
.quad 0
.section .bar,"ao",@progbits,.foo
.quad 0
.section .zed,"ao",@progbits,.foo
.quad 0

llvm-mc -filetype=obj -triple=x86_64 a.s -o a.o
ld.bfd --gc-sections a.o -o a; readelf -S a # .bar and .zed were collected
gold --gc-sections a.o -o a; readelf -S a   # .bar and .zed were collected
ld.lld --gc-sections a.o -o a; readelf -S a # .bar and .zed were retained

In lld, the SHF_LINK_ORDER sections .bar and .zed are treated like .rela.foo. The retain of .foo will also keep .bar and .zed alive.
Comment 2 H.J. Lu 2020-02-03 12:24:54 UTC
Ld bug is tracked by PR ld/25490.
Comment 3 cvs-commit@gcc.gnu.org 2020-02-07 02:09:16 UTC
The master branch has been updated by H.J. Lu <hjl@sourceware.org>:


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
    --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.
    	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
    	PR gas/25381
    	* config/obj-elf.c (get_section): Also check
    	(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.
    	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.