From 14660f8f217a93401a7ea768357510904264bb74 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Wed, 22 Apr 2015 21:38:37 +0000 Subject: [PATCH] [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 --- .../Targets/RuntimeDyldCOFFX86_64.h | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFX86_64.h b/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFX86_64.h index cd534a12549..478665ea3d0 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; } -- 2.34.1