mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-05 13:26:55 +00:00
COFF: Ensure that objects produced by LLVM link with /safeseh
Summary: We indicate that the object files are safe by emitting a @feat.00 absolute address symbol. The address is presumably interpreted as a bitfield of features that the compiler would like to enable. Bit 0 is documented in the PE COFF spec to opt in to "registered SEH", which is what /safeseh enables. LLVM's object files are safe by default because LLVM doesn't know how to produce SEH handlers. Reviewers: Bigcheese CC: llvm-commits Differential Revision: http://llvm-reviews.chandlerc.com/D1691 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190898 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -518,6 +518,26 @@ bool X86AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
|
||||
void X86AsmPrinter::EmitStartOfAsmFile(Module &M) {
|
||||
if (Subtarget->isTargetEnvMacho())
|
||||
OutStreamer.SwitchSection(getObjFileLowering().getTextSection());
|
||||
|
||||
if (Subtarget->isTargetCOFF()) {
|
||||
// Emit an absolute @feat.00 symbol. This appears to be some kind of
|
||||
// compiler features bitfield read by link.exe.
|
||||
if (!Subtarget->is64Bit()) {
|
||||
MCSymbol *S = MMI->getContext().GetOrCreateSymbol(StringRef("@feat.00"));
|
||||
OutStreamer.BeginCOFFSymbolDef(S);
|
||||
OutStreamer.EmitCOFFSymbolStorageClass(COFF::IMAGE_SYM_CLASS_STATIC);
|
||||
OutStreamer.EmitCOFFSymbolType(COFF::IMAGE_SYM_DTYPE_NULL);
|
||||
OutStreamer.EndCOFFSymbolDef();
|
||||
// According to the PE-COFF spec, the LSB of this value marks the object
|
||||
// for "registered SEH". This means that all SEH handler entry points
|
||||
// must be registered in .sxdata. Use of any unregistered handlers will
|
||||
// cause the process to terminate immediately. LLVM does not know how to
|
||||
// register any SEH handlers, so its object files should be safe.
|
||||
S->setAbsolute();
|
||||
OutStreamer.EmitAssignment(
|
||||
S, MCConstantExpr::Create(int64_t(1), MMI->getContext()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user