[ELF] Default to -z start-stop-gc with a glibc "__libc_" special case
authorFangrui Song <i@maskray.me>
Fri, 16 Apr 2021 19:18:45 +0000 (12:18 -0700)
committerFangrui Song <i@maskray.me>
Fri, 16 Apr 2021 19:18:46 +0000 (12:18 -0700)
commit6d2d3bd0a61f5fc7fd9f61f48bc30e9ca77cc619
treeaff9aacda8d5c87d954a9d44b8b068177c3b4b9d
parent5c729750a6d75df4eeb3eaad72e0b4e93ea27c0e
[ELF] Default to -z start-stop-gc with a glibc "__libc_" special case

Change the default to facilitate GC for metadata section usage, so that they
don't need SHF_LINK_ORDER or SHF_GROUP just to drop the unhelpful rule (if they
want to be unconditionally retained, use SHF_GNU_RETAIN
(`__attribute__((retain))`) or linker script `KEEP`).

The dropped SHF_GROUP special case makes the behavior of -z start-stop-gc and -z
nostart-stop-gc closer to GNU ld>=2.37 (https://sourceware.org/PR27451).

However, we default to -z start-stop-gc (which actually matches more closely to
GNU ld before 2015-10 https://sourceware.org/PR19167), which is different from
modern GNU ld (which has the unhelpful rule to work around glibc). As a
compensation, we special case `__libc_` sections as a workaround for glibc<2.34
(https://sourceware.org/PR27492).

Since -z start-stop-gc as the default actually matches the traditional GNU ld
behavior, there isn't much to be aware of. There was a systemd usage which has
been fixed by https://github.com/systemd/systemd/pull/19144
lld/ELF/Driver.cpp
lld/ELF/MarkLive.cpp
lld/test/ELF/gc-sections-metadata-startstop.s
lld/test/ELF/gc-sections-startstop.s
lld/test/ELF/linkerscript/sections-gc2.s
lld/test/ELF/lto/section-name.ll
lld/test/ELF/relocatable-gc.s