1
0
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:
Rui Ueyama 2016-01-12 23:28:42 +00:00
parent 278b1bc727
commit ed7e9e65ed
3 changed files with 45 additions and 1 deletions

View File

@ -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;

View File

@ -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

View File

@ -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";
}
}