ELFDumper.cpp revision bed93b0de197c6b64357068ae8e1a883ddbb0e94
176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher//===-- ELFDumper.cpp - ELF-specific dumper ---------------------*- C++ -*-===// 276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher// 376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher// The LLVM Compiler Infrastructure 476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher// 576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher// This file is distributed under the University of Illinois Open Source 676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher// License. See LICENSE.TXT for details. 776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher// 876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher//===----------------------------------------------------------------------===// 976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher/// 1076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher/// \file 1176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher/// \brief This file implements the ELF-specific dumper for llvm-readobj. 1276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher/// 1376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher//===----------------------------------------------------------------------===// 1476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 1576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm-readobj.h" 1676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "Error.h" 1776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "ObjDumper.h" 1876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "StreamWriter.h" 1976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 2076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/ADT/SmallString.h" 2176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Object/ELF.h" 2276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Support/Compiler.h" 2376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Support/Format.h" 2476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Support/MathExtras.h" 2576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#include "llvm/Support/raw_ostream.h" 2676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 2776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherusing namespace llvm; 2876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherusing namespace llvm::object; 2976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherusing namespace ELF; 3076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 3176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 3276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#define LLVM_READOBJ_ENUM_CASE(ns, enum) \ 3376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case ns::enum: return #enum; 3476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 3576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophernamespace { 3676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 3776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<typename ELFT> 3876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherclass ELFDumper : public ObjDumper { 3976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherpublic: 4076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher ELFDumper(const ELFObjectFile<ELFT> *Obj, StreamWriter& Writer) 4176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher : ObjDumper(Writer) 4276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher , Obj(Obj) { } 4376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 4476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher virtual void printFileHeaders() LLVM_OVERRIDE; 4576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher virtual void printSections() LLVM_OVERRIDE; 4676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher virtual void printRelocations() LLVM_OVERRIDE; 4776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher virtual void printSymbols() LLVM_OVERRIDE; 4876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher virtual void printDynamicSymbols() LLVM_OVERRIDE; 4976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher virtual void printUnwindInfo() LLVM_OVERRIDE; 5076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 5176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher virtual void printDynamicTable() LLVM_OVERRIDE; 5276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher virtual void printNeededLibraries() LLVM_OVERRIDE; 53cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck virtual void printProgramHeaders() LLVM_OVERRIDE; 5476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 5576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherprivate: 56cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck typedef ELFObjectFile<ELFT> ELFO; 57cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck typedef typename ELFO::Elf_Shdr Elf_Shdr; 58cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck typedef typename ELFO::Elf_Sym Elf_Sym; 5976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 6076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher void printSymbol(symbol_iterator SymI, bool IsDynamic = false); 6176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 6276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher void printRelocation(section_iterator SecI, relocation_iterator RelI); 6376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 64cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck const ELFO *Obj; 6576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}; 6676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 6776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} // namespace 6876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 6976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 7076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophernamespace llvm { 7176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 72bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindolatemplate <class ELFT> 73bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindolastatic error_code createELFDumper(const ELFObjectFile<ELFT> *Obj, 74bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola StreamWriter &Writer, 75bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola OwningPtr<ObjDumper> &Result) { 76bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola Result.reset(new ELFDumper<ELFT>(Obj, Writer)); 77bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola return readobj_error::success; 78bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola} 79bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola 8076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophererror_code createELFDumper(const object::ObjectFile *Obj, 8176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher StreamWriter& Writer, 8276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher OwningPtr<ObjDumper> &Result) { 8376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher // Little-endian 32-bit 84bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola if (const ELF32LEObjectFile *ELFObj = dyn_cast<ELF32LEObjectFile>(Obj)) 85bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola return createELFDumper(ELFObj, Writer, Result); 8676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 8776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher // Big-endian 32-bit 88bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola if (const ELF32BEObjectFile *ELFObj = dyn_cast<ELF32BEObjectFile>(Obj)) 89bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola return createELFDumper(ELFObj, Writer, Result); 9076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 9176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher // Little-endian 64-bit 92bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola if (const ELF64LEObjectFile *ELFObj = dyn_cast<ELF64LEObjectFile>(Obj)) 93bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola return createELFDumper(ELFObj, Writer, Result); 9476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 9576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher // Big-endian 64-bit 96bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola if (const ELF64BEObjectFile *ELFObj = dyn_cast<ELF64BEObjectFile>(Obj)) 97bed93b0de197c6b64357068ae8e1a883ddbb0e94Rafael Espindola return createELFDumper(ELFObj, Writer, Result); 9876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 9976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher return readobj_error::unsupported_obj_file_format; 10076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} 10176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 10276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} // namespace llvm 10376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 10476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 10576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfClass[] = { 10676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "None", ELF::ELFCLASSNONE }, 10776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "32-bit", ELF::ELFCLASS32 }, 10876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "64-bit", ELF::ELFCLASS64 }, 10976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}; 11076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 11176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfDataEncoding[] = { 11276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "None", ELF::ELFDATANONE }, 11376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "LittleEndian", ELF::ELFDATA2LSB }, 11476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "BigEndian", ELF::ELFDATA2MSB }, 11576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}; 11676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 11776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfObjectFileType[] = { 11876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "None", ELF::ET_NONE }, 11976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "Relocatable", ELF::ET_REL }, 12076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "Executable", ELF::ET_EXEC }, 12176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "SharedObject", ELF::ET_DYN }, 12276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "Core", ELF::ET_CORE }, 12376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}; 12476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 12576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfOSABI[] = { 12676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "SystemV", ELF::ELFOSABI_NONE }, 12776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "HPUX", ELF::ELFOSABI_HPUX }, 12876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "NetBSD", ELF::ELFOSABI_NETBSD }, 12976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "GNU/Linux", ELF::ELFOSABI_LINUX }, 13076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "GNU/Hurd", ELF::ELFOSABI_HURD }, 13176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "Solaris", ELF::ELFOSABI_SOLARIS }, 13276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "AIX", ELF::ELFOSABI_AIX }, 13376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "IRIX", ELF::ELFOSABI_IRIX }, 13476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "FreeBSD", ELF::ELFOSABI_FREEBSD }, 13576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "TRU64", ELF::ELFOSABI_TRU64 }, 13676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "Modesto", ELF::ELFOSABI_MODESTO }, 13776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "OpenBSD", ELF::ELFOSABI_OPENBSD }, 13876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "OpenVMS", ELF::ELFOSABI_OPENVMS }, 13976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "NSK", ELF::ELFOSABI_NSK }, 14076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "AROS", ELF::ELFOSABI_AROS }, 14176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "FenixOS", ELF::ELFOSABI_FENIXOS }, 14276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "C6000_ELFABI", ELF::ELFOSABI_C6000_ELFABI }, 14376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "C6000_LINUX" , ELF::ELFOSABI_C6000_LINUX }, 14476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "ARM", ELF::ELFOSABI_ARM }, 14576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "Standalone" , ELF::ELFOSABI_STANDALONE } 14676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}; 14776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 14876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfMachineType[] = { 14976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_NONE ), 15076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_M32 ), 15176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARC ), 15276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_386 ), 15376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_68K ), 15476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_88K ), 15576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_486 ), 15676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_860 ), 15776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS ), 15876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_S370 ), 15976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS_RS3_LE ), 16076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_PARISC ), 16176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_VPP500 ), 16276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARC32PLUS ), 16376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_960 ), 16476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_PPC ), 16576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_PPC64 ), 16676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_S390 ), 16776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_SPU ), 16876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_V800 ), 16976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_FR20 ), 17076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_RH32 ), 17176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_RCE ), 17276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_ARM ), 17376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_ALPHA ), 17476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_SH ), 17576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARCV9 ), 17676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_TRICORE ), 17776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC ), 17876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_300 ), 17976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_300H ), 18076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_H8S ), 18176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_500 ), 18276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_IA_64 ), 18376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS_X ), 18476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_COLDFIRE ), 18576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC12 ), 18676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_MMA ), 18776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_PCP ), 18876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_NCPU ), 18976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_NDR1 ), 19076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_STARCORE ), 19176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_ME16 ), 19276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_ST100 ), 19376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_TINYJ ), 19476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_X86_64 ), 19576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_PDSP ), 19676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_PDP10 ), 19776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_PDP11 ), 19876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_FX66 ), 19976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_ST9PLUS ), 20076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_ST7 ), 20176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC16 ), 20276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC11 ), 20376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC08 ), 20476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC05 ), 20576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_SVX ), 20676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_ST19 ), 20776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_VAX ), 20876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_CRIS ), 20976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_JAVELIN ), 21076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_FIREPATH ), 21176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_ZSP ), 21276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_MMIX ), 21376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_HUANY ), 21476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_PRISM ), 21576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_AVR ), 21676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_FR30 ), 21776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_D10V ), 21876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_D30V ), 21976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_V850 ), 22076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_M32R ), 22176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_MN10300 ), 22276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_MN10200 ), 22376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_PJ ), 22476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_OPENRISC ), 22576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC_COMPACT ), 22676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_XTENSA ), 22776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE ), 22876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_TMM_GPP ), 22976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_NS32K ), 23076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_TPC ), 23176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_SNP1K ), 23276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_ST200 ), 23376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_IP2K ), 23476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_MAX ), 23576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_CR ), 23676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_F2MC16 ), 23776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_MSP430 ), 23876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_BLACKFIN ), 23976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_SE_C33 ), 24076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_SEP ), 24176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_ARCA ), 24276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_UNICORE ), 24376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_EXCESS ), 24476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_DXP ), 24576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_ALTERA_NIOS2 ), 24676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_CRX ), 24776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_XGATE ), 24876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_C166 ), 24976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_M16C ), 25076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_DSPIC30F ), 25176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_CE ), 25276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_M32C ), 25376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_TSK3000 ), 25476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_RS08 ), 25576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_SHARC ), 25676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG2 ), 25776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_SCORE7 ), 25876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_DSP24 ), 25976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE3 ), 26076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_LATTICEMICO32), 26176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_SE_C17 ), 26276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C6000 ), 26376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C2000 ), 26476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C5500 ), 26576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_MMDSP_PLUS ), 26676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_CYPRESS_M8C ), 26776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_R32C ), 26876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_TRIMEDIA ), 26976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_HEXAGON ), 27076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_8051 ), 27176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_STXP7X ), 27276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_NDS32 ), 27376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG1 ), 27476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG1X ), 27576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_MAXQ30 ), 27676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_XIMO16 ), 27776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_MANIK ), 27876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_CRAYNV2 ), 27976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_RX ), 28076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_METAG ), 28176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_MCST_ELBRUS ), 28276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG16 ), 28376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_CR16 ), 28476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_ETPU ), 28576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_SLE9X ), 28676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_L10M ), 28776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_K10M ), 28876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_AARCH64 ), 28976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_AVR32 ), 29076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_STM8 ), 29176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_TILE64 ), 29276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_TILEPRO ), 29376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_MICROBLAZE ), 29476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_CUDA ), 29576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_TILEGX ), 29676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_CLOUDSHIELD ), 29776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_COREA_1ST ), 29876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_COREA_2ND ), 29976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC_COMPACT2 ), 30076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_OPEN8 ), 30176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_RL78 ), 30276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE5 ), 30376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_78KOR ), 30476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_56800EX ), 30576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, EM_MBLAZE ) 30676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}; 30776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 30876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfSymbolBindings[] = { 30976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "Local", ELF::STB_LOCAL }, 31076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "Global", ELF::STB_GLOBAL }, 31176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "Weak", ELF::STB_WEAK } 31276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}; 31376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 31476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfSymbolTypes[] = { 31576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "None", ELF::STT_NOTYPE }, 31676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "Object", ELF::STT_OBJECT }, 31776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "Function", ELF::STT_FUNC }, 31876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "Section", ELF::STT_SECTION }, 31976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "File", ELF::STT_FILE }, 32076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "Common", ELF::STT_COMMON }, 32176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "TLS", ELF::STT_TLS }, 32276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { "GNU_IFunc", ELF::STT_GNU_IFUNC } 32376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}; 32476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 32576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const char *getElfSectionType(unsigned Arch, unsigned Type) { 32676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher switch (Arch) { 32776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case Triple::arm: 32876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher switch (Type) { 32976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_EXIDX); 33076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_PREEMPTMAP); 33176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_ATTRIBUTES); 33276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_DEBUGOVERLAY); 33376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_OVERLAYSECTION); 33476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 33576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case Triple::hexagon: 33676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher switch (Type) { 33776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_HEX_ORDERED); 33876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 33976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case Triple::x86_64: 34076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher switch (Type) { 34176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_X86_64_UNWIND); 34276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 34376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case Triple::mips: 34476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case Triple::mipsel: 34576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher switch (Type) { 34676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_REGINFO); 34776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_OPTIONS); 34876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 34976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 35076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 35176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher switch (Type) { 35276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_NULL ); 35376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_PROGBITS ); 35476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_SYMTAB ); 35576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_STRTAB ); 35676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_RELA ); 35776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_HASH ); 35876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_DYNAMIC ); 35976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_NOTE ); 36076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_NOBITS ); 36176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_REL ); 36276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_SHLIB ); 36376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_DYNSYM ); 36476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_INIT_ARRAY ); 36576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_FINI_ARRAY ); 36676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_PREINIT_ARRAY ); 36776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_GROUP ); 36876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_SYMTAB_SHNDX ); 36976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_ATTRIBUTES ); 37076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_HASH ); 37176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_verdef ); 37276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_verneed ); 37376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_versym ); 37476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher default: return ""; 37576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 37676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} 37776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 37876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const EnumEntry<unsigned> ElfSectionFlags[] = { 37976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, SHF_WRITE ), 38076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, SHF_ALLOC ), 38176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, SHF_EXECINSTR ), 38276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, SHF_MERGE ), 38376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, SHF_STRINGS ), 38476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, SHF_INFO_LINK ), 38576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, SHF_LINK_ORDER ), 38676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, SHF_OS_NONCONFORMING), 38776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, SHF_GROUP ), 38876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, SHF_TLS ), 38976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_CP_SECTION), 39076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_DP_SECTION), 39176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NOSTRIP ) 39276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher}; 39376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 394cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieckstatic const EnumEntry<unsigned> ElfSegmentTypes[] = { 395cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck LLVM_READOBJ_ENUM_ENT(ELF, PT_NULL ), 396cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck LLVM_READOBJ_ENUM_ENT(ELF, PT_LOAD ), 397cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck LLVM_READOBJ_ENUM_ENT(ELF, PT_DYNAMIC), 398cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck LLVM_READOBJ_ENUM_ENT(ELF, PT_INTERP ), 399cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck LLVM_READOBJ_ENUM_ENT(ELF, PT_NOTE ), 400cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck LLVM_READOBJ_ENUM_ENT(ELF, PT_SHLIB ), 401cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck LLVM_READOBJ_ENUM_ENT(ELF, PT_PHDR ), 402cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck LLVM_READOBJ_ENUM_ENT(ELF, PT_TLS ), 403cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck 404cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck LLVM_READOBJ_ENUM_ENT(ELF, PT_GNU_EH_FRAME), 405cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck LLVM_READOBJ_ENUM_ENT(ELF, PT_SUNW_EH_FRAME), 406cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck LLVM_READOBJ_ENUM_ENT(ELF, PT_SUNW_UNWIND), 407cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck 408cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck LLVM_READOBJ_ENUM_ENT(ELF, PT_GNU_STACK), 409cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck LLVM_READOBJ_ENUM_ENT(ELF, PT_GNU_RELRO), 410cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck 411cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck LLVM_READOBJ_ENUM_ENT(ELF, PT_ARM_EXIDX), 412cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck LLVM_READOBJ_ENUM_ENT(ELF, PT_ARM_UNWIND) 413cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck}; 414cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck 415cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieckstatic const EnumEntry<unsigned> ElfSegmentFlags[] = { 416cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck LLVM_READOBJ_ENUM_ENT(ELF, PF_X), 417cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck LLVM_READOBJ_ENUM_ENT(ELF, PF_W), 418cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck LLVM_READOBJ_ENUM_ENT(ELF, PF_R) 419cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck}; 420cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck 42176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 42276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT> 42376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printFileHeaders() { 42476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher error_code EC; 42576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 42676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher const typename ELFO::Elf_Ehdr *Header = Obj->getElfHeader(); 42776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 42876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { 42976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher DictScope D(W, "ElfHeader"); 43076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher { 43176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher DictScope D(W, "Ident"); 43276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printBinary("Magic", makeArrayRef(Header->e_ident).slice(ELF::EI_MAG0, 43376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 4)); 43476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printEnum ("Class", Header->e_ident[ELF::EI_CLASS], 43576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher makeArrayRef(ElfClass)); 43676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printEnum ("DataEncoding", Header->e_ident[ELF::EI_DATA], 43776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher makeArrayRef(ElfDataEncoding)); 43876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printNumber("FileVersion", Header->e_ident[ELF::EI_VERSION]); 43976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printEnum ("OS/ABI", Header->e_ident[ELF::EI_OSABI], 44076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher makeArrayRef(ElfOSABI)); 44176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printNumber("ABIVersion", Header->e_ident[ELF::EI_ABIVERSION]); 44276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printBinary("Unused", makeArrayRef(Header->e_ident).slice(ELF::EI_PAD)); 44376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 44476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 44576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printEnum ("Type", Header->e_type, makeArrayRef(ElfObjectFileType)); 44676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printEnum ("Machine", Header->e_machine, makeArrayRef(ElfMachineType)); 44776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printNumber("Version", Header->e_version); 44876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printHex ("Entry", Header->e_entry); 44976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printHex ("ProgramHeaderOffset", Header->e_phoff); 45076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printHex ("SectionHeaderOffset", Header->e_shoff); 45176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printFlags ("Flags", Header->e_flags); 45276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printNumber("HeaderSize", Header->e_ehsize); 45376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printNumber("ProgramHeaderEntrySize", Header->e_phentsize); 45476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printNumber("ProgramHeaderCount", Header->e_phnum); 45576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printNumber("SectionHeaderEntrySize", Header->e_shentsize); 45676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printNumber("SectionHeaderCount", Header->e_shnum); 45776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printNumber("StringTableSectionIndex", Header->e_shstrndx); 45876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 45976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} 46076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 46176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT> 46276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printSections() { 46376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher ListScope SectionsD(W, "Sections"); 46476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 46576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher int SectionIndex = -1; 46676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher error_code EC; 46776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher for (section_iterator SecI = Obj->begin_sections(), 46876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher SecE = Obj->end_sections(); 46976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher SecI != SecE; SecI.increment(EC)) { 47076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (error(EC)) break; 47176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 47276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher ++SectionIndex; 47376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 47476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher const Elf_Shdr *Section = Obj->getElfSection(SecI); 47576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher StringRef Name; 47676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (error(SecI->getName(Name))) 47776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher Name = ""; 47876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 47976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher DictScope SectionD(W, "Section"); 48076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printNumber("Index", SectionIndex); 48176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printNumber("Name", Name, Section->sh_name); 48276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printHex ("Type", getElfSectionType(Obj->getArch(), Section->sh_type), 48376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher Section->sh_type); 48476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printFlags ("Flags", Section->sh_flags, makeArrayRef(ElfSectionFlags)); 48576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printHex ("Address", Section->sh_addr); 48676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printHex ("Offset", Section->sh_offset); 48776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printNumber("Size", Section->sh_size); 48876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printNumber("Link", Section->sh_link); 48976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printNumber("Info", Section->sh_info); 49076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printNumber("AddressAlignment", Section->sh_addralign); 49176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printNumber("EntrySize", Section->sh_entsize); 49276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 49376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (opts::SectionRelocations) { 49476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher ListScope D(W, "Relocations"); 49576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher for (relocation_iterator RelI = SecI->begin_relocations(), 49676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher RelE = SecI->end_relocations(); 49776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher RelI != RelE; RelI.increment(EC)) { 49876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (error(EC)) break; 49976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 50076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher printRelocation(SecI, RelI); 50176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 50276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 50376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 50476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (opts::SectionSymbols) { 50576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher ListScope D(W, "Symbols"); 50676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher for (symbol_iterator SymI = Obj->begin_symbols(), 50776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher SymE = Obj->end_symbols(); 50876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher SymI != SymE; SymI.increment(EC)) { 50976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (error(EC)) break; 51076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 51176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher bool Contained = false; 51276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (SecI->containsSymbol(*SymI, Contained) || !Contained) 51376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher continue; 51476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 51576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher printSymbol(SymI); 51676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 51776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 51876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 51976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (opts::SectionData) { 52076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher StringRef Data; 52176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (error(SecI->getContents(Data))) break; 52276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 52376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printBinaryBlock("SectionData", Data); 52476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 52576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 52676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} 52776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 52876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT> 52976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printRelocations() { 53076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher ListScope D(W, "Relocations"); 53176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 53276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher error_code EC; 53376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher int SectionNumber = -1; 53476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher for (section_iterator SecI = Obj->begin_sections(), 53576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher SecE = Obj->end_sections(); 53676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher SecI != SecE; SecI.increment(EC)) { 53776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (error(EC)) break; 53876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 53976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher ++SectionNumber; 54076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher StringRef Name; 54176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (error(SecI->getName(Name))) 54276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher continue; 54376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 54476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher bool PrintedGroup = false; 54576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher for (relocation_iterator RelI = SecI->begin_relocations(), 54676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher RelE = SecI->end_relocations(); 54776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher RelI != RelE; RelI.increment(EC)) { 54876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (error(EC)) break; 54976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 55076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (!PrintedGroup) { 55176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.startLine() << "Section (" << SectionNumber << ") " << Name << " {\n"; 55276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.indent(); 55376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher PrintedGroup = true; 55476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 55576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 55676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher printRelocation(SecI, RelI); 55776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 55876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 55976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (PrintedGroup) { 56076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.unindent(); 56176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.startLine() << "}\n"; 56276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 56376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 56476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} 56576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 56676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT> 56776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printRelocation(section_iterator Sec, 56876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher relocation_iterator RelI) { 56976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher uint64_t Offset; 5701c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck uint64_t RelocType; 57176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher SmallString<32> RelocName; 572167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola int64_t Addend; 57376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher StringRef SymbolName; 57476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher SymbolRef Symbol; 575956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola if (Obj->getElfHeader()->e_type == ELF::ET_REL){ 576956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola if (error(RelI->getOffset(Offset))) return; 577956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola } else { 578956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola if (error(RelI->getAddress(Offset))) return; 579956ca7265c697107708468b7e1b2fd21f4185baeRafael Espindola } 5801c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck if (error(RelI->getType(RelocType))) return; 58176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (error(RelI->getTypeName(RelocName))) return; 582167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola if (error(getELFRelocationAddend(*RelI, Addend))) return; 58376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (error(RelI->getSymbol(Symbol))) return; 58476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (error(Symbol.getName(SymbolName))) return; 58576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 5861c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck if (opts::ExpandRelocs) { 5871c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck DictScope Group(W, "Relocation"); 5881c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck W.printHex("Offset", Offset); 5891c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck W.printNumber("Type", RelocName, RelocType); 5901c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck W.printString("Symbol", SymbolName.size() > 0 ? SymbolName : "-"); 591167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola W.printHex("Addend", Addend); 5921c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck } else { 5931c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck raw_ostream& OS = W.startLine(); 5941c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck OS << W.hex(Offset) 5951c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck << " " << RelocName 5961c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck << " " << (SymbolName.size() > 0 ? SymbolName : "-") 597167957fa095bc7200b908e6e142be3e604bcfeeaRafael Espindola << " " << W.hex(Addend) 5981c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck << "\n"; 5991c8dfa5e90fa7ba5d351d2e2511dc1495c83f6fdNico Rieck } 60076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} 60176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 60276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT> 60376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printSymbols() { 60476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher ListScope Group(W, "Symbols"); 60576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 60676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher error_code EC; 60776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher for (symbol_iterator SymI = Obj->begin_symbols(), SymE = Obj->end_symbols(); 60876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher SymI != SymE; SymI.increment(EC)) { 60976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (error(EC)) break; 61076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 61176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher printSymbol(SymI); 61276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 61376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} 61476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 61576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT> 61676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printDynamicSymbols() { 61776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher ListScope Group(W, "DynamicSymbols"); 61876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 61976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher error_code EC; 62076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher for (symbol_iterator SymI = Obj->begin_dynamic_symbols(), 62176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher SymE = Obj->end_dynamic_symbols(); 62276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher SymI != SymE; SymI.increment(EC)) { 62376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (error(EC)) break; 62476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 62576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher printSymbol(SymI, true); 62676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 62776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} 62876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 62976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT> 63076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printSymbol(symbol_iterator SymI, bool IsDynamic) { 63176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher error_code EC; 63276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 63376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher const Elf_Sym *Symbol = Obj->getElfSymbol(SymI); 63476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher const Elf_Shdr *Section = Obj->getSection(Symbol); 63576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 63676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher StringRef SymbolName; 63776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (SymI->getName(SymbolName)) 63876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher SymbolName = ""; 63976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 64048831939a83915939f759bdbe95404499169bc85Nico Rieck StringRef SectionName = ""; 64148831939a83915939f759bdbe95404499169bc85Nico Rieck if (Section) 64248831939a83915939f759bdbe95404499169bc85Nico Rieck Obj->getSectionName(Section, SectionName); 64376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 64476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher std::string FullSymbolName(SymbolName); 64576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (IsDynamic) { 64676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher StringRef Version; 64776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher bool IsDefault; 64876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (error(Obj->getSymbolVersion(*SymI, Version, IsDefault))) 64976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher return; 65076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (!Version.empty()) { 65176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher FullSymbolName += (IsDefault ? "@@" : "@"); 65276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher FullSymbolName += Version; 65376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 65476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 65576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 65676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher DictScope D(W, "Symbol"); 65776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printNumber("Name", FullSymbolName, Symbol->st_name); 65876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printHex ("Value", Symbol->st_value); 65976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printNumber("Size", Symbol->st_size); 66076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printEnum ("Binding", Symbol->getBinding(), 66176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher makeArrayRef(ElfSymbolBindings)); 66276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printEnum ("Type", Symbol->getType(), makeArrayRef(ElfSymbolTypes)); 66376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printNumber("Other", Symbol->st_other); 66476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.printHex ("Section", SectionName, Symbol->st_shndx); 66576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} 66676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 66776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#define LLVM_READOBJ_TYPE_CASE(name) \ 66876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_##name: return #name 66976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 67076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic const char *getTypeString(uint64_t Type) { 67176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher switch (Type) { 67276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(BIND_NOW); 67376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(DEBUG); 67476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(FINI); 67576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(FINI_ARRAY); 67676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(FINI_ARRAYSZ); 67776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(FLAGS); 67876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(HASH); 67976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(INIT); 68076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(INIT_ARRAY); 68176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(INIT_ARRAYSZ); 68276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(PREINIT_ARRAY); 68376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(PREINIT_ARRAYSZ); 68476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(JMPREL); 68576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(NEEDED); 68676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(NULL); 68776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(PLTGOT); 68876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(PLTREL); 68976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(PLTRELSZ); 69076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(REL); 69176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(RELA); 69276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(RELENT); 69376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(RELSZ); 69476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(RELAENT); 69576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(RELASZ); 69676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(RPATH); 69776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(RUNPATH); 69876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(SONAME); 69976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(STRSZ); 70076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(STRTAB); 70176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(SYMBOLIC); 70276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(SYMENT); 70376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(SYMTAB); 70476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LLVM_READOBJ_TYPE_CASE(TEXTREL); 70576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher default: return "unknown"; 70676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 70776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} 70876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 70976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher#undef LLVM_READOBJ_TYPE_CASE 71076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 71176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT> 71276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic void printValue(const ELFObjectFile<ELFT> *O, uint64_t Type, 71376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher uint64_t Value, bool Is64, raw_ostream &OS) { 71476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher switch (Type) { 71576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_PLTREL: 71676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (Value == DT_REL) { 71776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher OS << "REL"; 71876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher break; 71976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } else if (Value == DT_RELA) { 72076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher OS << "RELA"; 72176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher break; 72276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 72376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher // Fallthrough. 72476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_PLTGOT: 72576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_HASH: 72676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_STRTAB: 72776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_SYMTAB: 72876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_RELA: 72976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_INIT: 73076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_FINI: 73176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_REL: 73276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_JMPREL: 73376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_INIT_ARRAY: 73476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_FINI_ARRAY: 73576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_PREINIT_ARRAY: 73676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_DEBUG: 73776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_NULL: 73876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher OS << format("0x%" PRIX64, Value); 73976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher break; 74076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_PLTRELSZ: 74176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_RELASZ: 74276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_RELAENT: 74376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_STRSZ: 74476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_SYMENT: 74576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_RELSZ: 74676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_RELENT: 74776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_INIT_ARRAYSZ: 74876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_FINI_ARRAYSZ: 74976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_PREINIT_ARRAYSZ: 75076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher OS << Value << " (bytes)"; 75176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher break; 75276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_NEEDED: 75376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher OS << "SharedLibrary (" 75476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher << O->getString(O->getDynamicStringTableSectionHeader(), Value) << ")"; 75576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher break; 75676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher case DT_SONAME: 75776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher OS << "LibrarySoname (" 75876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher << O->getString(O->getDynamicStringTableSectionHeader(), Value) << ")"; 75976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher break; 76076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 76176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} 76276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 76376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT> 76476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printUnwindInfo() { 76576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.startLine() << "UnwindInfo not implemented.\n"; 76676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} 76776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 76876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT> 76976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printDynamicTable() { 77076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher typedef typename ELFO::Elf_Dyn_iterator EDI; 77176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher EDI Start = Obj->begin_dynamic_table(), 77276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher End = Obj->end_dynamic_table(true); 77376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 77476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (Start == End) 77576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher return; 77676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 77776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher ptrdiff_t Total = std::distance(Start, End); 77876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher raw_ostream &OS = W.getOStream(); 77976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.startLine() << "DynamicSection [ (" << Total << " entries)\n"; 78076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 78176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher bool Is64 = Obj->getBytesInAddress() == 8; 78276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 78376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.startLine() 78476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher << " Tag" << (Is64 ? " " : " ") << "Type" 78576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher << " " << "Name/Value\n"; 78676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher for (; Start != End; ++Start) { 78776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.startLine() 78876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher << " " 78976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher << format(Is64 ? "0x%016" PRIX64 : "0x%08" PRIX64, Start->getTag()) 79076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher << " " << format("%-21s", getTypeString(Start->getTag())); 79176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher printValue(Obj, Start->getTag(), Start->getVal(), Is64, OS); 79276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher OS << "\n"; 79376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 79476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 79576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher W.startLine() << "]\n"; 79676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} 79776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 79876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopherstatic bool compareLibraryName(const LibraryRef &L, const LibraryRef &R) { 79976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher StringRef LPath, RPath; 80076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher L.getPath(LPath); 80176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher R.getPath(RPath); 80276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher return LPath < RPath; 80376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} 80476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 80576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophertemplate<class ELFT> 80676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christophervoid ELFDumper<ELFT>::printNeededLibraries() { 80776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher ListScope D(W, "NeededLibraries"); 80876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 80976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher error_code EC; 81076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 81176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher typedef std::vector<LibraryRef> LibsTy; 81276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher LibsTy Libs; 81376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 81476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher for (library_iterator I = Obj->begin_libraries_needed(), 81576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher E = Obj->end_libraries_needed(); 81676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher I != E; I.increment(EC)) { 81776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher if (EC) 81876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher report_fatal_error("Needed libraries iteration failed"); 81976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 82076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher Libs.push_back(*I); 82176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 82276e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 82376e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher std::sort(Libs.begin(), Libs.end(), &compareLibraryName); 82476e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher 82576e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher for (LibsTy::const_iterator I = Libs.begin(), E = Libs.end(); 82676e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher I != E; ++I) { 82776e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher StringRef Path; 82876e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher I->getPath(Path); 82976e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher outs() << " " << Path << "\n"; 83076e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher } 83176e70f340c09ba759ad96d8dfe416b64f24bc287Eric Christopher} 832cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck 833cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Riecktemplate<class ELFT> 834cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieckvoid ELFDumper<ELFT>::printProgramHeaders() { 835cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck ListScope L(W, "ProgramHeaders"); 836cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck 837cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck for (typename ELFO::Elf_Phdr_Iter PI = Obj->begin_program_headers(), 838cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck PE = Obj->end_program_headers(); 839cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck PI != PE; ++PI) { 840cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck DictScope P(W, "ProgramHeader"); 841cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck W.printEnum ("Type", PI->p_type, makeArrayRef(ElfSegmentTypes)); 842cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck W.printHex ("Offset", PI->p_offset); 843cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck W.printHex ("VirtualAddress", PI->p_vaddr); 844cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck W.printHex ("PhysicalAddress", PI->p_paddr); 845cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck W.printNumber("FileSize", PI->p_filesz); 846cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck W.printNumber("MemSize", PI->p_memsz); 847cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck W.printFlags ("Flags", PI->p_flags, makeArrayRef(ElfSegmentFlags)); 848cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck W.printNumber("Alignment", PI->p_align); 849cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck } 850cf3b55ab18b6d0f5b658e746b57ec3cf193d5688Nico Rieck} 851