mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 23:23:38 -04:00
[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:
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user