forked from OSchip/llvm-project
[RuntimeDyld] Fix ppc64 stub relocations on little-endian
When RuntimeDyldELF creates stub functions, it needs to install relocations that will resolve to the final address of the target routine. Since those are 16-bit relocs, they need to be applied to the least-significant halfword of the instruction. On big-endian ppc64, this means that addresses have to be adjusted by 2, which is what the code currently does. However, on a little-endian system, the address must *not* be adjusted; the least-significant halfword is the first one. This patch updates the RuntimeDyldELF code to take the target byte order into account. llvm-svn: 211384
This commit is contained in:
parent
4eff6cdd2e
commit
32626014a6
|
@ -1205,14 +1205,20 @@ relocation_iterator RuntimeDyldELF::processRelocationRef(
|
|||
ELF::R_PPC64_ADDR64, Value.Addend);
|
||||
|
||||
// Generates the 64-bits address loads as exemplified in section
|
||||
// 4.5.1 in PPC64 ELF ABI.
|
||||
RelocationEntry REhst(SectionID, StubTargetAddr - Section.Address + 2,
|
||||
// 4.5.1 in PPC64 ELF ABI. Note that the relocations need to
|
||||
// apply to the low part of the instructions, so we have to update
|
||||
// the offset according to the target endianness.
|
||||
uint64_t StubRelocOffset = StubTargetAddr - Section.Address;
|
||||
if (!IsTargetLittleEndian)
|
||||
StubRelocOffset += 2;
|
||||
|
||||
RelocationEntry REhst(SectionID, StubRelocOffset + 0,
|
||||
ELF::R_PPC64_ADDR16_HIGHEST, Value.Addend);
|
||||
RelocationEntry REhr(SectionID, StubTargetAddr - Section.Address + 6,
|
||||
RelocationEntry REhr(SectionID, StubRelocOffset + 4,
|
||||
ELF::R_PPC64_ADDR16_HIGHER, Value.Addend);
|
||||
RelocationEntry REh(SectionID, StubTargetAddr - Section.Address + 14,
|
||||
RelocationEntry REh(SectionID, StubRelocOffset + 12,
|
||||
ELF::R_PPC64_ADDR16_HI, Value.Addend);
|
||||
RelocationEntry REl(SectionID, StubTargetAddr - Section.Address + 18,
|
||||
RelocationEntry REl(SectionID, StubRelocOffset + 16,
|
||||
ELF::R_PPC64_ADDR16_LO, Value.Addend);
|
||||
|
||||
if (Value.SymbolName) {
|
||||
|
|
Loading…
Reference in New Issue