mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
COFF: Teach llvm-objdump how to dump DLL forwarder symbols.
llvm-svn: 257539
This commit is contained in:
parent
278b1bc727
commit
ed7e9e65ed
@ -858,6 +858,9 @@ public:
|
||||
std::error_code getExportRVA(uint32_t &Result) const;
|
||||
std::error_code getSymbolName(StringRef &Result) const;
|
||||
|
||||
std::error_code isForwarder(bool &Result) const;
|
||||
std::error_code getForwardTo(StringRef &Result) const;
|
||||
|
||||
private:
|
||||
const export_directory_table_entry *ExportTable;
|
||||
uint32_t Index;
|
||||
|
@ -1336,6 +1336,30 @@ ExportDirectoryEntryRef::getSymbolName(StringRef &Result) const {
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
std::error_code ExportDirectoryEntryRef::isForwarder(bool &Result) const {
|
||||
const data_directory *DataEntry;
|
||||
if (auto EC = OwningObject->getDataDirectory(COFF::EXPORT_TABLE, DataEntry))
|
||||
return EC;
|
||||
uint32_t RVA;
|
||||
if (auto EC = getExportRVA(RVA))
|
||||
return EC;
|
||||
uint32_t Begin = DataEntry->RelativeVirtualAddress;
|
||||
uint32_t End = DataEntry->RelativeVirtualAddress + DataEntry->Size;
|
||||
Result = (Begin <= RVA && RVA < End);
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
std::error_code ExportDirectoryEntryRef::getForwardTo(StringRef &Result) const {
|
||||
uint32_t RVA;
|
||||
if (auto EC = getExportRVA(RVA))
|
||||
return EC;
|
||||
uintptr_t IntPtr = 0;
|
||||
if (auto EC = OwningObject->getRvaPtr(RVA, IntPtr))
|
||||
return EC;
|
||||
Result = StringRef(reinterpret_cast<const char *>(IntPtr));
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
bool ImportedSymbolRef::
|
||||
operator==(const ImportedSymbolRef &Other) const {
|
||||
return Entry32 == Other.Entry32 && Entry64 == Other.Entry64
|
||||
|
@ -358,13 +358,30 @@ static void printExportTable(const COFFObjectFile *Obj) {
|
||||
uint32_t RVA;
|
||||
if (I->getExportRVA(RVA))
|
||||
return;
|
||||
outs() << format(" % 4d %# 8x", Ordinal, RVA);
|
||||
bool IsForwarder;
|
||||
if (I->isForwarder(IsForwarder))
|
||||
return;
|
||||
|
||||
if (IsForwarder) {
|
||||
// Export table entries can be used to re-export symbols that
|
||||
// this COFF file is imported from some DLLs. This is rare.
|
||||
// In most cases IsForwarder is false.
|
||||
outs() << format(" % 4d ", Ordinal);
|
||||
} else {
|
||||
outs() << format(" % 4d %# 8x", Ordinal, RVA);
|
||||
}
|
||||
|
||||
StringRef Name;
|
||||
if (I->getSymbolName(Name))
|
||||
continue;
|
||||
if (!Name.empty())
|
||||
outs() << " " << Name;
|
||||
if (IsForwarder) {
|
||||
StringRef S;
|
||||
if (I->getForwardTo(S))
|
||||
return;
|
||||
outs() << " (forwarded to " << S << ")";
|
||||
}
|
||||
outs() << "\n";
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user