diff options
Diffstat (limited to 'lib/Target/X86/X86TargetObjectFile.cpp')
-rw-r--r-- | lib/Target/X86/X86TargetObjectFile.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/lib/Target/X86/X86TargetObjectFile.cpp b/lib/Target/X86/X86TargetObjectFile.cpp index 871dacd6a1..3347449cb7 100644 --- a/lib/Target/X86/X86TargetObjectFile.cpp +++ b/lib/Target/X86/X86TargetObjectFile.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "X86TargetObjectFile.h" +#include "X86Subtarget.h" // @LOCALMOD #include "llvm/MC/MCContext.h" #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCSectionELF.h" @@ -47,3 +48,30 @@ X86LinuxTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM) { TargetLoweringObjectFileELF::Initialize(Ctx, TM); InitializeELF(TM.Options.UseInitArray); } + +// @LOCALMOD-START +// NOTE: this was largely lifted from +// lib/Target/ARM/ARMTargetObjectFile.cpp +// +// The default is .ctors/.dtors while the arm backend uses +// .init_array/.fini_array +// +// Without this the linker defined symbols __fini_array_start and +// __fini_array_end do not have useful values. c.f.: +// http://code.google.com/p/nativeclient/issues/detail?id=805 +void TargetLoweringObjectFileNaCl::Initialize(MCContext &Ctx, + const TargetMachine &TM) { + TargetLoweringObjectFileELF::Initialize(Ctx, TM); + + StaticCtorSection = + getContext().getELFSection(".init_array", ELF::SHT_INIT_ARRAY, + ELF::SHF_WRITE | + ELF::SHF_ALLOC, + SectionKind::getDataRel()); + StaticDtorSection = + getContext().getELFSection(".fini_array", ELF::SHT_FINI_ARRAY, + ELF::SHF_WRITE | + ELF::SHF_ALLOC, + SectionKind::getDataRel()); +} +// @LOCALMOD-END |