aboutsummaryrefslogtreecommitdiff
path: root/lib/MC/ELFObjectWriter.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2010-10-05 15:48:37 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2010-10-05 15:48:37 +0000
commit5c77c16f311d702a315547c0eb32b7a34a9d55c8 (patch)
tree279a5a76fb901752a67df039f758265a1cf9096e /lib/MC/ELFObjectWriter.cpp
parent266a69f3753951fb9a928f214d3e654bef5671b5 (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.cpp26
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;