mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
[RuntimeDyld][COFF] Add external symbol resolution support to RuntimeDyldCOFF.
Patch by Andy Ayers. Thanks Andy! llvm-svn: 235554
This commit is contained in:
parent
77fd8a054e
commit
22a89eb5d6
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user