diff options
author | Paul Semel <semelpaul@gmail.com> | 2018-07-04 15:25:03 +0000 |
---|---|---|
committer | Paul Semel <semelpaul@gmail.com> | 2018-07-04 15:25:03 +0000 |
commit | d069a21e54f2df02e27cd70cafd27cbf9cfd2bde (patch) | |
tree | 7357f7f744b81b1d75fbbf75c52f1cbda5121148 | |
parent | 4b43817e2b4723a33db3f6059fcac76c0b5d5337 (diff) |
[llvm-objdump] Add --file-headers (-f) option
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@336284 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Object/COFF.h | 1 | ||||
-rw-r--r-- | include/llvm/Object/ELFObjectFile.h | 6 | ||||
-rw-r--r-- | include/llvm/Object/ObjectFile.h | 3 | ||||
-rw-r--r-- | lib/Object/COFFObjectFile.cpp | 6 | ||||
-rw-r--r-- | test/tools/llvm-objdump/file-headers-coff.test | 13 | ||||
-rw-r--r-- | test/tools/llvm-objdump/file-headers-elf.test | 14 | ||||
-rw-r--r-- | test/tools/llvm-objdump/file-headers-pe.test | 33 | ||||
-rw-r--r-- | test/tools/llvm-objdump/file-headers-unsupported.test | 3 | ||||
-rw-r--r-- | tools/llvm-objdump/llvm-objdump.cpp | 24 | ||||
-rw-r--r-- | tools/llvm-objdump/llvm-objdump.h | 1 |
10 files changed, 104 insertions, 0 deletions
diff --git a/include/llvm/Object/COFF.h b/include/llvm/Object/COFF.h index 2d1e9403dcf..50a73d24c28 100644 --- a/include/llvm/Object/COFF.h +++ b/include/llvm/Object/COFF.h @@ -928,6 +928,7 @@ public: uint8_t getBytesInAddress() const override; StringRef getFileFormatName() const override; Triple::ArchType getArch() const override; + Expected<uint64_t> getStartAddress() const override; SubtargetFeatures getFeatures() const override { return SubtargetFeatures(); } import_directory_iterator import_directory_begin() const; diff --git a/include/llvm/Object/ELFObjectFile.h b/include/llvm/Object/ELFObjectFile.h index 4e9e81a7b9e..9bc365f1b18 100644 --- a/include/llvm/Object/ELFObjectFile.h +++ b/include/llvm/Object/ELFObjectFile.h @@ -373,6 +373,7 @@ public: uint8_t getBytesInAddress() const override; StringRef getFileFormatName() const override; Triple::ArchType getArch() const override; + Expected<uint64_t> getStartAddress() const override; unsigned getPlatformFlags() const override { return EF.getHeader()->e_flags; } @@ -1144,6 +1145,11 @@ template <class ELFT> Triple::ArchType ELFObjectFile<ELFT>::getArch() const { } template <class ELFT> +Expected<uint64_t> ELFObjectFile<ELFT>::getStartAddress() const { + return EF.getHeader()->e_entry; +} + +template <class ELFT> ELFObjectFileBase::elf_symbol_iterator_range ELFObjectFile<ELFT>::getDynamicSymbolIterators() const { return make_range(dynamic_symbol_begin(), dynamic_symbol_end()); diff --git a/include/llvm/Object/ObjectFile.h b/include/llvm/Object/ObjectFile.h index b70328cc121..02d62e8e487 100644 --- a/include/llvm/Object/ObjectFile.h +++ b/include/llvm/Object/ObjectFile.h @@ -287,6 +287,9 @@ public: virtual Triple::ArchType getArch() const = 0; virtual SubtargetFeatures getFeatures() const = 0; virtual void setARMSubArch(Triple &TheTriple) const { } + virtual Expected<uint64_t> getStartAddress() const { + return errorCodeToError(object_error::parse_failed); + }; /// Create a triple from the data in this object file. Triple makeTriple() const; diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index ab4cc60cbc2..e622c17ca3e 100644 --- a/lib/Object/COFFObjectFile.cpp +++ b/lib/Object/COFFObjectFile.cpp @@ -910,6 +910,12 @@ Triple::ArchType COFFObjectFile::getArch() const { } } +Expected<uint64_t> COFFObjectFile::getStartAddress() const { + if (PE32Header) + return PE32Header->AddressOfEntryPoint; + return 0; +} + iterator_range<import_directory_iterator> COFFObjectFile::import_directories() const { return make_range(import_directory_begin(), import_directory_end()); diff --git a/test/tools/llvm-objdump/file-headers-coff.test b/test/tools/llvm-objdump/file-headers-coff.test new file mode 100644 index 00000000000..784b0124a2d --- /dev/null +++ b/test/tools/llvm-objdump/file-headers-coff.test @@ -0,0 +1,13 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-objdump -f %t | FileCheck %s +# RUN: llvm-objdump -file-headers %t | FileCheck %s + +!COFF +header: !Header + Machine: IMAGE_FILE_MACHINE_I386 # (0x14c) + Characteristics: [ IMAGE_FILE_DEBUG_STRIPPED ] +sections: +symbols: + +# CHECK: architecture: i386 +# CHECK: start address: 0x0000 diff --git a/test/tools/llvm-objdump/file-headers-elf.test b/test/tools/llvm-objdump/file-headers-elf.test new file mode 100644 index 00000000000..ade59cf05da --- /dev/null +++ b/test/tools/llvm-objdump/file-headers-elf.test @@ -0,0 +1,14 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-objdump -f %t | FileCheck %s +# RUN: llvm-objdump -file-headers %t | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + Entry: 0x123456 + +# CHECK: architecture: x86_64 +# CHECK: start address: 0x00123456 diff --git a/test/tools/llvm-objdump/file-headers-pe.test b/test/tools/llvm-objdump/file-headers-pe.test new file mode 100644 index 00000000000..1e2fb2c4c3d --- /dev/null +++ b/test/tools/llvm-objdump/file-headers-pe.test @@ -0,0 +1,33 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-objdump -f %t | FileCheck %s +# RUN: llvm-objdump -file-headers %t | FileCheck %s + +!COFF +header: !Header + Machine: IMAGE_FILE_MACHINE_I386 + Characteristics: [ IMAGE_FILE_DEBUG_STRIPPED ] +OptionalHeader: + AddressOfEntryPoint: 0x1234 +# Unfortunately, all these flags are mandatory to set AddressOfEntryPoint. +# All the values are randomly picked. They can't interfere in what +# we are testing here. + SizeOfHeapCommit: 1024 + SizeOfHeapReserve: 1024 + SizeOfStackCommit: 1024 + SizeOfStackReserve: 1024 + DLLCharacteristics: [ IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE ] + Subsystem: IMAGE_SUBSYSTEM_NATIVE + MinorSubsystemVersion: 1 + MajorSubsystemVersion: 1 + MinorImageVersion: 1 + MajorImageVersion: 1 + MinorOperatingSystemVersion: 1 + MajorOperatingSystemVersion: 1 + FileAlignment: 8 + SectionAlignment: 8 + ImageBase: 0x12 +sections: +symbols: + +# CHECK: architecture: i386 +# CHECK: start address: 0x1234 diff --git a/test/tools/llvm-objdump/file-headers-unsupported.test b/test/tools/llvm-objdump/file-headers-unsupported.test new file mode 100644 index 00000000000..f9fc1188420 --- /dev/null +++ b/test/tools/llvm-objdump/file-headers-unsupported.test @@ -0,0 +1,3 @@ +# RUN: not llvm-objdump -file-headers %p/Inputs/trivial.obj.wasm 2>&1 | FileCheck %s + +# CHECK: Invalid/Unsupported object file format diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp index 2598d930417..e639fd94abb 100644 --- a/tools/llvm-objdump/llvm-objdump.cpp +++ b/tools/llvm-objdump/llvm-objdump.cpp @@ -200,6 +200,13 @@ static cl::alias PrivateHeadersShort("p", cl::desc("Alias for --private-headers"), cl::aliasopt(PrivateHeaders)); +cl::opt<bool> llvm::FileHeaders( + "file-headers", + cl::desc("Display the contents of the overall file header")); + +static cl::alias FileHeadersShort("f", cl::desc("Alias for --file-headers"), + cl::aliasopt(FileHeaders)); + cl::opt<bool> llvm::PrintImmHex("print-imm-hex", cl::desc("Use hex format for immediate values")); @@ -2123,6 +2130,20 @@ static void printPrivateFileHeaders(const ObjectFile *o, bool onlyFirst) { report_error(o->getFileName(), "Invalid/Unsupported object file format"); } +static void printFileHeaders(const ObjectFile *o) { + if (!o->isELF() && !o->isCOFF()) + report_error(o->getFileName(), "Invalid/Unsupported object file format"); + + Triple::ArchType AT = o->getArch(); + outs() << "architecture: " << Triple::getArchTypeName(AT) << "\n"; + Expected<uint64_t> StartAddrOrErr = o->getStartAddress(); + if (!StartAddrOrErr) + report_error(o->getFileName(), StartAddrOrErr.takeError()); + outs() << "start address: " + << format("0x%0*x", o->getBytesInAddress(), StartAddrOrErr.get()) + << "\n"; +} + static void DumpObject(ObjectFile *o, const Archive *a = nullptr) { StringRef ArchiveName = a != nullptr ? a->getFileName() : ""; // Avoid other output when using a raw option. @@ -2151,6 +2172,8 @@ static void DumpObject(ObjectFile *o, const Archive *a = nullptr) { PrintUnwindInfo(o); if (PrivateHeaders || FirstPrivateHeader) printPrivateFileHeaders(o, FirstPrivateHeader); + if (FileHeaders) + printFileHeaders(o); if (ExportsTrie) printExportsTrie(o); if (Rebase) @@ -2267,6 +2290,7 @@ int main(int argc, char **argv) { && !SymbolTable && !UnwindInfo && !PrivateHeaders + && !FileHeaders && !FirstPrivateHeader && !ExportsTrie && !Rebase diff --git a/tools/llvm-objdump/llvm-objdump.h b/tools/llvm-objdump/llvm-objdump.h index e8cc83ed42c..27734af2866 100644 --- a/tools/llvm-objdump/llvm-objdump.h +++ b/tools/llvm-objdump/llvm-objdump.h @@ -38,6 +38,7 @@ extern cl::opt<bool> DisassembleAll; extern cl::opt<bool> NoShowRawInsn; extern cl::opt<bool> NoLeadingAddr; extern cl::opt<bool> PrivateHeaders; +extern cl::opt<bool> FileHeaders; extern cl::opt<bool> FirstPrivateHeader; extern cl::opt<bool> ExportsTrie; extern cl::opt<bool> Rebase; |