aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Semel <semelpaul@gmail.com>2018-07-04 15:25:03 +0000
committerPaul Semel <semelpaul@gmail.com>2018-07-04 15:25:03 +0000
commitd069a21e54f2df02e27cd70cafd27cbf9cfd2bde (patch)
tree7357f7f744b81b1d75fbbf75c52f1cbda5121148
parent4b43817e2b4723a33db3f6059fcac76c0b5d5337 (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.h1
-rw-r--r--include/llvm/Object/ELFObjectFile.h6
-rw-r--r--include/llvm/Object/ObjectFile.h3
-rw-r--r--lib/Object/COFFObjectFile.cpp6
-rw-r--r--test/tools/llvm-objdump/file-headers-coff.test13
-rw-r--r--test/tools/llvm-objdump/file-headers-elf.test14
-rw-r--r--test/tools/llvm-objdump/file-headers-pe.test33
-rw-r--r--test/tools/llvm-objdump/file-headers-unsupported.test3
-rw-r--r--tools/llvm-objdump/llvm-objdump.cpp24
-rw-r--r--tools/llvm-objdump/llvm-objdump.h1
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;