ELFDumper.cpp revision dce4a407a24b04eebc6a376f8e62b41aaa7b071f
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===-- ELFDumper.cpp - ELF-specific dumper ---------------------*- C++ -*-===// 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The LLVM Compiler Infrastructure 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// License. See LICENSE.TXT for details. 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===// 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// \file 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// \brief This file implements the ELF-specific dumper for llvm-readobj. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/// 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===// 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "llvm-readobj.h" 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "ARMAttributeParser.h" 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "ARMEHABIPrinter.h" 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "Error.h" 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "ObjDumper.h" 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "StreamWriter.h" 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "llvm/ADT/SmallString.h" 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "llvm/ADT/StringExtras.h" 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "llvm/Object/ELFObjectFile.h" 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "llvm/Support/ARMBuildAttributes.h" 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "llvm/Support/Compiler.h" 2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "llvm/Support/Format.h" 2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "llvm/Support/MathExtras.h" 28197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "llvm/Support/raw_ostream.h" 2909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 30e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochusing namespace llvm; 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)using namespace llvm::object; 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)using namespace ELF; 33a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 3409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#define LLVM_READOBJ_ENUM_CASE(ns, enum) \ 35a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) case ns::enum: return #enum; 36a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace { 38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename ELFT> 40f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)class ELFDumper : public ObjDumper { 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ELFDumper(const ELFFile<ELFT> *Obj, StreamWriter &Writer) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : ObjDumper(Writer), Obj(Obj) {} 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void printFileHeaders() override; 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void printSections() override; 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void printRelocations() override; 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void printSymbols() override; 49e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) void printDynamicSymbols() override; 50e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) void printUnwindInfo() override; 51e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 52e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) void printDynamicTable() override; 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void printNeededLibraries() override; 54e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) void printProgramHeaders() override; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void printAttributes() override; 5709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)private: 5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) typedef ELFFile<ELFT> ELFO; 6009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) typedef typename ELFO::Elf_Shdr Elf_Shdr; 6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) typedef typename ELFO::Elf_Sym Elf_Sym; 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void printSymbol(typename ELFO::Elf_Sym_Iter Symbol); 641e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void printRelocations(const Elf_Shdr *Sec); 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void printRelocation(const Elf_Shdr *Sec, typename ELFO::Elf_Rela Rel); 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const ELFO *Obj; 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template <class T> T errorOrDefault(ErrorOr<T> Val, T Default = T()) { 727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!Val) { 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) error(Val.getError()); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Default; 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return *Val; 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 798abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)} // namespace 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace llvm { 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template <class ELFT> 84d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)static error_code createELFDumper(const ELFFile<ELFT> *Obj, 855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) StreamWriter &Writer, 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) std::unique_ptr<ObjDumper> &Result) { 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Result.reset(new ELFDumper<ELFT>(Obj, Writer)); 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return readobj_error::success; 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)error_code createELFDumper(const object::ObjectFile *Obj, StreamWriter &Writer, 92d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) std::unique_ptr<ObjDumper> &Result) { 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Little-endian 32-bit 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (const ELF32LEObjectFile *ELFObj = dyn_cast<ELF32LEObjectFile>(Obj)) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return createELFDumper(ELFObj->getELFFile(), Writer, Result); 96d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Big-endian 32-bit 98197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (const ELF32BEObjectFile *ELFObj = dyn_cast<ELF32BEObjectFile>(Obj)) 9909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return createELFDumper(ELFObj->getELFFile(), Writer, Result); 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Little-endian 64-bit 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (const ELF64LEObjectFile *ELFObj = dyn_cast<ELF64LEObjectFile>(Obj)) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return createELFDumper(ELFObj->getELFFile(), Writer, Result); 104c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 105c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // Big-endian 64-bit 106c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (const ELF64BEObjectFile *ELFObj = dyn_cast<ELF64BEObjectFile>(Obj)) 107697ef0c10ac944be8499480c025020e4c282c980Ben Murdoch return createELFDumper(ELFObj->getELFFile(), Writer, Result); 108c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 109c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return readobj_error::unsupported_obj_file_format; 110c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 111c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 112c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace llvm 113c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 114c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)static const EnumEntry<unsigned> ElfClass[] = { 115c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { "None", ELF::ELFCLASSNONE }, 116c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { "32-bit", ELF::ELFCLASS32 }, 117c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { "64-bit", ELF::ELFCLASS64 }, 118c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}; 119c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 120c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)static const EnumEntry<unsigned> ElfDataEncoding[] = { 121c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { "None", ELF::ELFDATANONE }, 122c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { "LittleEndian", ELF::ELFDATA2LSB }, 123c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { "BigEndian", ELF::ELFDATA2MSB }, 124c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}; 125c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 126c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)static const EnumEntry<unsigned> ElfObjectFileType[] = { 127c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { "None", ELF::ET_NONE }, 128f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu { "Relocatable", ELF::ET_REL }, 129f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu { "Executable", ELF::ET_EXEC }, 130c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { "SharedObject", ELF::ET_DYN }, 131c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { "Core", ELF::ET_CORE }, 132c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}; 133f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 1347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccistatic const EnumEntry<unsigned> ElfOSABI[] = { 135f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu { "SystemV", ELF::ELFOSABI_NONE }, 136c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { "HPUX", ELF::ELFOSABI_HPUX }, 137c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { "NetBSD", ELF::ELFOSABI_NETBSD }, 138c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { "GNU/Linux", ELF::ELFOSABI_LINUX }, 13976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) { "GNU/Hurd", ELF::ELFOSABI_HURD }, 14076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) { "Solaris", ELF::ELFOSABI_SOLARIS }, 141c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { "AIX", ELF::ELFOSABI_AIX }, 142c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { "IRIX", ELF::ELFOSABI_IRIX }, 143c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { "FreeBSD", ELF::ELFOSABI_FREEBSD }, 144c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { "TRU64", ELF::ELFOSABI_TRU64 }, 145c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { "Modesto", ELF::ELFOSABI_MODESTO }, 14676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) { "OpenBSD", ELF::ELFOSABI_OPENBSD }, 14776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) { "OpenVMS", ELF::ELFOSABI_OPENVMS }, 14876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) { "NSK", ELF::ELFOSABI_NSK }, 14976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) { "AROS", ELF::ELFOSABI_AROS }, 1507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { "FenixOS", ELF::ELFOSABI_FENIXOS }, 1517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { "C6000_ELFABI", ELF::ELFOSABI_C6000_ELFABI }, 1527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { "C6000_LINUX" , ELF::ELFOSABI_C6000_LINUX }, 153f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu { "ARM", ELF::ELFOSABI_ARM }, 154f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu { "Standalone" , ELF::ELFOSABI_STANDALONE } 1555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}; 1565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 157f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liustatic const EnumEntry<unsigned> ElfMachineType[] = { 158f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_NONE ), 1595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_M32 ), 1605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARC ), 161f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_386 ), 1625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_68K ), 163f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_88K ), 164f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_486 ), 1655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_860 ), 166f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS ), 167f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_S370 ), 168f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS_RS3_LE ), 169f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_PARISC ), 170f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_VPP500 ), 171f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARC32PLUS ), 172f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_960 ), 173f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_PPC ), 174f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_PPC64 ), 175f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_S390 ), 176f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_SPU ), 177f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_V800 ), 178f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_FR20 ), 179f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_RH32 ), 180f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_RCE ), 181f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_ARM ), 182f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_ALPHA ), 183f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_SH ), 184f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARCV9 ), 185f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_TRICORE ), 186f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC ), 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_300 ), 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_300H ), 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_H8S ), 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_500 ), 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_IA_64 ), 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS_X ), 19351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_COLDFIRE ), 19451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC12 ), 195f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu LLVM_READOBJ_ENUM_ENT(ELF, EM_MMA ), 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_PCP ), 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_NCPU ), 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_NDR1 ), 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_STARCORE ), 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_ME16 ), 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_ST100 ), 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_TINYJ ), 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_X86_64 ), 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_PDSP ), 2058abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_PDP10 ), 206d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_PDP11 ), 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_FX66 ), 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_ST9PLUS ), 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_ST7 ), 210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC16 ), 211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC11 ), 2127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC08 ), 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC05 ), 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_SVX ), 215d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_ST19 ), 2167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LLVM_READOBJ_ENUM_ENT(ELF, EM_VAX ), 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_CRIS ), 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_JAVELIN ), 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_FIREPATH ), 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_ZSP ), 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_MMIX ), 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_HUANY ), 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_PRISM ), 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_AVR ), 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_FR30 ), 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_D10V ), 227a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_D30V ), 22809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_V850 ), 2297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LLVM_READOBJ_ENUM_ENT(ELF, EM_M32R ), 2301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_MN10300 ), 2317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LLVM_READOBJ_ENUM_ENT(ELF, EM_MN10200 ), 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_PJ ), 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_OPENRISC ), 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC_COMPACT ), 2357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LLVM_READOBJ_ENUM_ENT(ELF, EM_XTENSA ), 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE ), 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_TMM_GPP ), 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_NS32K ), 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_TPC ), 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_SNP1K ), 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_ST200 ), 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_IP2K ), 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_MAX ), 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_CR ), 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_F2MC16 ), 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_MSP430 ), 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_BLACKFIN ), 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_SE_C33 ), 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_SEP ), 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_ARCA ), 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_UNICORE ), 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_EXCESS ), 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_DXP ), 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_ALTERA_NIOS2 ), 2557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LLVM_READOBJ_ENUM_ENT(ELF, EM_CRX ), 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_XGATE ), 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_C166 ), 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_M16C ), 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_DSPIC30F ), 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_CE ), 2617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LLVM_READOBJ_ENUM_ENT(ELF, EM_M32C ), 2627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LLVM_READOBJ_ENUM_ENT(ELF, EM_TSK3000 ), 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_RS08 ), 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_SHARC ), 26509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG2 ), 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_SCORE7 ), 2678abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_DSP24 ), 268d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE3 ), 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_LATTICEMICO32), 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_SE_C17 ), 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C6000 ), 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C2000 ), 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C5500 ), 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_MMDSP_PLUS ), 2751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_CYPRESS_M8C ), 2761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_R32C ), 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_TRIMEDIA ), 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_HEXAGON ), 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_8051 ), 2801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_STXP7X ), 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_NDS32 ), 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG1 ), 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG1X ), 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_MAXQ30 ), 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_XIMO16 ), 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_MANIK ), 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_CRAYNV2 ), 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_RX ), 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_METAG ), 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_MCST_ELBRUS ), 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG16 ), 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_CR16 ), 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_ETPU ), 294e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_SLE9X ), 295e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_L10M ), 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_K10M ), 297926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_AARCH64 ), 298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_AVR32 ), 299926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_STM8 ), 300926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_TILE64 ), 301926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_TILEPRO ), 302926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_CUDA ), 303926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_TILEGX ), 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_CLOUDSHIELD ), 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_COREA_1ST ), 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LLVM_READOBJ_ENUM_ENT(ELF, EM_COREA_2ND ), 307 LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC_COMPACT2 ), 308 LLVM_READOBJ_ENUM_ENT(ELF, EM_OPEN8 ), 309 LLVM_READOBJ_ENUM_ENT(ELF, EM_RL78 ), 310 LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE5 ), 311 LLVM_READOBJ_ENUM_ENT(ELF, EM_78KOR ), 312 LLVM_READOBJ_ENUM_ENT(ELF, EM_56800EX ) 313}; 314 315static const EnumEntry<unsigned> ElfSymbolBindings[] = { 316 { "Local", ELF::STB_LOCAL }, 317 { "Global", ELF::STB_GLOBAL }, 318 { "Weak", ELF::STB_WEAK } 319}; 320 321static const EnumEntry<unsigned> ElfSymbolTypes[] = { 322 { "None", ELF::STT_NOTYPE }, 323 { "Object", ELF::STT_OBJECT }, 324 { "Function", ELF::STT_FUNC }, 325 { "Section", ELF::STT_SECTION }, 326 { "File", ELF::STT_FILE }, 327 { "Common", ELF::STT_COMMON }, 328 { "TLS", ELF::STT_TLS }, 329 { "GNU_IFunc", ELF::STT_GNU_IFUNC } 330}; 331 332static const char *getElfSectionType(unsigned Arch, unsigned Type) { 333 switch (Arch) { 334 case ELF::EM_ARM: 335 switch (Type) { 336 LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_EXIDX); 337 LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_PREEMPTMAP); 338 LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_ATTRIBUTES); 339 LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_DEBUGOVERLAY); 340 LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_OVERLAYSECTION); 341 } 342 case ELF::EM_HEXAGON: 343 switch (Type) { LLVM_READOBJ_ENUM_CASE(ELF, SHT_HEX_ORDERED); } 344 case ELF::EM_X86_64: 345 switch (Type) { LLVM_READOBJ_ENUM_CASE(ELF, SHT_X86_64_UNWIND); } 346 case ELF::EM_MIPS: 347 case ELF::EM_MIPS_RS3_LE: 348 switch (Type) { 349 LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_REGINFO); 350 LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_OPTIONS); 351 } 352 } 353 354 switch (Type) { 355 LLVM_READOBJ_ENUM_CASE(ELF, SHT_NULL ); 356 LLVM_READOBJ_ENUM_CASE(ELF, SHT_PROGBITS ); 357 LLVM_READOBJ_ENUM_CASE(ELF, SHT_SYMTAB ); 358 LLVM_READOBJ_ENUM_CASE(ELF, SHT_STRTAB ); 359 LLVM_READOBJ_ENUM_CASE(ELF, SHT_RELA ); 360 LLVM_READOBJ_ENUM_CASE(ELF, SHT_HASH ); 361 LLVM_READOBJ_ENUM_CASE(ELF, SHT_DYNAMIC ); 362 LLVM_READOBJ_ENUM_CASE(ELF, SHT_NOTE ); 363 LLVM_READOBJ_ENUM_CASE(ELF, SHT_NOBITS ); 364 LLVM_READOBJ_ENUM_CASE(ELF, SHT_REL ); 365 LLVM_READOBJ_ENUM_CASE(ELF, SHT_SHLIB ); 366 LLVM_READOBJ_ENUM_CASE(ELF, SHT_DYNSYM ); 367 LLVM_READOBJ_ENUM_CASE(ELF, SHT_INIT_ARRAY ); 368 LLVM_READOBJ_ENUM_CASE(ELF, SHT_FINI_ARRAY ); 369 LLVM_READOBJ_ENUM_CASE(ELF, SHT_PREINIT_ARRAY ); 370 LLVM_READOBJ_ENUM_CASE(ELF, SHT_GROUP ); 371 LLVM_READOBJ_ENUM_CASE(ELF, SHT_SYMTAB_SHNDX ); 372 LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_ATTRIBUTES ); 373 LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_HASH ); 374 LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_verdef ); 375 LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_verneed ); 376 LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_versym ); 377 default: return ""; 378 } 379} 380 381static const EnumEntry<unsigned> ElfSectionFlags[] = { 382 LLVM_READOBJ_ENUM_ENT(ELF, SHF_WRITE ), 383 LLVM_READOBJ_ENUM_ENT(ELF, SHF_ALLOC ), 384 LLVM_READOBJ_ENUM_ENT(ELF, SHF_EXCLUDE ), 385 LLVM_READOBJ_ENUM_ENT(ELF, SHF_EXECINSTR ), 386 LLVM_READOBJ_ENUM_ENT(ELF, SHF_MERGE ), 387 LLVM_READOBJ_ENUM_ENT(ELF, SHF_STRINGS ), 388 LLVM_READOBJ_ENUM_ENT(ELF, SHF_INFO_LINK ), 389 LLVM_READOBJ_ENUM_ENT(ELF, SHF_LINK_ORDER ), 390 LLVM_READOBJ_ENUM_ENT(ELF, SHF_OS_NONCONFORMING), 391 LLVM_READOBJ_ENUM_ENT(ELF, SHF_GROUP ), 392 LLVM_READOBJ_ENUM_ENT(ELF, SHF_TLS ), 393 LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_CP_SECTION), 394 LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_DP_SECTION), 395 LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NOSTRIP ) 396}; 397 398static const char *getElfSegmentType(unsigned Arch, unsigned Type) { 399 // Check potentially overlapped processor-specific 400 // program header type. 401 switch (Arch) { 402 case ELF::EM_ARM: 403 switch (Type) { 404 LLVM_READOBJ_ENUM_CASE(ELF, PT_ARM_EXIDX); 405 } 406 case ELF::EM_MIPS: 407 case ELF::EM_MIPS_RS3_LE: 408 switch (Type) { 409 LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_REGINFO); 410 LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_RTPROC); 411 LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_OPTIONS); 412 } 413 } 414 415 switch (Type) { 416 LLVM_READOBJ_ENUM_CASE(ELF, PT_NULL ); 417 LLVM_READOBJ_ENUM_CASE(ELF, PT_LOAD ); 418 LLVM_READOBJ_ENUM_CASE(ELF, PT_DYNAMIC); 419 LLVM_READOBJ_ENUM_CASE(ELF, PT_INTERP ); 420 LLVM_READOBJ_ENUM_CASE(ELF, PT_NOTE ); 421 LLVM_READOBJ_ENUM_CASE(ELF, PT_SHLIB ); 422 LLVM_READOBJ_ENUM_CASE(ELF, PT_PHDR ); 423 LLVM_READOBJ_ENUM_CASE(ELF, PT_TLS ); 424 425 LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_EH_FRAME); 426 LLVM_READOBJ_ENUM_CASE(ELF, PT_SUNW_UNWIND); 427 428 LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_STACK); 429 LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_RELRO); 430 default: return ""; 431 } 432} 433 434static const EnumEntry<unsigned> ElfSegmentFlags[] = { 435 LLVM_READOBJ_ENUM_ENT(ELF, PF_X), 436 LLVM_READOBJ_ENUM_ENT(ELF, PF_W), 437 LLVM_READOBJ_ENUM_ENT(ELF, PF_R) 438}; 439 440static const EnumEntry<unsigned> ElfHeaderMipsFlags[] = { 441 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_NOREORDER), 442 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_PIC), 443 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_CPIC), 444 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ABI2), 445 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_32BITMODE), 446 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_NAN2008), 447 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ABI_O32), 448 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MICROMIPS), 449 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_ASE_M16), 450 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_1), 451 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_2), 452 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_3), 453 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_4), 454 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_5), 455 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_32), 456 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_64), 457 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_32R2), 458 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_64R2), 459 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_32R6), 460 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_64R6) 461}; 462 463template<class ELFT> 464void ELFDumper<ELFT>::printFileHeaders() { 465 const typename ELFO::Elf_Ehdr *Header = Obj->getHeader(); 466 467 { 468 DictScope D(W, "ElfHeader"); 469 { 470 DictScope D(W, "Ident"); 471 W.printBinary("Magic", makeArrayRef(Header->e_ident).slice(ELF::EI_MAG0, 472 4)); 473 W.printEnum ("Class", Header->e_ident[ELF::EI_CLASS], 474 makeArrayRef(ElfClass)); 475 W.printEnum ("DataEncoding", Header->e_ident[ELF::EI_DATA], 476 makeArrayRef(ElfDataEncoding)); 477 W.printNumber("FileVersion", Header->e_ident[ELF::EI_VERSION]); 478 W.printEnum ("OS/ABI", Header->e_ident[ELF::EI_OSABI], 479 makeArrayRef(ElfOSABI)); 480 W.printNumber("ABIVersion", Header->e_ident[ELF::EI_ABIVERSION]); 481 W.printBinary("Unused", makeArrayRef(Header->e_ident).slice(ELF::EI_PAD)); 482 } 483 484 W.printEnum ("Type", Header->e_type, makeArrayRef(ElfObjectFileType)); 485 W.printEnum ("Machine", Header->e_machine, makeArrayRef(ElfMachineType)); 486 W.printNumber("Version", Header->e_version); 487 W.printHex ("Entry", Header->e_entry); 488 W.printHex ("ProgramHeaderOffset", Header->e_phoff); 489 W.printHex ("SectionHeaderOffset", Header->e_shoff); 490 if (Header->e_machine == EM_MIPS) 491 W.printFlags("Flags", Header->e_flags, makeArrayRef(ElfHeaderMipsFlags), 492 unsigned(ELF::EF_MIPS_ARCH)); 493 else 494 W.printFlags("Flags", Header->e_flags); 495 W.printNumber("HeaderSize", Header->e_ehsize); 496 W.printNumber("ProgramHeaderEntrySize", Header->e_phentsize); 497 W.printNumber("ProgramHeaderCount", Header->e_phnum); 498 W.printNumber("SectionHeaderEntrySize", Header->e_shentsize); 499 W.printNumber("SectionHeaderCount", Header->e_shnum); 500 W.printNumber("StringTableSectionIndex", Header->e_shstrndx); 501 } 502} 503 504template<class ELFT> 505void ELFDumper<ELFT>::printSections() { 506 ListScope SectionsD(W, "Sections"); 507 508 int SectionIndex = -1; 509 for (typename ELFO::Elf_Shdr_Iter SecI = Obj->begin_sections(), 510 SecE = Obj->end_sections(); 511 SecI != SecE; ++SecI) { 512 ++SectionIndex; 513 514 const Elf_Shdr *Section = &*SecI; 515 StringRef Name = errorOrDefault(Obj->getSectionName(Section)); 516 517 DictScope SectionD(W, "Section"); 518 W.printNumber("Index", SectionIndex); 519 W.printNumber("Name", Name, Section->sh_name); 520 W.printHex("Type", 521 getElfSectionType(Obj->getHeader()->e_machine, Section->sh_type), 522 Section->sh_type); 523 W.printFlags ("Flags", Section->sh_flags, makeArrayRef(ElfSectionFlags)); 524 W.printHex ("Address", Section->sh_addr); 525 W.printHex ("Offset", Section->sh_offset); 526 W.printNumber("Size", Section->sh_size); 527 W.printNumber("Link", Section->sh_link); 528 W.printNumber("Info", Section->sh_info); 529 W.printNumber("AddressAlignment", Section->sh_addralign); 530 W.printNumber("EntrySize", Section->sh_entsize); 531 532 if (opts::SectionRelocations) { 533 ListScope D(W, "Relocations"); 534 printRelocations(Section); 535 } 536 537 if (opts::SectionSymbols) { 538 ListScope D(W, "Symbols"); 539 for (typename ELFO::Elf_Sym_Iter SymI = Obj->begin_symbols(), 540 SymE = Obj->end_symbols(); 541 SymI != SymE; ++SymI) { 542 if (Obj->getSection(&*SymI) == Section) 543 printSymbol(SymI); 544 } 545 } 546 547 if (opts::SectionData) { 548 ArrayRef<uint8_t> Data = errorOrDefault(Obj->getSectionContents(Section)); 549 W.printBinaryBlock("SectionData", 550 StringRef((const char *)Data.data(), Data.size())); 551 } 552 } 553} 554 555template<class ELFT> 556void ELFDumper<ELFT>::printRelocations() { 557 ListScope D(W, "Relocations"); 558 559 int SectionNumber = -1; 560 for (typename ELFO::Elf_Shdr_Iter SecI = Obj->begin_sections(), 561 SecE = Obj->end_sections(); 562 SecI != SecE; ++SecI) { 563 ++SectionNumber; 564 565 if (SecI->sh_type != ELF::SHT_REL && SecI->sh_type != ELF::SHT_RELA) 566 continue; 567 568 StringRef Name = errorOrDefault(Obj->getSectionName(&*SecI)); 569 570 W.startLine() << "Section (" << SectionNumber << ") " << Name << " {\n"; 571 W.indent(); 572 573 printRelocations(&*SecI); 574 575 W.unindent(); 576 W.startLine() << "}\n"; 577 } 578} 579 580template <class ELFT> 581void ELFDumper<ELFT>::printRelocations(const Elf_Shdr *Sec) { 582 switch (Sec->sh_type) { 583 case ELF::SHT_REL: 584 for (typename ELFO::Elf_Rel_Iter RI = Obj->begin_rel(Sec), 585 RE = Obj->end_rel(Sec); 586 RI != RE; ++RI) { 587 typename ELFO::Elf_Rela Rela; 588 Rela.r_offset = RI->r_offset; 589 Rela.r_info = RI->r_info; 590 Rela.r_addend = 0; 591 printRelocation(Sec, Rela); 592 } 593 break; 594 case ELF::SHT_RELA: 595 for (typename ELFO::Elf_Rela_Iter RI = Obj->begin_rela(Sec), 596 RE = Obj->end_rela(Sec); 597 RI != RE; ++RI) { 598 printRelocation(Sec, *RI); 599 } 600 break; 601 } 602} 603 604template <class ELFT> 605void ELFDumper<ELFT>::printRelocation(const Elf_Shdr *Sec, 606 typename ELFO::Elf_Rela Rel) { 607 SmallString<32> RelocName; 608 Obj->getRelocationTypeName(Rel.getType(Obj->isMips64EL()), RelocName); 609 StringRef SymbolName; 610 std::pair<const Elf_Shdr *, const Elf_Sym *> Sym = 611 Obj->getRelocationSymbol(Sec, &Rel); 612 if (Sym.first) 613 SymbolName = errorOrDefault(Obj->getSymbolName(Sym.first, Sym.second)); 614 615 if (opts::ExpandRelocs) { 616 DictScope Group(W, "Relocation"); 617 W.printHex("Offset", Rel.r_offset); 618 W.printNumber("Type", RelocName, (int)Rel.getType(Obj->isMips64EL())); 619 W.printString("Symbol", SymbolName.size() > 0 ? SymbolName : "-"); 620 W.printHex("Addend", Rel.r_addend); 621 } else { 622 raw_ostream& OS = W.startLine(); 623 OS << W.hex(Rel.r_offset) 624 << " " << RelocName 625 << " " << (SymbolName.size() > 0 ? SymbolName : "-") 626 << " " << W.hex(Rel.r_addend) 627 << "\n"; 628 } 629} 630 631template<class ELFT> 632void ELFDumper<ELFT>::printSymbols() { 633 ListScope Group(W, "Symbols"); 634 for (typename ELFO::Elf_Sym_Iter SymI = Obj->begin_symbols(), 635 SymE = Obj->end_symbols(); 636 SymI != SymE; ++SymI) { 637 printSymbol(SymI); 638 } 639} 640 641template<class ELFT> 642void ELFDumper<ELFT>::printDynamicSymbols() { 643 ListScope Group(W, "DynamicSymbols"); 644 645 for (typename ELFO::Elf_Sym_Iter SymI = Obj->begin_dynamic_symbols(), 646 SymE = Obj->end_dynamic_symbols(); 647 SymI != SymE; ++SymI) { 648 printSymbol(SymI); 649 } 650} 651 652template <class ELFT> 653void ELFDumper<ELFT>::printSymbol(typename ELFO::Elf_Sym_Iter Symbol) { 654 StringRef SymbolName = errorOrDefault(Obj->getSymbolName(Symbol)); 655 656 unsigned SectionIndex = Symbol->st_shndx; 657 StringRef SectionName; 658 if (SectionIndex == SHN_UNDEF) { 659 SectionName = "Undefined"; 660 } else if (SectionIndex >= SHN_LOPROC && SectionIndex <= SHN_HIPROC) { 661 SectionName = "Processor Specific"; 662 } else if (SectionIndex >= SHN_LOOS && SectionIndex <= SHN_HIOS) { 663 SectionName = "Operating System Specific"; 664 } else if (SectionIndex > SHN_HIOS && SectionIndex < SHN_ABS) { 665 SectionName = "Reserved"; 666 } else if (SectionIndex == SHN_ABS) { 667 SectionName = "Absolute"; 668 } else if (SectionIndex == SHN_COMMON) { 669 SectionName = "Common"; 670 } else { 671 if (SectionIndex == SHN_XINDEX) 672 SectionIndex = Obj->getSymbolTableIndex(&*Symbol); 673 assert(SectionIndex != SHN_XINDEX && 674 "getSymbolTableIndex should handle this"); 675 const Elf_Shdr *Sec = Obj->getSection(SectionIndex); 676 SectionName = errorOrDefault(Obj->getSectionName(Sec)); 677 } 678 679 std::string FullSymbolName(SymbolName); 680 if (Symbol.isDynamic()) { 681 bool IsDefault; 682 ErrorOr<StringRef> Version = Obj->getSymbolVersion(nullptr, &*Symbol, 683 IsDefault); 684 if (Version) { 685 FullSymbolName += (IsDefault ? "@@" : "@"); 686 FullSymbolName += *Version; 687 } else 688 error(Version.getError()); 689 } 690 691 DictScope D(W, "Symbol"); 692 W.printNumber("Name", FullSymbolName, Symbol->st_name); 693 W.printHex ("Value", Symbol->st_value); 694 W.printNumber("Size", Symbol->st_size); 695 W.printEnum ("Binding", Symbol->getBinding(), 696 makeArrayRef(ElfSymbolBindings)); 697 W.printEnum ("Type", Symbol->getType(), makeArrayRef(ElfSymbolTypes)); 698 W.printNumber("Other", Symbol->st_other); 699 W.printHex("Section", SectionName, SectionIndex); 700} 701 702#define LLVM_READOBJ_TYPE_CASE(name) \ 703 case DT_##name: return #name 704 705static const char *getTypeString(uint64_t Type) { 706 switch (Type) { 707 LLVM_READOBJ_TYPE_CASE(BIND_NOW); 708 LLVM_READOBJ_TYPE_CASE(DEBUG); 709 LLVM_READOBJ_TYPE_CASE(FINI); 710 LLVM_READOBJ_TYPE_CASE(FINI_ARRAY); 711 LLVM_READOBJ_TYPE_CASE(FINI_ARRAYSZ); 712 LLVM_READOBJ_TYPE_CASE(FLAGS); 713 LLVM_READOBJ_TYPE_CASE(HASH); 714 LLVM_READOBJ_TYPE_CASE(INIT); 715 LLVM_READOBJ_TYPE_CASE(INIT_ARRAY); 716 LLVM_READOBJ_TYPE_CASE(INIT_ARRAYSZ); 717 LLVM_READOBJ_TYPE_CASE(PREINIT_ARRAY); 718 LLVM_READOBJ_TYPE_CASE(PREINIT_ARRAYSZ); 719 LLVM_READOBJ_TYPE_CASE(JMPREL); 720 LLVM_READOBJ_TYPE_CASE(NEEDED); 721 LLVM_READOBJ_TYPE_CASE(NULL); 722 LLVM_READOBJ_TYPE_CASE(PLTGOT); 723 LLVM_READOBJ_TYPE_CASE(PLTREL); 724 LLVM_READOBJ_TYPE_CASE(PLTRELSZ); 725 LLVM_READOBJ_TYPE_CASE(REL); 726 LLVM_READOBJ_TYPE_CASE(RELA); 727 LLVM_READOBJ_TYPE_CASE(RELENT); 728 LLVM_READOBJ_TYPE_CASE(RELSZ); 729 LLVM_READOBJ_TYPE_CASE(RELAENT); 730 LLVM_READOBJ_TYPE_CASE(RELASZ); 731 LLVM_READOBJ_TYPE_CASE(RPATH); 732 LLVM_READOBJ_TYPE_CASE(RUNPATH); 733 LLVM_READOBJ_TYPE_CASE(SONAME); 734 LLVM_READOBJ_TYPE_CASE(STRSZ); 735 LLVM_READOBJ_TYPE_CASE(STRTAB); 736 LLVM_READOBJ_TYPE_CASE(SYMBOLIC); 737 LLVM_READOBJ_TYPE_CASE(SYMENT); 738 LLVM_READOBJ_TYPE_CASE(SYMTAB); 739 LLVM_READOBJ_TYPE_CASE(TEXTREL); 740 LLVM_READOBJ_TYPE_CASE(VERNEED); 741 LLVM_READOBJ_TYPE_CASE(VERNEEDNUM); 742 LLVM_READOBJ_TYPE_CASE(VERSYM); 743 LLVM_READOBJ_TYPE_CASE(RELCOUNT); 744 LLVM_READOBJ_TYPE_CASE(GNU_HASH); 745 LLVM_READOBJ_TYPE_CASE(MIPS_RLD_VERSION); 746 LLVM_READOBJ_TYPE_CASE(MIPS_FLAGS); 747 LLVM_READOBJ_TYPE_CASE(MIPS_BASE_ADDRESS); 748 LLVM_READOBJ_TYPE_CASE(MIPS_LOCAL_GOTNO); 749 LLVM_READOBJ_TYPE_CASE(MIPS_SYMTABNO); 750 LLVM_READOBJ_TYPE_CASE(MIPS_UNREFEXTNO); 751 LLVM_READOBJ_TYPE_CASE(MIPS_GOTSYM); 752 LLVM_READOBJ_TYPE_CASE(MIPS_RLD_MAP); 753 LLVM_READOBJ_TYPE_CASE(MIPS_PLTGOT); 754 default: return "unknown"; 755 } 756} 757 758#undef LLVM_READOBJ_TYPE_CASE 759 760#define LLVM_READOBJ_DT_FLAG_ENT(prefix, enum) \ 761 { #enum, prefix##_##enum } 762 763static const EnumEntry<unsigned> ElfDynamicDTFlags[] = { 764 LLVM_READOBJ_DT_FLAG_ENT(DF, ORIGIN), 765 LLVM_READOBJ_DT_FLAG_ENT(DF, SYMBOLIC), 766 LLVM_READOBJ_DT_FLAG_ENT(DF, TEXTREL), 767 LLVM_READOBJ_DT_FLAG_ENT(DF, BIND_NOW), 768 LLVM_READOBJ_DT_FLAG_ENT(DF, STATIC_TLS) 769}; 770 771static const EnumEntry<unsigned> ElfDynamicDTMipsFlags[] = { 772 LLVM_READOBJ_DT_FLAG_ENT(RHF, NONE), 773 LLVM_READOBJ_DT_FLAG_ENT(RHF, QUICKSTART), 774 LLVM_READOBJ_DT_FLAG_ENT(RHF, NOTPOT), 775 LLVM_READOBJ_DT_FLAG_ENT(RHS, NO_LIBRARY_REPLACEMENT), 776 LLVM_READOBJ_DT_FLAG_ENT(RHF, NO_MOVE), 777 LLVM_READOBJ_DT_FLAG_ENT(RHF, SGI_ONLY), 778 LLVM_READOBJ_DT_FLAG_ENT(RHF, GUARANTEE_INIT), 779 LLVM_READOBJ_DT_FLAG_ENT(RHF, DELTA_C_PLUS_PLUS), 780 LLVM_READOBJ_DT_FLAG_ENT(RHF, GUARANTEE_START_INIT), 781 LLVM_READOBJ_DT_FLAG_ENT(RHF, PIXIE), 782 LLVM_READOBJ_DT_FLAG_ENT(RHF, DEFAULT_DELAY_LOAD), 783 LLVM_READOBJ_DT_FLAG_ENT(RHF, REQUICKSTART), 784 LLVM_READOBJ_DT_FLAG_ENT(RHF, REQUICKSTARTED), 785 LLVM_READOBJ_DT_FLAG_ENT(RHF, CORD), 786 LLVM_READOBJ_DT_FLAG_ENT(RHF, NO_UNRES_UNDEF), 787 LLVM_READOBJ_DT_FLAG_ENT(RHF, RLD_ORDER_SAFE) 788}; 789 790#undef LLVM_READOBJ_DT_FLAG_ENT 791 792template <typename T, typename TFlag> 793void printFlags(T Value, ArrayRef<EnumEntry<TFlag>> Flags, raw_ostream &OS) { 794 typedef EnumEntry<TFlag> FlagEntry; 795 typedef SmallVector<FlagEntry, 10> FlagVector; 796 FlagVector SetFlags; 797 798 for (const auto &Flag : Flags) { 799 if (Flag.Value == 0) 800 continue; 801 802 if ((Value & Flag.Value) == Flag.Value) 803 SetFlags.push_back(Flag); 804 } 805 806 for (const auto &Flag : SetFlags) { 807 OS << Flag.Name << " "; 808 } 809} 810 811template <class ELFT> 812static void printValue(const ELFFile<ELFT> *O, uint64_t Type, uint64_t Value, 813 bool Is64, raw_ostream &OS) { 814 switch (Type) { 815 case DT_PLTREL: 816 if (Value == DT_REL) { 817 OS << "REL"; 818 break; 819 } else if (Value == DT_RELA) { 820 OS << "RELA"; 821 break; 822 } 823 // Fallthrough. 824 case DT_PLTGOT: 825 case DT_HASH: 826 case DT_STRTAB: 827 case DT_SYMTAB: 828 case DT_RELA: 829 case DT_INIT: 830 case DT_FINI: 831 case DT_REL: 832 case DT_JMPREL: 833 case DT_INIT_ARRAY: 834 case DT_FINI_ARRAY: 835 case DT_PREINIT_ARRAY: 836 case DT_DEBUG: 837 case DT_VERNEED: 838 case DT_VERSYM: 839 case DT_GNU_HASH: 840 case DT_NULL: 841 case DT_MIPS_BASE_ADDRESS: 842 case DT_MIPS_GOTSYM: 843 case DT_MIPS_RLD_MAP: 844 case DT_MIPS_PLTGOT: 845 OS << format("0x%" PRIX64, Value); 846 break; 847 case DT_RELCOUNT: 848 case DT_VERNEEDNUM: 849 case DT_MIPS_RLD_VERSION: 850 case DT_MIPS_LOCAL_GOTNO: 851 case DT_MIPS_SYMTABNO: 852 case DT_MIPS_UNREFEXTNO: 853 OS << Value; 854 break; 855 case DT_PLTRELSZ: 856 case DT_RELASZ: 857 case DT_RELAENT: 858 case DT_STRSZ: 859 case DT_SYMENT: 860 case DT_RELSZ: 861 case DT_RELENT: 862 case DT_INIT_ARRAYSZ: 863 case DT_FINI_ARRAYSZ: 864 case DT_PREINIT_ARRAYSZ: 865 OS << Value << " (bytes)"; 866 break; 867 case DT_NEEDED: 868 OS << "SharedLibrary (" << O->getDynamicString(Value) << ")"; 869 break; 870 case DT_SONAME: 871 OS << "LibrarySoname (" << O->getDynamicString(Value) << ")"; 872 break; 873 case DT_RPATH: 874 case DT_RUNPATH: 875 OS << O->getDynamicString(Value); 876 break; 877 case DT_MIPS_FLAGS: 878 printFlags(Value, makeArrayRef(ElfDynamicDTMipsFlags), OS); 879 break; 880 case DT_FLAGS: 881 printFlags(Value, makeArrayRef(ElfDynamicDTFlags), OS); 882 break; 883 } 884} 885 886template<class ELFT> 887void ELFDumper<ELFT>::printUnwindInfo() { 888 W.startLine() << "UnwindInfo not implemented.\n"; 889} 890 891namespace { 892template <> 893void ELFDumper<ELFType<support::little, 2, false> >::printUnwindInfo() { 894 const unsigned Machine = Obj->getHeader()->e_machine; 895 if (Machine == EM_ARM) { 896 ARM::EHABI::PrinterContext<ELFType<support::little, 2, false> > Ctx(W, Obj); 897 return Ctx.PrintUnwindInformation(); 898 } 899 W.startLine() << "UnwindInfo not implemented.\n"; 900} 901} 902 903template<class ELFT> 904void ELFDumper<ELFT>::printDynamicTable() { 905 typedef typename ELFO::Elf_Dyn_Iter EDI; 906 EDI Start = Obj->begin_dynamic_table(), End = Obj->end_dynamic_table(true); 907 908 if (Start == End) 909 return; 910 911 ptrdiff_t Total = std::distance(Start, End); 912 raw_ostream &OS = W.getOStream(); 913 W.startLine() << "DynamicSection [ (" << Total << " entries)\n"; 914 915 bool Is64 = ELFT::Is64Bits; 916 917 W.startLine() 918 << " Tag" << (Is64 ? " " : " ") << "Type" 919 << " " << "Name/Value\n"; 920 for (; Start != End; ++Start) { 921 W.startLine() 922 << " " 923 << format(Is64 ? "0x%016" PRIX64 : "0x%08" PRIX64, Start->getTag()) 924 << " " << format("%-21s", getTypeString(Start->getTag())); 925 printValue(Obj, Start->getTag(), Start->getVal(), Is64, OS); 926 OS << "\n"; 927 } 928 929 W.startLine() << "]\n"; 930} 931 932template<class ELFT> 933void ELFDumper<ELFT>::printNeededLibraries() { 934 ListScope D(W, "NeededLibraries"); 935 936 typedef std::vector<StringRef> LibsTy; 937 LibsTy Libs; 938 939 for (typename ELFO::Elf_Dyn_Iter DynI = Obj->begin_dynamic_table(), 940 DynE = Obj->end_dynamic_table(); 941 DynI != DynE; ++DynI) 942 if (DynI->d_tag == ELF::DT_NEEDED) 943 Libs.push_back(Obj->getDynamicString(DynI->d_un.d_val)); 944 945 std::stable_sort(Libs.begin(), Libs.end()); 946 947 for (LibsTy::const_iterator I = Libs.begin(), E = Libs.end(); I != E; ++I) { 948 outs() << " " << *I << "\n"; 949 } 950} 951 952template<class ELFT> 953void ELFDumper<ELFT>::printProgramHeaders() { 954 ListScope L(W, "ProgramHeaders"); 955 956 for (typename ELFO::Elf_Phdr_Iter PI = Obj->begin_program_headers(), 957 PE = Obj->end_program_headers(); 958 PI != PE; ++PI) { 959 DictScope P(W, "ProgramHeader"); 960 W.printHex ("Type", 961 getElfSegmentType(Obj->getHeader()->e_machine, PI->p_type), 962 PI->p_type); 963 W.printHex ("Offset", PI->p_offset); 964 W.printHex ("VirtualAddress", PI->p_vaddr); 965 W.printHex ("PhysicalAddress", PI->p_paddr); 966 W.printNumber("FileSize", PI->p_filesz); 967 W.printNumber("MemSize", PI->p_memsz); 968 W.printFlags ("Flags", PI->p_flags, makeArrayRef(ElfSegmentFlags)); 969 W.printNumber("Alignment", PI->p_align); 970 } 971} 972 973template <class ELFT> 974void ELFDumper<ELFT>::printAttributes() { 975 W.startLine() << "Attributes not implemented.\n"; 976} 977 978namespace { 979template <> 980void ELFDumper<ELFType<support::little, 2, false> >::printAttributes() { 981 if (Obj->getHeader()->e_machine != EM_ARM) { 982 W.startLine() << "Attributes not implemented.\n"; 983 return; 984 } 985 986 DictScope BA(W, "BuildAttributes"); 987 for (ELFO::Elf_Shdr_Iter SI = Obj->begin_sections(), SE = Obj->end_sections(); 988 SI != SE; ++SI) { 989 if (SI->sh_type != ELF::SHT_ARM_ATTRIBUTES) 990 continue; 991 992 ErrorOr<ArrayRef<uint8_t> > Contents = Obj->getSectionContents(&(*SI)); 993 if (!Contents) 994 continue; 995 996 if ((*Contents)[0] != ARMBuildAttrs::Format_Version) { 997 errs() << "unrecognised FormatVersion: 0x" << utohexstr((*Contents)[0]) 998 << '\n'; 999 continue; 1000 } 1001 1002 W.printHex("FormatVersion", (*Contents)[0]); 1003 if (Contents->size() == 1) 1004 continue; 1005 1006 ARMAttributeParser(W).Parse(*Contents); 1007 } 1008} 1009} 1010 1011