1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +02:00

[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 <rdar://problem/16961886>.
 

llvm-svn: 209154
This commit is contained in:
Lang Hames 2014-05-19 19:21:25 +00:00
parent 4b745d2c7c
commit 73ecaff551
3 changed files with 8 additions and 2 deletions

View File

@ -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) {

View File

@ -1 +1,2 @@
RUN: llvm-rtdyld -printline %p/Inputs/arm_secdiff_reloc.o
RUN: llvm-rtdyld %p/Inputs/x86_64_macho_pic_globals_GOT.o