[llvm-commits] [llvm] r171649 - in /llvm/trunk: test/Object/Inputs/program-headers.elf-i386 test/Object/objdump-private-headers.test tools/llvm-objdump/CMakeLists.txt tools/llvm-objdump/ELFDump.cpp tools/llvm-objdump/llvm-objdump.cpp tools/llvm-objdump/llvm-objdump.h

Michael J. Spencer bigcheesegs at gmail.com
Sat Jan 5 19:56:50 PST 2013


Author: mspencer
Date: Sat Jan  5 21:56:49 2013
New Revision: 171649

URL: http://llvm.org/viewvc/llvm-project?rev=171649&view=rev
Log:
[objdump] Add --private-headers, -p.

This currently prints the ELF program headers.

Added:
    llvm/trunk/test/Object/Inputs/program-headers.elf-i386
    llvm/trunk/test/Object/objdump-private-headers.test
    llvm/trunk/tools/llvm-objdump/ELFDump.cpp
Modified:
    llvm/trunk/tools/llvm-objdump/CMakeLists.txt
    llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
    llvm/trunk/tools/llvm-objdump/llvm-objdump.h

Added: llvm/trunk/test/Object/Inputs/program-headers.elf-i386
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/program-headers.elf-i386?rev=171649&view=auto
==============================================================================
Binary files llvm/trunk/test/Object/Inputs/program-headers.elf-i386 (added) and llvm/trunk/test/Object/Inputs/program-headers.elf-i386 Sat Jan  5 21:56:49 2013 differ

Added: llvm/trunk/test/Object/objdump-private-headers.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/objdump-private-headers.test?rev=171649&view=auto
==============================================================================
--- llvm/trunk/test/Object/objdump-private-headers.test (added)
+++ llvm/trunk/test/Object/objdump-private-headers.test Sat Jan  5 21:56:49 2013
@@ -0,0 +1,8 @@
+RUN: llvm-objdump -p %p/Inputs/program-headers.elf-i386 \
+RUN:              | FileCheck %s -check-prefix ELF-i386
+
+ELF-i386: Program Header:
+ELF-i386:     LOAD off    0x00000000 vaddr 0x08048000 paddr 0x08048000 align 2**12
+ELF-i386:          filesz 0x00000134 memsz 0x00000134 flags r-x
+ELF-i386:    STACK off    0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**2
+ELF-i386:          filesz 0x00000000 memsz 0x00000000 flags rw-

Modified: llvm/trunk/tools/llvm-objdump/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/CMakeLists.txt?rev=171649&r1=171648&r2=171649&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objdump/CMakeLists.txt (original)
+++ llvm/trunk/tools/llvm-objdump/CMakeLists.txt Sat Jan  5 21:56:49 2013
@@ -10,6 +10,7 @@
 add_llvm_tool(llvm-objdump
   llvm-objdump.cpp
   COFFDump.cpp
+  ELFDump.cpp
   MachODump.cpp
   MCFunction.cpp
   )

Added: llvm/trunk/tools/llvm-objdump/ELFDump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/ELFDump.cpp?rev=171649&view=auto
==============================================================================
--- llvm/trunk/tools/llvm-objdump/ELFDump.cpp (added)
+++ llvm/trunk/tools/llvm-objdump/ELFDump.cpp Sat Jan  5 21:56:49 2013
@@ -0,0 +1,87 @@
+//===-- ELFDump.cpp - ELF-specific dumper -----------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// \brief This file implements the ELF-specific dumper for llvm-objdump.
+///
+//===----------------------------------------------------------------------===//
+
+#include "llvm-objdump.h"
+
+#include "llvm/Object/ELF.h"
+#include "llvm/Support/Format.h"
+#include "llvm/Support/MathExtras.h"
+#include "llvm/Support/raw_ostream.h"
+
+using namespace llvm;
+using namespace llvm::object;
+
+template<endianness target_endianness, std::size_t max_alignment, bool is64Bits>
+void printProgramHeaders(
+    const ELFObjectFile<target_endianness, max_alignment, is64Bits> *o) {
+  typedef ELFObjectFile<target_endianness, max_alignment, is64Bits> ELFO;
+  outs() << "Program Header:\n";
+  for (typename ELFO::Elf_Phdr_Iter pi = o->begin_program_headers(),
+                                    pe = o->end_program_headers();
+                                    pi != pe; ++pi) {
+    switch (pi->p_type) {
+    case ELF::PT_LOAD:
+      outs() << "    LOAD ";
+      break;
+    case ELF::PT_GNU_STACK:
+      outs() << "   STACK ";
+      break;
+    case ELF::PT_GNU_EH_FRAME:
+      outs() << "EH_FRAME ";
+      break;
+    default:
+      outs() << " UNKNOWN ";
+    }
+
+    outs() << "off    "
+           << format(is64Bits ? "0x%016x " : "0x%08x ", pi->p_offset)
+           << "vaddr "
+           << format(is64Bits ? "0x%016x " : "0x%08x ", pi->p_vaddr)
+           << "paddr "
+           << format(is64Bits ? "0x%016x " : "0x%08x ", pi->p_paddr)
+           << format("align 2**%d\n", CountTrailingZeros_32(pi->p_align))
+           << "         filesz "
+           << format(is64Bits ? "0x%016x " : "0x%08x ", pi->p_filesz)
+           << "memsz "
+           << format(is64Bits ? "0x%016x " : "0x%08x ", pi->p_memsz)
+           << "flags "
+           << ((pi->p_flags & ELF::PF_R) ? "r" : "-")
+           << ((pi->p_flags & ELF::PF_W) ? "w" : "-")
+           << ((pi->p_flags & ELF::PF_X) ? "x" : "-")
+           << "\n";
+  }
+  outs() << "\n";
+}
+
+void llvm::printELFFileHeader(const object::ObjectFile *Obj) {
+  // Little-endian 32-bit
+  if (const ELFObjectFile<support::little, 4, false> *ELFObj =
+          dyn_cast<ELFObjectFile<support::little, 4, false> >(Obj))
+    printProgramHeaders(ELFObj);
+
+  // Big-endian 32-bit
+  if (const ELFObjectFile<support::big, 4, false> *ELFObj =
+          dyn_cast<ELFObjectFile<support::big, 4, false> >(Obj))
+    printProgramHeaders(ELFObj);
+
+  // Little-endian 64-bit
+  if (const ELFObjectFile<support::little, 8, true> *ELFObj =
+          dyn_cast<ELFObjectFile<support::little, 8, true> >(Obj))
+    printProgramHeaders(ELFObj);
+
+  // Big-endian 64-bit
+  if (const ELFObjectFile<support::big, 8, true> *ELFObj =
+          dyn_cast<ELFObjectFile<support::big, 8, true> >(Obj))
+    printProgramHeaders(ELFObj);
+}

Modified: llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp?rev=171649&r1=171648&r2=171649&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp (original)
+++ llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp Sat Jan  5 21:56:49 2013
@@ -28,6 +28,7 @@
 #include "llvm/MC/MCSubtargetInfo.h"
 #include "llvm/Object/Archive.h"
 #include "llvm/Object/COFF.h"
+#include "llvm/Object/ELF.h"
 #include "llvm/Object/MachO.h"
 #include "llvm/Object/ObjectFile.h"
 #include "llvm/Support/Casting.h"
@@ -112,6 +113,14 @@
 UnwindInfoShort("u", cl::desc("Alias for --unwind-info"),
                 cl::aliasopt(UnwindInfo));
 
+static cl::opt<bool>
+PrivateHeaders("private-headers",
+               cl::desc("Display format specific file headers"));
+
+static cl::alias
+PrivateHeadersShort("p", cl::desc("Alias for --private-headers"),
+                    cl::aliasopt(PrivateHeaders));
+
 static StringRef ToolName;
 
 bool llvm::error(error_code ec) {
@@ -627,6 +636,8 @@
     PrintSymbolTable(o);
   if (UnwindInfo)
     PrintUnwindInfo(o);
+  if (PrivateHeaders && o->isELF())
+    printELFFileHeader(o);
 }
 
 /// @brief Dump each object file in \a a;
@@ -706,7 +717,8 @@
       && !SectionHeaders
       && !SectionContents
       && !SymbolTable
-      && !UnwindInfo) {
+      && !UnwindInfo
+      && !PrivateHeaders) {
     cl::PrintHelpMessage();
     return 2;
   }

Modified: llvm/trunk/tools/llvm-objdump/llvm-objdump.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.h?rev=171649&r1=171648&r2=171649&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objdump/llvm-objdump.h (original)
+++ llvm/trunk/tools/llvm-objdump/llvm-objdump.h Sat Jan  5 21:56:49 2013
@@ -19,6 +19,7 @@
 
 namespace object {
   class COFFObjectFile;
+  class ObjectFile;
   class RelocationRef;
 }
 class error_code;
@@ -32,6 +33,7 @@
 void DumpBytes(StringRef bytes);
 void DisassembleInputMachO(StringRef Filename);
 void printCOFFUnwindInfo(const object::COFFObjectFile* o);
+void printELFFileHeader(const object::ObjectFile *o);
 
 class StringRefMemoryObject : public MemoryObject {
   virtual void anchor();





More information about the llvm-commits mailing list