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.
Will delete this stray comment.