The introduction of SHF_GNU_RETAIN has caused massive problems on Solaris.
Initially, as reported in Bug 49437, it caused dozens of testsuite failures on both sparc and
x86. The objects were marked as ELFOSABI_NONE, but SHF_GNU_RETAIN is a GNU
extension. In the native Solaris ABI, that flag (in the range for OS specific values) is
SHF_SUNW_ABSENT with a completely different semantics, which confuses Solaris ld
very much.
Later, the objects became (correctly) marked ELFOSABI_GNU, which Solaris ld
doesn't support, causing it to SEGV and break the build. The linker is currently being
hardened to not accept non-native OS ABIs to avoid this.
The need for linker support is already documented in clang/include/clang/Basic/AttrDocs.td,
but not currently checked.
This patch avoids all this by not emitting SHF_GNU_RETAIN on Solaris at all.
Tested on amd64-pc-solaris2.11, sparcv9-sun-solaris2.11, and x86_64-pc-linux-gnu.
The current patch is a minimal solution. For full generality, any code emitting extensions
beyond the ELF gABI should check that all of the assembler, linker, and runtime linker
used support it. While in some cases assembler support is enough, in others all three
components will be needed.
If support for SHF_GNU_RETAIN is crucial, Solaris has an equivalent flag SHF_SUNW_NODISCARD
that could be used instead.