ELFDump.cpp revision 263508
1238384Sjkim//===-- ELFDump.cpp - ELF-specific dumper -----------------------*- C++ -*-===//
2238384Sjkim//
3238384Sjkim//                     The LLVM Compiler Infrastructure
4238384Sjkim//
5238384Sjkim// This file is distributed under the University of Illinois Open Source
6238384Sjkim// License. See LICENSE.TXT for details.
7238384Sjkim//
8238384Sjkim//===----------------------------------------------------------------------===//
9238384Sjkim///
10238384Sjkim/// \file
11238384Sjkim/// \brief This file implements the ELF-specific dumper for llvm-objdump.
12238384Sjkim///
13238384Sjkim//===----------------------------------------------------------------------===//
14238384Sjkim
15238384Sjkim#include "llvm-objdump.h"
16238384Sjkim#include "llvm/Object/ELFObjectFile.h"
17238384Sjkim#include "llvm/Support/Format.h"
18238384Sjkim#include "llvm/Support/MathExtras.h"
19238384Sjkim#include "llvm/Support/raw_ostream.h"
20238384Sjkim
21238384Sjkimusing namespace llvm;
22238384Sjkimusing namespace llvm::object;
23238384Sjkim
24238384Sjkimtemplate <class ELFT> void printProgramHeaders(const ELFFile<ELFT> *o) {
25238384Sjkim  typedef ELFFile<ELFT> ELFO;
26238384Sjkim  outs() << "Program Header:\n";
27238384Sjkim  for (typename ELFO::Elf_Phdr_Iter pi = o->begin_program_headers(),
28238384Sjkim                                    pe = o->end_program_headers();
29238384Sjkim                                    pi != pe; ++pi) {
30238384Sjkim    switch (pi->p_type) {
31238384Sjkim    case ELF::PT_LOAD:
32238384Sjkim      outs() << "    LOAD ";
33238384Sjkim      break;
34238384Sjkim    case ELF::PT_GNU_STACK:
35238384Sjkim      outs() << "   STACK ";
36238384Sjkim      break;
37238384Sjkim    case ELF::PT_GNU_EH_FRAME:
38238384Sjkim      outs() << "EH_FRAME ";
39238384Sjkim      break;
40238384Sjkim    case ELF::PT_INTERP:
41238384Sjkim      outs() << "  INTERP ";
42238384Sjkim      break;
43238384Sjkim    case ELF::PT_DYNAMIC:
44238384Sjkim      outs() << " DYNAMIC ";
45238384Sjkim      break;
46238384Sjkim    case ELF::PT_PHDR:
47238384Sjkim      outs() << "    PHDR ";
48238384Sjkim      break;
49238384Sjkim    case ELF::PT_TLS:
50238384Sjkim      outs() << "    TLS ";
51238384Sjkim      break;
52238384Sjkim    default:
53238384Sjkim      outs() << " UNKNOWN ";
54238384Sjkim    }
55238384Sjkim
56238384Sjkim    const char *Fmt = ELFT::Is64Bits ? "0x%016" PRIx64 " " : "0x%08" PRIx64 " ";
57238384Sjkim
58238384Sjkim    outs() << "off    "
59238384Sjkim           << format(Fmt, (uint64_t)pi->p_offset)
60238384Sjkim           << "vaddr "
61238384Sjkim           << format(Fmt, (uint64_t)pi->p_vaddr)
62238384Sjkim           << "paddr "
63238384Sjkim           << format(Fmt, (uint64_t)pi->p_paddr)
64238384Sjkim           << format("align 2**%u\n", countTrailingZeros<uint64_t>(pi->p_align))
65238384Sjkim           << "         filesz "
66238384Sjkim           << format(Fmt, (uint64_t)pi->p_filesz)
67238384Sjkim           << "memsz "
68238384Sjkim           << format(Fmt, (uint64_t)pi->p_memsz)
69238384Sjkim           << "flags "
70238384Sjkim           << ((pi->p_flags & ELF::PF_R) ? "r" : "-")
71238384Sjkim           << ((pi->p_flags & ELF::PF_W) ? "w" : "-")
72238384Sjkim           << ((pi->p_flags & ELF::PF_X) ? "x" : "-")
73238384Sjkim           << "\n";
74238384Sjkim  }
75238384Sjkim  outs() << "\n";
76238384Sjkim}
77238384Sjkim
78238384Sjkimvoid llvm::printELFFileHeader(const object::ObjectFile *Obj) {
79238384Sjkim  // Little-endian 32-bit
80238384Sjkim  if (const ELF32LEObjectFile *ELFObj = dyn_cast<ELF32LEObjectFile>(Obj))
81238384Sjkim    printProgramHeaders(ELFObj->getELFFile());
82238384Sjkim
83238384Sjkim  // Big-endian 32-bit
84238384Sjkim  if (const ELF32BEObjectFile *ELFObj = dyn_cast<ELF32BEObjectFile>(Obj))
85238384Sjkim    printProgramHeaders(ELFObj->getELFFile());
86238384Sjkim
87238384Sjkim  // Little-endian 64-bit
88238384Sjkim  if (const ELF64LEObjectFile *ELFObj = dyn_cast<ELF64LEObjectFile>(Obj))
89238384Sjkim    printProgramHeaders(ELFObj->getELFFile());
90238384Sjkim
91238384Sjkim  // Big-endian 64-bit
92238384Sjkim  if (const ELF64BEObjectFile *ELFObj = dyn_cast<ELF64BEObjectFile>(Obj))
93238384Sjkim    printProgramHeaders(ELFObj->getELFFile());
94238384Sjkim}
95238384Sjkim