[llvm-objdump] Add --file-headers (-f) option

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@336284 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Paul Semel
2018-07-04 15:25:03 +00:00
parent 4b43817e2b
commit d069a21e54
10 changed files with 104 additions and 0 deletions
+1
View File
@@ -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;
+6
View File
@@ -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; }
@@ -1143,6 +1144,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 {
+3
View File
@@ -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;
+6
View File
@@ -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());
@@ -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
@@ -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
@@ -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
@@ -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
+24
View File
@@ -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
+1
View File
@@ -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;