diff options
Diffstat (limited to 'tools/llvm-objdump/COFFDump.cpp')
-rw-r--r-- | tools/llvm-objdump/COFFDump.cpp | 102 |
1 files changed, 83 insertions, 19 deletions
diff --git a/tools/llvm-objdump/COFFDump.cpp b/tools/llvm-objdump/COFFDump.cpp index 5d21b3320e748..3ec6a1f73750e 100644 --- a/tools/llvm-objdump/COFFDump.cpp +++ b/tools/llvm-objdump/COFFDump.cpp @@ -161,13 +161,13 @@ static std::error_code resolveSectionAndAddress(const COFFObjectFile *Obj, const SymbolRef &Sym, const coff_section *&ResolvedSection, uint64_t &ResolvedAddr) { - ErrorOr<uint64_t> ResolvedAddrOrErr = Sym.getAddress(); - if (std::error_code EC = ResolvedAddrOrErr.getError()) - return EC; + Expected<uint64_t> ResolvedAddrOrErr = Sym.getAddress(); + if (!ResolvedAddrOrErr) + return errorToErrorCode(ResolvedAddrOrErr.takeError()); ResolvedAddr = *ResolvedAddrOrErr; - ErrorOr<section_iterator> Iter = Sym.getSection(); - if (std::error_code EC = Iter.getError()) - return EC; + Expected<section_iterator> Iter = Sym.getSection(); + if (!Iter) + return errorToErrorCode(Iter.takeError()); ResolvedSection = Obj->getCOFFSection(**Iter); return std::error_code(); } @@ -215,9 +215,9 @@ static std::error_code resolveSymbolName(const std::vector<RelocationRef> &Rels, SymbolRef Sym; if (std::error_code EC = resolveSymbol(Rels, Offset, Sym)) return EC; - ErrorOr<StringRef> NameOrErr = Sym.getName(); - if (std::error_code EC = NameOrErr.getError()) - return EC; + Expected<StringRef> NameOrErr = Sym.getName(); + if (!NameOrErr) + return errorToErrorCode(NameOrErr.takeError()); Name = *NameOrErr; return std::error_code(); } @@ -252,6 +252,56 @@ printSEHTable(const COFFObjectFile *Obj, uint32_t TableVA, int Count) { outs() << "\n\n"; } +template <typename T> +static void printTLSDirectoryT(const coff_tls_directory<T> *TLSDir) { + size_t FormatWidth = sizeof(T) * 2; + outs() << "TLS directory:" + << "\n StartAddressOfRawData: " + << format_hex(TLSDir->StartAddressOfRawData, FormatWidth) + << "\n EndAddressOfRawData: " + << format_hex(TLSDir->EndAddressOfRawData, FormatWidth) + << "\n AddressOfIndex: " + << format_hex(TLSDir->AddressOfIndex, FormatWidth) + << "\n AddressOfCallBacks: " + << format_hex(TLSDir->AddressOfCallBacks, FormatWidth) + << "\n SizeOfZeroFill: " + << TLSDir->SizeOfZeroFill + << "\n Characteristics: " + << TLSDir->Characteristics + << "\n Alignment: " + << TLSDir->getAlignment() + << "\n\n"; +} + +static void printTLSDirectory(const COFFObjectFile *Obj) { + const pe32_header *PE32Header; + error(Obj->getPE32Header(PE32Header)); + + const pe32plus_header *PE32PlusHeader; + error(Obj->getPE32PlusHeader(PE32PlusHeader)); + + // Skip if it's not executable. + if (!PE32Header && !PE32PlusHeader) + return; + + const data_directory *DataDir; + error(Obj->getDataDirectory(COFF::TLS_TABLE, DataDir)); + uintptr_t IntPtr = 0; + if (DataDir->RelativeVirtualAddress == 0) + return; + error(Obj->getRvaPtr(DataDir->RelativeVirtualAddress, IntPtr)); + + if (PE32Header) { + auto *TLSDir = reinterpret_cast<const coff_tls_directory32 *>(IntPtr); + printTLSDirectoryT(TLSDir); + } else { + auto *TLSDir = reinterpret_cast<const coff_tls_directory64 *>(IntPtr); + printTLSDirectoryT(TLSDir); + } + + outs() << "\n"; +} + static void printLoadConfiguration(const COFFObjectFile *Obj) { // Skip if it's not executable. const pe32_header *PE32Header; @@ -302,11 +352,11 @@ static void printImportTables(const COFFObjectFile *Obj) { if (I == E) return; outs() << "The Import Tables:\n"; - for (; I != E; I = ++I) { + for (const ImportDirectoryEntryRef &DirRef : Obj->import_directories()) { const import_directory_table_entry *Dir; StringRef Name; - if (I->getImportTableEntry(Dir)) return; - if (I->getName(Name)) return; + if (DirRef.getImportTableEntry(Dir)) return; + if (DirRef.getName(Name)) return; outs() << format(" lookup %08x time %08x fwd %08x name %08x addr %08x\n\n", static_cast<uint32_t>(Dir->ImportLookupTableRVA), @@ -316,17 +366,23 @@ static void printImportTables(const COFFObjectFile *Obj) { static_cast<uint32_t>(Dir->ImportAddressTableRVA)); outs() << " DLL Name: " << Name << "\n"; outs() << " Hint/Ord Name\n"; - const import_lookup_table_entry32 *entry; - if (I->getImportLookupEntry(entry)) - return; - for (; entry->Data; ++entry) { - if (entry->isOrdinal()) { - outs() << format(" % 6d\n", entry->getOrdinal()); + for (const ImportedSymbolRef &Entry : DirRef.imported_symbols()) { + bool IsOrdinal; + if (Entry.isOrdinal(IsOrdinal)) + return; + if (IsOrdinal) { + uint16_t Ordinal; + if (Entry.getOrdinal(Ordinal)) + return; + outs() << format(" % 6d\n", Ordinal); continue; } + uint32_t HintNameRVA; + if (Entry.getHintNameRVA(HintNameRVA)) + return; uint16_t Hint; StringRef Name; - if (Obj->getHintName(entry->getHintNameRVA(), Hint, Name)) + if (Obj->getHintName(HintNameRVA, Hint, Name)) return; outs() << format(" % 6d ", Hint) << Name << "\n"; } @@ -555,6 +611,7 @@ void llvm::printCOFFUnwindInfo(const COFFObjectFile *Obj) { void llvm::printCOFFFileHeader(const object::ObjectFile *Obj) { const COFFObjectFile *file = dyn_cast<const COFFObjectFile>(Obj); + printTLSDirectory(file); printLoadConfiguration(file); printImportTables(file); printExportTable(file); @@ -602,6 +659,13 @@ void llvm::printCOFFSymbolTable(const COFFObjectFile *coff) { SI = SI + Symbol->getNumberOfAuxSymbols(); break; + } else if (Symbol->isWeakExternal()) { + const coff_aux_weak_external *awe; + error(coff->getAuxSymbol<coff_aux_weak_external>(SI + 1, awe)); + + outs() << "AUX " << format("indx %d srch %d\n", + static_cast<uint32_t>(awe->TagIndex), + static_cast<uint32_t>(awe->Characteristics)); } else { outs() << "AUX Unknown\n"; } |