From: Kevin Enderby Date: Wed, 13 Jan 2016 00:25:36 +0000 (+0000) Subject: For llvm-objdump, add the option -private-header (without the trailing ’s’) X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=f3e6026b5b25b0c6e9a7f7f0df7f4df3dbccc5d9;p=oota-llvm.git For llvm-objdump, add the option -private-header (without the trailing ’s’) to only print the first private header. Which for Mach-O files only prints the Mach header and not the subsequent load commands. Which is used by scripts to match what the darwin otool(1) with the -h flag does without the -l flag. For non-Mach-O files it has the same functionality as -private-headers (with the trailing ’s’). rdar://24158331 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@257548 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/tools/llvm-objdump/X86/macho-private-header.test b/test/tools/llvm-objdump/X86/macho-private-header.test new file mode 100644 index 00000000000..d90072542a2 --- /dev/null +++ b/test/tools/llvm-objdump/X86/macho-private-header.test @@ -0,0 +1,6 @@ +// RUN: llvm-objdump -private-header %p/Inputs/hello.obj.macho-x86_64 | FileCheck %s + +CHECK: Mach header +CHECK: magic cputype cpusubtype caps filetype ncmds sizeofcmds flags +CHECK: MH_MAGIC_64 X86_64 ALL 0x00 OBJECT 3 496 SUBSECTIONS_VIA_SYMBOLS +CHECK-NOT: Load command diff --git a/tools/llvm-objdump/MachODump.cpp b/tools/llvm-objdump/MachODump.cpp index a2f3bc8e8a7..e486b1a0d6d 100644 --- a/tools/llvm-objdump/MachODump.cpp +++ b/tools/llvm-objdump/MachODump.cpp @@ -1196,7 +1196,11 @@ static void ProcessMachO(StringRef Filename, MachOObjectFile *MachOOF, PrintSymbolTable(MachOOF); if (UnwindInfo) printMachOUnwindInfo(MachOOF); - if (PrivateHeaders) + if (PrivateHeaders) { + printMachOFileHeader(MachOOF); + printMachOLoadCommands(MachOOF); + } + if (FirstPrivateHeader) printMachOFileHeader(MachOOF); if (ObjcMetaData) printObjcMetaData(MachOOF, !NonVerbose); @@ -8646,31 +8650,40 @@ static void PrintLoadCommands(const MachOObjectFile *Obj, uint32_t filetype, } } -static void getAndPrintMachHeader(const MachOObjectFile *Obj, - uint32_t &filetype, uint32_t &cputype, - bool verbose) { +static void PrintMachHeader(const MachOObjectFile *Obj, bool verbose) { if (Obj->is64Bit()) { MachO::mach_header_64 H_64; H_64 = Obj->getHeader64(); PrintMachHeader(H_64.magic, H_64.cputype, H_64.cpusubtype, H_64.filetype, H_64.ncmds, H_64.sizeofcmds, H_64.flags, verbose); - filetype = H_64.filetype; - cputype = H_64.cputype; } else { MachO::mach_header H; H = Obj->getHeader(); PrintMachHeader(H.magic, H.cputype, H.cpusubtype, H.filetype, H.ncmds, H.sizeofcmds, H.flags, verbose); - filetype = H.filetype; - cputype = H.cputype; } } void llvm::printMachOFileHeader(const object::ObjectFile *Obj) { + const MachOObjectFile *file = dyn_cast(Obj); + PrintMachHeader(file, !NonVerbose); +} + +void llvm::printMachOLoadCommands(const object::ObjectFile *Obj) { const MachOObjectFile *file = dyn_cast(Obj); uint32_t filetype = 0; uint32_t cputype = 0; - getAndPrintMachHeader(file, filetype, cputype, !NonVerbose); + if (file->is64Bit()) { + MachO::mach_header_64 H_64; + H_64 = file->getHeader64(); + filetype = H_64.filetype; + cputype = H_64.cputype; + } else { + MachO::mach_header H; + H = file->getHeader(); + filetype = H.filetype; + cputype = H.cputype; + } PrintLoadCommands(file, filetype, cputype, !NonVerbose); } diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp index 94022693cc2..d5ae5de4b5a 100644 --- a/tools/llvm-objdump/llvm-objdump.cpp +++ b/tools/llvm-objdump/llvm-objdump.cpp @@ -165,6 +165,11 @@ cl::opt llvm::PrivateHeaders("private-headers", cl::desc("Display format specific file headers")); +cl::opt +llvm::FirstPrivateHeader("private-header", + cl::desc("Display only the first format specific file " + "header")); + static cl::alias PrivateHeadersShort("p", cl::desc("Alias for --private-headers"), cl::aliasopt(PrivateHeaders)); @@ -1495,7 +1500,19 @@ static void printFaultMaps(const ObjectFile *Obj) { outs() << FMP; } -static void printPrivateFileHeader(const ObjectFile *o) { +static void printPrivateFileHeaders(const ObjectFile *o) { + if (o->isELF()) + printELFFileHeader(o); + else if (o->isCOFF()) + printCOFFFileHeader(o); + else if (o->isMachO()) { + printMachOFileHeader(o); + printMachOLoadCommands(o); + } else + report_fatal_error("Invalid/Unsupported object file format"); +} + +static void printFirstPrivateFileHeader(const ObjectFile *o) { if (o->isELF()) printELFFileHeader(o); else if (o->isCOFF()) @@ -1527,7 +1544,9 @@ static void DumpObject(const ObjectFile *o) { if (UnwindInfo) PrintUnwindInfo(o); if (PrivateHeaders) - printPrivateFileHeader(o); + printPrivateFileHeaders(o); + if (FirstPrivateHeader) + printFirstPrivateFileHeader(o); if (ExportsTrie) printExportsTrie(o); if (Rebase) @@ -1618,6 +1637,7 @@ int main(int argc, char **argv) { && !SymbolTable && !UnwindInfo && !PrivateHeaders + && !FirstPrivateHeader && !ExportsTrie && !Rebase && !Bind diff --git a/tools/llvm-objdump/llvm-objdump.h b/tools/llvm-objdump/llvm-objdump.h index 6e8ad6bda15..60cabbc98e2 100644 --- a/tools/llvm-objdump/llvm-objdump.h +++ b/tools/llvm-objdump/llvm-objdump.h @@ -31,6 +31,7 @@ extern cl::opt Disassemble; extern cl::opt DisassembleAll; extern cl::opt NoShowRawInsn; extern cl::opt PrivateHeaders; +extern cl::opt FirstPrivateHeader; extern cl::opt ExportsTrie; extern cl::opt Rebase; extern cl::opt Bind; @@ -70,6 +71,7 @@ void printELFFileHeader(const object::ObjectFile *o); void printCOFFFileHeader(const object::ObjectFile *o); void printCOFFSymbolTable(const object::COFFObjectFile *o); void printMachOFileHeader(const object::ObjectFile *o); +void printMachOLoadCommands(const object::ObjectFile *o); void printExportsTrie(const object::ObjectFile *o); void printRebaseTable(const object::ObjectFile *o); void printBindTable(const object::ObjectFile *o);