1*9880d681SAndroid Build Coastguard Worker //===-- ELFDump.cpp - ELF-specific dumper -----------------------*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker /// 10*9880d681SAndroid Build Coastguard Worker /// \file 11*9880d681SAndroid Build Coastguard Worker /// \brief This file implements the ELF-specific dumper for llvm-objdump. 12*9880d681SAndroid Build Coastguard Worker /// 13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker #include "llvm-objdump.h" 16*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/ELFObjectFile.h" 17*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Format.h" 18*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MathExtras.h" 19*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h" 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker using namespace llvm; 22*9880d681SAndroid Build Coastguard Worker using namespace llvm::object; 23*9880d681SAndroid Build Coastguard Worker printProgramHeaders(const ELFFile<ELFT> * o)24*9880d681SAndroid Build Coastguard Workertemplate <class ELFT> void printProgramHeaders(const ELFFile<ELFT> *o) { 25*9880d681SAndroid Build Coastguard Worker typedef ELFFile<ELFT> ELFO; 26*9880d681SAndroid Build Coastguard Worker outs() << "Program Header:\n"; 27*9880d681SAndroid Build Coastguard Worker for (const typename ELFO::Elf_Phdr &Phdr : o->program_headers()) { 28*9880d681SAndroid Build Coastguard Worker switch (Phdr.p_type) { 29*9880d681SAndroid Build Coastguard Worker case ELF::PT_LOAD: 30*9880d681SAndroid Build Coastguard Worker outs() << " LOAD "; 31*9880d681SAndroid Build Coastguard Worker break; 32*9880d681SAndroid Build Coastguard Worker case ELF::PT_GNU_STACK: 33*9880d681SAndroid Build Coastguard Worker outs() << " STACK "; 34*9880d681SAndroid Build Coastguard Worker break; 35*9880d681SAndroid Build Coastguard Worker case ELF::PT_GNU_EH_FRAME: 36*9880d681SAndroid Build Coastguard Worker outs() << "EH_FRAME "; 37*9880d681SAndroid Build Coastguard Worker break; 38*9880d681SAndroid Build Coastguard Worker case ELF::PT_INTERP: 39*9880d681SAndroid Build Coastguard Worker outs() << " INTERP "; 40*9880d681SAndroid Build Coastguard Worker break; 41*9880d681SAndroid Build Coastguard Worker case ELF::PT_DYNAMIC: 42*9880d681SAndroid Build Coastguard Worker outs() << " DYNAMIC "; 43*9880d681SAndroid Build Coastguard Worker break; 44*9880d681SAndroid Build Coastguard Worker case ELF::PT_PHDR: 45*9880d681SAndroid Build Coastguard Worker outs() << " PHDR "; 46*9880d681SAndroid Build Coastguard Worker break; 47*9880d681SAndroid Build Coastguard Worker case ELF::PT_TLS: 48*9880d681SAndroid Build Coastguard Worker outs() << " TLS "; 49*9880d681SAndroid Build Coastguard Worker break; 50*9880d681SAndroid Build Coastguard Worker default: 51*9880d681SAndroid Build Coastguard Worker outs() << " UNKNOWN "; 52*9880d681SAndroid Build Coastguard Worker } 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker const char *Fmt = ELFT::Is64Bits ? "0x%016" PRIx64 " " : "0x%08" PRIx64 " "; 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker outs() << "off " << format(Fmt, (uint64_t)Phdr.p_offset) << "vaddr " 57*9880d681SAndroid Build Coastguard Worker << format(Fmt, (uint64_t)Phdr.p_vaddr) << "paddr " 58*9880d681SAndroid Build Coastguard Worker << format(Fmt, (uint64_t)Phdr.p_paddr) 59*9880d681SAndroid Build Coastguard Worker << format("align 2**%u\n", 60*9880d681SAndroid Build Coastguard Worker countTrailingZeros<uint64_t>(Phdr.p_align)) 61*9880d681SAndroid Build Coastguard Worker << " filesz " << format(Fmt, (uint64_t)Phdr.p_filesz) 62*9880d681SAndroid Build Coastguard Worker << "memsz " << format(Fmt, (uint64_t)Phdr.p_memsz) << "flags " 63*9880d681SAndroid Build Coastguard Worker << ((Phdr.p_flags & ELF::PF_R) ? "r" : "-") 64*9880d681SAndroid Build Coastguard Worker << ((Phdr.p_flags & ELF::PF_W) ? "w" : "-") 65*9880d681SAndroid Build Coastguard Worker << ((Phdr.p_flags & ELF::PF_X) ? "x" : "-") << "\n"; 66*9880d681SAndroid Build Coastguard Worker } 67*9880d681SAndroid Build Coastguard Worker outs() << "\n"; 68*9880d681SAndroid Build Coastguard Worker } 69*9880d681SAndroid Build Coastguard Worker printELFFileHeader(const object::ObjectFile * Obj)70*9880d681SAndroid Build Coastguard Workervoid llvm::printELFFileHeader(const object::ObjectFile *Obj) { 71*9880d681SAndroid Build Coastguard Worker // Little-endian 32-bit 72*9880d681SAndroid Build Coastguard Worker if (const ELF32LEObjectFile *ELFObj = dyn_cast<ELF32LEObjectFile>(Obj)) 73*9880d681SAndroid Build Coastguard Worker printProgramHeaders(ELFObj->getELFFile()); 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker // Big-endian 32-bit 76*9880d681SAndroid Build Coastguard Worker if (const ELF32BEObjectFile *ELFObj = dyn_cast<ELF32BEObjectFile>(Obj)) 77*9880d681SAndroid Build Coastguard Worker printProgramHeaders(ELFObj->getELFFile()); 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker // Little-endian 64-bit 80*9880d681SAndroid Build Coastguard Worker if (const ELF64LEObjectFile *ELFObj = dyn_cast<ELF64LEObjectFile>(Obj)) 81*9880d681SAndroid Build Coastguard Worker printProgramHeaders(ELFObj->getELFFile()); 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker // Big-endian 64-bit 84*9880d681SAndroid Build Coastguard Worker if (const ELF64BEObjectFile *ELFObj = dyn_cast<ELF64BEObjectFile>(Obj)) 85*9880d681SAndroid Build Coastguard Worker printProgramHeaders(ELFObj->getELFFile()); 86*9880d681SAndroid Build Coastguard Worker } 87