diff options
author | Lang Hames <lhames@gmail.com> | 2015-04-22 21:38:37 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2015-04-22 21:38:37 +0000 |
commit | 14660f8f217a93401a7ea768357510904264bb74 (patch) | |
tree | e7f9682c08ec3644ec8d29c25d3950449dab6d02 | |
parent | bbe056c9bc6d21e3f684e43d13dd3fc817fd798c (diff) |
[RuntimeDyld][COFF] Add external symbol resolution support to RuntimeDyldCOFF.
Patch by Andy Ayers. Thanks Andy!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235554 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFX86_64.h | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFX86_64.h b/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFX86_64.h index cd534a1254..478665ea3d 100644 --- a/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFX86_64.h +++ b/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFX86_64.h @@ -114,23 +114,15 @@ public: const ObjectFile &Obj, ObjSectionToIDMap &ObjSectionToID, StubMap &Stubs) override { - // Find the symbol referred to in the relocation, and - // get its section and offset. - // - // Insist for now that all symbols be resolvable within - // the scope of this object file. + // If possible, find the symbol referred to in the relocation, + // and the section that contains it. symbol_iterator Symbol = RelI->getSymbol(); if (Symbol == Obj.symbol_end()) report_fatal_error("Unknown symbol in relocation"); - unsigned TargetSectionID = 0; - uint64_t TargetOffset = UnknownAddressOrSize; section_iterator SecI(Obj.section_end()); Symbol->getSection(SecI); - if (SecI == Obj.section_end()) - report_fatal_error("Unknown section in relocation"); - bool IsCode = SecI->isText(); - TargetSectionID = findOrEmitSection(Obj, *SecI, IsCode, ObjSectionToID); - TargetOffset = getSymbolOffset(*Symbol); + // If there is no section, this must be an external reference. + const bool IsExtern = SecI == Obj.section_end(); // Determine the Addend used to adjust the relocation value. uint64_t RelType; @@ -167,12 +159,22 @@ public: StringRef TargetName; Symbol->getName(TargetName); + DEBUG(dbgs() << "\t\tIn Section " << SectionID << " Offset " << Offset << " RelType: " << RelType << " TargetName: " << TargetName << " Addend " << Addend << "\n"); - RelocationEntry RE(SectionID, Offset, RelType, TargetOffset + Addend); - addRelocationForSection(RE, TargetSectionID); + if (IsExtern) { + RelocationEntry RE(SectionID, Offset, RelType, Addend); + addRelocationForSymbol(RE, TargetName); + } else { + bool IsCode = SecI->isText(); + unsigned TargetSectionID = + findOrEmitSection(Obj, *SecI, IsCode, ObjSectionToID); + uint64_t TargetOffset = getSymbolOffset(*Symbol); + RelocationEntry RE(SectionID, Offset, RelType, TargetOffset + Addend); + addRelocationForSection(RE, TargetSectionID); + } return ++RelI; } |