From 5c77c16f311d702a315547c0eb32b7a34a9d55c8 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 5 Oct 2010 15:48:37 +0000 Subject: [PATCH] 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 --- lib/MC/ELFObjectWriter.cpp | 26 +++++++++++++++++++++++++- test/MC/ELF/got.s | 6 +++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index b9d2acea461..b33b0470308 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 SectionIndexMap; diff --git a/test/MC/ELF/got.s b/test/MC/ELF/got.s index 47b0285a99d..866d25b8e05 100644 --- a/test/MC/ELF/got.s +++ b/test/MC/ELF/got.s @@ -1,10 +1,14 @@ // RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump | FileCheck %s -// Test that this produces a R_X86_64_GOT32. +// Test that this produces a R_X86_64_GOT32 and that we have an undefined +// reference to _GLOBAL_OFFSET_TABLE_. movl foo@GOT, %eax movl foo@GOTPCREL(%rip), %eax +// CHECK: (('st_name', 5) # '_GLOBAL_OFFSET_TABLE_' +// CHECK-NEXT: ('st_bind', 1) + // CHECK: ('_relocations', [ // CHECK-NEXT: # Relocation 0 // CHECK-NEXT: (('r_offset', -- 2.11.0