diff options
author | Reid Kleckner <rnk@google.com> | 2016-06-16 16:21:41 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2016-06-16 16:21:41 +0000 |
commit | 0166a713863134a16f0983a540eab070390b33e9 (patch) | |
tree | 77fd329355cb539ee829cbfb3845ee035d61cdbe /llvm/lib/ExecutionEngine/RuntimeDyld/Targets | |
parent | c9fee5fee6984d5f692c5920fbccd920cc9d4496 (diff) | |
download | bcm5719-llvm-0166a713863134a16f0983a540eab070390b33e9.tar.gz bcm5719-llvm-0166a713863134a16f0983a540eab070390b33e9.zip |
[PATCH] Fix RuntimeDyldCOFFI386 to handle relocations with a non-zero addend
This fixes IMAGE_REL_I386_DIR32, IMAGE_REL_I386_DIR32NB,
IMAGE_REL_I386_SECREL, and IMAGE_REL_I386_REL32 relocations.
Based on patch by Jon Turney <jon.turney@dronecode.org.uk>
llvm-svn: 272911
Diffstat (limited to 'llvm/lib/ExecutionEngine/RuntimeDyld/Targets')
-rw-r--r-- | llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFI386.h | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFI386.h b/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFI386.h index 468ce111486..92fbb7c67d0 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFI386.h +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFI386.h @@ -58,13 +58,31 @@ public: uint64_t RelType = RelI->getType(); uint64_t Offset = RelI->getOffset(); + // Determine the Addend used to adjust the relocation value. + uint64_t Addend = 0; + SectionEntry &AddendSection = Sections[SectionID]; + uintptr_t ObjTarget = AddendSection.getObjAddress() + Offset; + uint8_t *Displacement = (uint8_t *)ObjTarget; + + switch (RelType) { + case COFF::IMAGE_REL_I386_DIR32: + case COFF::IMAGE_REL_I386_DIR32NB: + case COFF::IMAGE_REL_I386_SECREL: + case COFF::IMAGE_REL_I386_REL32: { + Addend = readBytesUnaligned(Displacement, 4); + break; + } + default: + break; + } + #if !defined(NDEBUG) SmallString<32> RelTypeName; RelI->getTypeName(RelTypeName); #endif DEBUG(dbgs() << "\t\tIn Section " << SectionID << " Offset " << Offset << " RelType: " << RelTypeName << " TargetName: " << TargetName - << "\n"); + << " Addend " << Addend << "\n"); unsigned TargetSectionID = -1; if (Section == Obj.section_end()) { @@ -85,7 +103,7 @@ public: case COFF::IMAGE_REL_I386_DIR32NB: case COFF::IMAGE_REL_I386_REL32: { RelocationEntry RE = - RelocationEntry(SectionID, Offset, RelType, 0, TargetSectionID, + RelocationEntry(SectionID, Offset, RelType, Addend, TargetSectionID, getSymbolOffset(*Symbol), 0, 0, false, 0); addRelocationForSection(RE, TargetSectionID); break; @@ -98,7 +116,7 @@ public: } case COFF::IMAGE_REL_I386_SECREL: { RelocationEntry RE = RelocationEntry(SectionID, Offset, RelType, - getSymbolOffset(*Symbol)); + getSymbolOffset(*Symbol) + Addend); addRelocationForSection(RE, TargetSectionID); break; } |