mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00: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>. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209154 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8ad418b61b
commit
b96f71fed6
@ -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) {
|
||||
|
Binary file not shown.
@ -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
|
Loading…
Reference in New Issue
Block a user