[all-commits] [llvm/llvm-project] 4bbcd6: [ELF] Add -z start-stop-gc to let __start_/__stop_...

Fangrui Song via All-commits all-commits at lists.llvm.org
Thu Feb 25 15:46:55 PST 2021


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 4bbcd63eea4950c38e29f9e29b1d11b7d7894469
      https://github.com/llvm/llvm-project/commit/4bbcd63eea4950c38e29f9e29b1d11b7d7894469
  Author: Fangrui Song <i at maskray.me>
  Date:   2021-02-25 (Thu, 25 Feb 2021)

  Changed paths:
    M lld/ELF/Config.h
    M lld/ELF/Driver.cpp
    M lld/ELF/MarkLive.cpp
    M lld/docs/ld.lld.1
    M lld/test/ELF/gc-sections-metadata-startstop.s

  Log Message:
  -----------
  [ELF] Add -z start-stop-gc to let __start_/__stop_ not retain C identifier name sections

For one metadata section usage, each text section references a metadata section.
The metadata sections have a C identifier name to allow the runtime to collect them via `__start_/__stop_` symbols.

Since `__start_`/`__stop_` references are always present from live sections, the
C identifier name sections appear like GC roots, which means they cannot be
discarded by `ld --gc-sections`.

To make such sections GCable, either SHF_LINK_ORDER or a section group is needed.

SHF_LINK_ORDER is not suitable for the references can be inlined into other functions
(See D97430:
Function A (in the section .text.A) references its `__sancov_guard` section.
Function B inlines A (so now .text.B references `__sancov_guard` - this is invalid with the semantics of SHF_LINK_ORDER).

In the linking stage,
if `.text.A` gets discarded, and `__sancov_guard` is retained via the reference from `.text.B`,
the output will be invalid because `__sancov_guard` references the discarded `.text.A`.
LLD errors "sh_link points to discarded section".
)

A section group have size overhead, and is cumbersome when there is just one metadata section.

Add `-z start-stop-gc` to drop the "__start_/__stop_ references retain
non-SHF_LINK_ORDER non-SHF_GROUP C identifier name sections" rule.
We reserve the rights to switch the default in the future.

Reviewed By: phosek, jrtc27

Differential Revision: https://reviews.llvm.org/D96914




More information about the All-commits mailing list