From 1fcbc0850068faa55c6712dee4eb2d581cb452d4 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Mon, 19 May 2014 19:21:25 +0000 Subject: [RuntimeDyld] Fix x86-64 MachO GOT relocation handling. For GOT relocations the addend should modify the offset to the GOT entry, not the value of the entry itself. Teach RuntimeDyldMachO to do The Right Thing here. Fixes . llvm-svn: 209154 --- llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp | 9 +++++++-- .../RuntimeDyld/Inputs/x86_64_macho_pic_globals_GOT.o | Bin 0 -> 704 bytes .../ExecutionEngine/RuntimeDyld/arm_secdiff_reloc.test | 1 - .../ExecutionEngine/RuntimeDyld/macho_relocations.test | 2 ++ 4 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 llvm/test/ExecutionEngine/RuntimeDyld/Inputs/x86_64_macho_pic_globals_GOT.o delete mode 100644 llvm/test/ExecutionEngine/RuntimeDyld/arm_secdiff_reloc.test create mode 100644 llvm/test/ExecutionEngine/RuntimeDyld/macho_relocations.test (limited to 'llvm') diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp index 66456a990b7..30529808d0d 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp @@ -573,6 +573,10 @@ relocation_iterator RuntimeDyldMachO::processRelocationRef( RelType == MachO::X86_64_RELOC_GOT_LOAD)) { assert(IsPCRel); assert(Size == 2); + + // FIXME: Teach the generic code above not to prematurely conflate + // relocation addends and symbol offsets. + Value.Addend -= Addend; StubMap::const_iterator i = Stubs.find(Value); uint8_t *Addr; if (i != Stubs.end()) { @@ -581,7 +585,8 @@ relocation_iterator RuntimeDyldMachO::processRelocationRef( Stubs[Value] = Section.StubOffset; uint8_t *GOTEntry = Section.Address + Section.StubOffset; RelocationEntry GOTRE(SectionID, Section.StubOffset, - MachO::X86_64_RELOC_UNSIGNED, 0, false, 3); + MachO::X86_64_RELOC_UNSIGNED, Value.Addend, false, + 3); if (Value.SymbolName) addRelocationForSymbol(GOTRE, Value.SymbolName); else @@ -590,7 +595,7 @@ relocation_iterator RuntimeDyldMachO::processRelocationRef( Addr = GOTEntry; } RelocationEntry TargetRE(SectionID, Offset, - MachO::X86_64_RELOC_UNSIGNED, Value.Addend, true, + MachO::X86_64_RELOC_UNSIGNED, Addend, true, 2); resolveRelocation(TargetRE, (uint64_t)Addr); } else if (Arch == Triple::arm && (RelType & 0xf) == MachO::ARM_RELOC_BR24) { diff --git a/llvm/test/ExecutionEngine/RuntimeDyld/Inputs/x86_64_macho_pic_globals_GOT.o b/llvm/test/ExecutionEngine/RuntimeDyld/Inputs/x86_64_macho_pic_globals_GOT.o new file mode 100644 index 00000000000..2013a0e81de Binary files /dev/null and b/llvm/test/ExecutionEngine/RuntimeDyld/Inputs/x86_64_macho_pic_globals_GOT.o differ diff --git a/llvm/test/ExecutionEngine/RuntimeDyld/arm_secdiff_reloc.test b/llvm/test/ExecutionEngine/RuntimeDyld/arm_secdiff_reloc.test deleted file mode 100644 index 92e4dd793cc..00000000000 --- a/llvm/test/ExecutionEngine/RuntimeDyld/arm_secdiff_reloc.test +++ /dev/null @@ -1 +0,0 @@ -RUN: llvm-rtdyld -printline %p/Inputs/arm_secdiff_reloc.o diff --git a/llvm/test/ExecutionEngine/RuntimeDyld/macho_relocations.test b/llvm/test/ExecutionEngine/RuntimeDyld/macho_relocations.test new file mode 100644 index 00000000000..d3407352ce7 --- /dev/null +++ b/llvm/test/ExecutionEngine/RuntimeDyld/macho_relocations.test @@ -0,0 +1,2 @@ +RUN: llvm-rtdyld -printline %p/Inputs/arm_secdiff_reloc.o +RUN: llvm-rtdyld %p/Inputs/x86_64_macho_pic_globals_GOT.o -- cgit v1.2.3