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