diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2010-10-05 15:48:37 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2010-10-05 15:48:37 +0000 |
commit | 5c77c16f311d702a315547c0eb32b7a34a9d55c8 (patch) | |
tree | 279a5a76fb901752a67df039f758265a1cf9096e /lib/MC/ELFObjectWriter.cpp | |
parent | 266a69f3753951fb9a928f214d3e654bef5671b5 (diff) |
Produce a undefined reference to _GLOBAL_OFFSET_TABLE_ when needed.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115623 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/ELFObjectWriter.cpp')
-rw-r--r-- | lib/MC/ELFObjectWriter.cpp | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index b9d2acea46..b33b047030 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -70,6 +70,17 @@ static bool isFixupKindX86PCRel(unsigned Kind) { } } +static bool RelocNeedsGOT(unsigned Type) { + switch (Type) { + default: + return false; + case ELF::R_X86_64_GOT32: + case ELF::R_X86_64_PLT32: + case ELF::R_X86_64_GOTPCREL: + return true; + } +} + namespace { class ELFObjectWriterImpl { @@ -133,6 +144,8 @@ namespace { int NumRegularSections; + bool NeedsGOT; + ELFObjectWriter *Writer; raw_ostream &OS; @@ -153,7 +166,7 @@ namespace { public: ELFObjectWriterImpl(ELFObjectWriter *_Writer, bool _Is64Bit, bool _HasRelAddend, Triple::OSType _OSType) - : Writer(_Writer), OS(Writer->getStream()), + : NeedsGOT(false), Writer(_Writer), OS(Writer->getStream()), Is64Bit(_Is64Bit), HasRelocationAddend(_HasRelAddend), OSType(_OSType) { } @@ -647,6 +660,9 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm, } } + if (RelocNeedsGOT(Type)) + NeedsGOT = true; + ELFRelocationEntry ERE; ERE.Index = Index; @@ -677,6 +693,14 @@ ELFObjectWriterImpl::getSymbolIndexInSymbolTable(const MCAssembler &Asm, } void ELFObjectWriterImpl::ComputeSymbolTable(MCAssembler &Asm) { + // FIXME: Is this the correct place to do this? + if (NeedsGOT) { + llvm::StringRef Name = "_GLOBAL_OFFSET_TABLE_"; + MCSymbol *Sym = Asm.getContext().GetOrCreateSymbol(Name); + MCSymbolData &Data = Asm.getOrCreateSymbolData(*Sym); + Data.setExternal(true); + } + // Build section lookup table. NumRegularSections = Asm.size(); DenseMap<const MCSection*, uint8_t> SectionIndexMap; |