mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[ELF] Don't emit SHF_GNU_RETAIN on Solaris
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`. Differential Revision: https://reviews.llvm.org/D107747 (cherry picked from commit 7bbbf2956181f375ab193321b37ea71c5fc44054)
This commit is contained in:
parent
fd411b2b5d
commit
4a38ef8718
@ -677,8 +677,9 @@ calcUniqueIDUpdateFlagsAndSize(const GlobalObject *GO, StringRef SectionName,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (Retain) {
|
if (Retain) {
|
||||||
if (Ctx.getAsmInfo()->useIntegratedAssembler() ||
|
if ((Ctx.getAsmInfo()->useIntegratedAssembler() ||
|
||||||
Ctx.getAsmInfo()->binutilsIsAtLeast(2, 36))
|
Ctx.getAsmInfo()->binutilsIsAtLeast(2, 36)) &&
|
||||||
|
!TM.getTargetTriple().isOSSolaris())
|
||||||
Flags |= ELF::SHF_GNU_RETAIN;
|
Flags |= ELF::SHF_GNU_RETAIN;
|
||||||
return NextUniqueID++;
|
return NextUniqueID++;
|
||||||
}
|
}
|
||||||
@ -855,8 +856,10 @@ static MCSection *selectELFSectionForGlobal(
|
|||||||
EmitUniqueSection = true;
|
EmitUniqueSection = true;
|
||||||
Flags |= ELF::SHF_LINK_ORDER;
|
Flags |= ELF::SHF_LINK_ORDER;
|
||||||
}
|
}
|
||||||
if (Retain && (Ctx.getAsmInfo()->useIntegratedAssembler() ||
|
if (Retain &&
|
||||||
Ctx.getAsmInfo()->binutilsIsAtLeast(2, 36))) {
|
(Ctx.getAsmInfo()->useIntegratedAssembler() ||
|
||||||
|
Ctx.getAsmInfo()->binutilsIsAtLeast(2, 36)) &&
|
||||||
|
!TM.getTargetTriple().isOSSolaris()) {
|
||||||
EmitUniqueSection = true;
|
EmitUniqueSection = true;
|
||||||
Flags |= ELF::SHF_GNU_RETAIN;
|
Flags |= ELF::SHF_GNU_RETAIN;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user