1 //===-- ELFDumper.cpp - ELF-specific dumper ---------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 /// 10 /// \file 11 /// \brief This file implements the ELF-specific dumper for llvm-readobj. 12 /// 13 //===----------------------------------------------------------------------===// 14 15 #include "llvm-readobj.h" 16 #include "ARMAttributeParser.h" 17 #include "ARMEHABIPrinter.h" 18 #include "Error.h" 19 #include "ObjDumper.h" 20 #include "StreamWriter.h" 21 #include "llvm/ADT/SmallString.h" 22 #include "llvm/ADT/StringExtras.h" 23 #include "llvm/Object/ELFObjectFile.h" 24 #include "llvm/Support/ARMBuildAttributes.h" 25 #include "llvm/Support/Compiler.h" 26 #include "llvm/Support/Format.h" 27 #include "llvm/Support/MathExtras.h" 28 #include "llvm/Support/raw_ostream.h" 29 30 using namespace llvm; 31 using namespace llvm::object; 32 using namespace ELF; 33 34 #define LLVM_READOBJ_ENUM_CASE(ns, enum) \ 35 case ns::enum: return #enum; 36 37 namespace { 38 39 template<typename ELFT> 40 class ELFDumper : public ObjDumper { 41 public: 42 ELFDumper(const ELFFile<ELFT> *Obj, StreamWriter &Writer) 43 : ObjDumper(Writer), Obj(Obj) {} 44 45 virtual void printFileHeaders() LLVM_OVERRIDE; 46 virtual void printSections() LLVM_OVERRIDE; 47 virtual void printRelocations() LLVM_OVERRIDE; 48 virtual void printSymbols() LLVM_OVERRIDE; 49 virtual void printDynamicSymbols() LLVM_OVERRIDE; 50 virtual void printUnwindInfo() LLVM_OVERRIDE; 51 52 virtual void printDynamicTable() LLVM_OVERRIDE; 53 virtual void printNeededLibraries() LLVM_OVERRIDE; 54 virtual void printProgramHeaders() LLVM_OVERRIDE; 55 56 virtual void printAttributes() LLVM_OVERRIDE; 57 58 private: 59 typedef ELFFile<ELFT> ELFO; 60 typedef typename ELFO::Elf_Shdr Elf_Shdr; 61 typedef typename ELFO::Elf_Sym Elf_Sym; 62 63 void printSymbol(typename ELFO::Elf_Sym_Iter Symbol); 64 65 void printRelocations(const Elf_Shdr *Sec); 66 void printRelocation(const Elf_Shdr *Sec, typename ELFO::Elf_Rela Rel); 67 68 const ELFO *Obj; 69 }; 70 71 template <class T> T errorOrDefault(ErrorOr<T> Val, T Default = T()) { 72 if (!Val) { 73 error(Val.getError()); 74 return Default; 75 } 76 77 return *Val; 78 } 79 } // namespace 80 81 namespace llvm { 82 83 template <class ELFT> 84 static error_code createELFDumper(const ELFFile<ELFT> *Obj, 85 StreamWriter &Writer, 86 OwningPtr<ObjDumper> &Result) { 87 Result.reset(new ELFDumper<ELFT>(Obj, Writer)); 88 return readobj_error::success; 89 } 90 91 error_code createELFDumper(const object::ObjectFile *Obj, 92 StreamWriter& Writer, 93 OwningPtr<ObjDumper> &Result) { 94 // Little-endian 32-bit 95 if (const ELF32LEObjectFile *ELFObj = dyn_cast<ELF32LEObjectFile>(Obj)) 96 return createELFDumper(ELFObj->getELFFile(), Writer, Result); 97 98 // Big-endian 32-bit 99 if (const ELF32BEObjectFile *ELFObj = dyn_cast<ELF32BEObjectFile>(Obj)) 100 return createELFDumper(ELFObj->getELFFile(), Writer, Result); 101 102 // Little-endian 64-bit 103 if (const ELF64LEObjectFile *ELFObj = dyn_cast<ELF64LEObjectFile>(Obj)) 104 return createELFDumper(ELFObj->getELFFile(), Writer, Result); 105 106 // Big-endian 64-bit 107 if (const ELF64BEObjectFile *ELFObj = dyn_cast<ELF64BEObjectFile>(Obj)) 108 return createELFDumper(ELFObj->getELFFile(), Writer, Result); 109 110 return readobj_error::unsupported_obj_file_format; 111 } 112 113 } // namespace llvm 114 115 static const EnumEntry<unsigned> ElfClass[] = { 116 { "None", ELF::ELFCLASSNONE }, 117 { "32-bit", ELF::ELFCLASS32 }, 118 { "64-bit", ELF::ELFCLASS64 }, 119 }; 120 121 static const EnumEntry<unsigned> ElfDataEncoding[] = { 122 { "None", ELF::ELFDATANONE }, 123 { "LittleEndian", ELF::ELFDATA2LSB }, 124 { "BigEndian", ELF::ELFDATA2MSB }, 125 }; 126 127 static const EnumEntry<unsigned> ElfObjectFileType[] = { 128 { "None", ELF::ET_NONE }, 129 { "Relocatable", ELF::ET_REL }, 130 { "Executable", ELF::ET_EXEC }, 131 { "SharedObject", ELF::ET_DYN }, 132 { "Core", ELF::ET_CORE }, 133 }; 134 135 static const EnumEntry<unsigned> ElfOSABI[] = { 136 { "SystemV", ELF::ELFOSABI_NONE }, 137 { "HPUX", ELF::ELFOSABI_HPUX }, 138 { "NetBSD", ELF::ELFOSABI_NETBSD }, 139 { "GNU/Linux", ELF::ELFOSABI_LINUX }, 140 { "GNU/Hurd", ELF::ELFOSABI_HURD }, 141 { "Solaris", ELF::ELFOSABI_SOLARIS }, 142 { "AIX", ELF::ELFOSABI_AIX }, 143 { "IRIX", ELF::ELFOSABI_IRIX }, 144 { "FreeBSD", ELF::ELFOSABI_FREEBSD }, 145 { "TRU64", ELF::ELFOSABI_TRU64 }, 146 { "Modesto", ELF::ELFOSABI_MODESTO }, 147 { "OpenBSD", ELF::ELFOSABI_OPENBSD }, 148 { "OpenVMS", ELF::ELFOSABI_OPENVMS }, 149 { "NSK", ELF::ELFOSABI_NSK }, 150 { "AROS", ELF::ELFOSABI_AROS }, 151 { "FenixOS", ELF::ELFOSABI_FENIXOS }, 152 { "C6000_ELFABI", ELF::ELFOSABI_C6000_ELFABI }, 153 { "C6000_LINUX" , ELF::ELFOSABI_C6000_LINUX }, 154 { "ARM", ELF::ELFOSABI_ARM }, 155 { "Standalone" , ELF::ELFOSABI_STANDALONE } 156 }; 157 158 static const EnumEntry<unsigned> ElfMachineType[] = { 159 LLVM_READOBJ_ENUM_ENT(ELF, EM_NONE ), 160 LLVM_READOBJ_ENUM_ENT(ELF, EM_M32 ), 161 LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARC ), 162 LLVM_READOBJ_ENUM_ENT(ELF, EM_386 ), 163 LLVM_READOBJ_ENUM_ENT(ELF, EM_68K ), 164 LLVM_READOBJ_ENUM_ENT(ELF, EM_88K ), 165 LLVM_READOBJ_ENUM_ENT(ELF, EM_486 ), 166 LLVM_READOBJ_ENUM_ENT(ELF, EM_860 ), 167 LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS ), 168 LLVM_READOBJ_ENUM_ENT(ELF, EM_S370 ), 169 LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS_RS3_LE ), 170 LLVM_READOBJ_ENUM_ENT(ELF, EM_PARISC ), 171 LLVM_READOBJ_ENUM_ENT(ELF, EM_VPP500 ), 172 LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARC32PLUS ), 173 LLVM_READOBJ_ENUM_ENT(ELF, EM_960 ), 174 LLVM_READOBJ_ENUM_ENT(ELF, EM_PPC ), 175 LLVM_READOBJ_ENUM_ENT(ELF, EM_PPC64 ), 176 LLVM_READOBJ_ENUM_ENT(ELF, EM_S390 ), 177 LLVM_READOBJ_ENUM_ENT(ELF, EM_SPU ), 178 LLVM_READOBJ_ENUM_ENT(ELF, EM_V800 ), 179 LLVM_READOBJ_ENUM_ENT(ELF, EM_FR20 ), 180 LLVM_READOBJ_ENUM_ENT(ELF, EM_RH32 ), 181 LLVM_READOBJ_ENUM_ENT(ELF, EM_RCE ), 182 LLVM_READOBJ_ENUM_ENT(ELF, EM_ARM ), 183 LLVM_READOBJ_ENUM_ENT(ELF, EM_ALPHA ), 184 LLVM_READOBJ_ENUM_ENT(ELF, EM_SH ), 185 LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARCV9 ), 186 LLVM_READOBJ_ENUM_ENT(ELF, EM_TRICORE ), 187 LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC ), 188 LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_300 ), 189 LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_300H ), 190 LLVM_READOBJ_ENUM_ENT(ELF, EM_H8S ), 191 LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_500 ), 192 LLVM_READOBJ_ENUM_ENT(ELF, EM_IA_64 ), 193 LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS_X ), 194 LLVM_READOBJ_ENUM_ENT(ELF, EM_COLDFIRE ), 195 LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC12 ), 196 LLVM_READOBJ_ENUM_ENT(ELF, EM_MMA ), 197 LLVM_READOBJ_ENUM_ENT(ELF, EM_PCP ), 198 LLVM_READOBJ_ENUM_ENT(ELF, EM_NCPU ), 199 LLVM_READOBJ_ENUM_ENT(ELF, EM_NDR1 ), 200 LLVM_READOBJ_ENUM_ENT(ELF, EM_STARCORE ), 201 LLVM_READOBJ_ENUM_ENT(ELF, EM_ME16 ), 202 LLVM_READOBJ_ENUM_ENT(ELF, EM_ST100 ), 203 LLVM_READOBJ_ENUM_ENT(ELF, EM_TINYJ ), 204 LLVM_READOBJ_ENUM_ENT(ELF, EM_X86_64 ), 205 LLVM_READOBJ_ENUM_ENT(ELF, EM_PDSP ), 206 LLVM_READOBJ_ENUM_ENT(ELF, EM_PDP10 ), 207 LLVM_READOBJ_ENUM_ENT(ELF, EM_PDP11 ), 208 LLVM_READOBJ_ENUM_ENT(ELF, EM_FX66 ), 209 LLVM_READOBJ_ENUM_ENT(ELF, EM_ST9PLUS ), 210 LLVM_READOBJ_ENUM_ENT(ELF, EM_ST7 ), 211 LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC16 ), 212 LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC11 ), 213 LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC08 ), 214 LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC05 ), 215 LLVM_READOBJ_ENUM_ENT(ELF, EM_SVX ), 216 LLVM_READOBJ_ENUM_ENT(ELF, EM_ST19 ), 217 LLVM_READOBJ_ENUM_ENT(ELF, EM_VAX ), 218 LLVM_READOBJ_ENUM_ENT(ELF, EM_CRIS ), 219 LLVM_READOBJ_ENUM_ENT(ELF, EM_JAVELIN ), 220 LLVM_READOBJ_ENUM_ENT(ELF, EM_FIREPATH ), 221 LLVM_READOBJ_ENUM_ENT(ELF, EM_ZSP ), 222 LLVM_READOBJ_ENUM_ENT(ELF, EM_MMIX ), 223 LLVM_READOBJ_ENUM_ENT(ELF, EM_HUANY ), 224 LLVM_READOBJ_ENUM_ENT(ELF, EM_PRISM ), 225 LLVM_READOBJ_ENUM_ENT(ELF, EM_AVR ), 226 LLVM_READOBJ_ENUM_ENT(ELF, EM_FR30 ), 227 LLVM_READOBJ_ENUM_ENT(ELF, EM_D10V ), 228 LLVM_READOBJ_ENUM_ENT(ELF, EM_D30V ), 229 LLVM_READOBJ_ENUM_ENT(ELF, EM_V850 ), 230 LLVM_READOBJ_ENUM_ENT(ELF, EM_M32R ), 231 LLVM_READOBJ_ENUM_ENT(ELF, EM_MN10300 ), 232 LLVM_READOBJ_ENUM_ENT(ELF, EM_MN10200 ), 233 LLVM_READOBJ_ENUM_ENT(ELF, EM_PJ ), 234 LLVM_READOBJ_ENUM_ENT(ELF, EM_OPENRISC ), 235 LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC_COMPACT ), 236 LLVM_READOBJ_ENUM_ENT(ELF, EM_XTENSA ), 237 LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE ), 238 LLVM_READOBJ_ENUM_ENT(ELF, EM_TMM_GPP ), 239 LLVM_READOBJ_ENUM_ENT(ELF, EM_NS32K ), 240 LLVM_READOBJ_ENUM_ENT(ELF, EM_TPC ), 241 LLVM_READOBJ_ENUM_ENT(ELF, EM_SNP1K ), 242 LLVM_READOBJ_ENUM_ENT(ELF, EM_ST200 ), 243 LLVM_READOBJ_ENUM_ENT(ELF, EM_IP2K ), 244 LLVM_READOBJ_ENUM_ENT(ELF, EM_MAX ), 245 LLVM_READOBJ_ENUM_ENT(ELF, EM_CR ), 246 LLVM_READOBJ_ENUM_ENT(ELF, EM_F2MC16 ), 247 LLVM_READOBJ_ENUM_ENT(ELF, EM_MSP430 ), 248 LLVM_READOBJ_ENUM_ENT(ELF, EM_BLACKFIN ), 249 LLVM_READOBJ_ENUM_ENT(ELF, EM_SE_C33 ), 250 LLVM_READOBJ_ENUM_ENT(ELF, EM_SEP ), 251 LLVM_READOBJ_ENUM_ENT(ELF, EM_ARCA ), 252 LLVM_READOBJ_ENUM_ENT(ELF, EM_UNICORE ), 253 LLVM_READOBJ_ENUM_ENT(ELF, EM_EXCESS ), 254 LLVM_READOBJ_ENUM_ENT(ELF, EM_DXP ), 255 LLVM_READOBJ_ENUM_ENT(ELF, EM_ALTERA_NIOS2 ), 256 LLVM_READOBJ_ENUM_ENT(ELF, EM_CRX ), 257 LLVM_READOBJ_ENUM_ENT(ELF, EM_XGATE ), 258 LLVM_READOBJ_ENUM_ENT(ELF, EM_C166 ), 259 LLVM_READOBJ_ENUM_ENT(ELF, EM_M16C ), 260 LLVM_READOBJ_ENUM_ENT(ELF, EM_DSPIC30F ), 261 LLVM_READOBJ_ENUM_ENT(ELF, EM_CE ), 262 LLVM_READOBJ_ENUM_ENT(ELF, EM_M32C ), 263 LLVM_READOBJ_ENUM_ENT(ELF, EM_TSK3000 ), 264 LLVM_READOBJ_ENUM_ENT(ELF, EM_RS08 ), 265 LLVM_READOBJ_ENUM_ENT(ELF, EM_SHARC ), 266 LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG2 ), 267 LLVM_READOBJ_ENUM_ENT(ELF, EM_SCORE7 ), 268 LLVM_READOBJ_ENUM_ENT(ELF, EM_DSP24 ), 269 LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE3 ), 270 LLVM_READOBJ_ENUM_ENT(ELF, EM_LATTICEMICO32), 271 LLVM_READOBJ_ENUM_ENT(ELF, EM_SE_C17 ), 272 LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C6000 ), 273 LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C2000 ), 274 LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C5500 ), 275 LLVM_READOBJ_ENUM_ENT(ELF, EM_MMDSP_PLUS ), 276 LLVM_READOBJ_ENUM_ENT(ELF, EM_CYPRESS_M8C ), 277 LLVM_READOBJ_ENUM_ENT(ELF, EM_R32C ), 278 LLVM_READOBJ_ENUM_ENT(ELF, EM_TRIMEDIA ), 279 LLVM_READOBJ_ENUM_ENT(ELF, EM_HEXAGON ), 280 LLVM_READOBJ_ENUM_ENT(ELF, EM_8051 ), 281 LLVM_READOBJ_ENUM_ENT(ELF, EM_STXP7X ), 282 LLVM_READOBJ_ENUM_ENT(ELF, EM_NDS32 ), 283 LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG1 ), 284 LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG1X ), 285 LLVM_READOBJ_ENUM_ENT(ELF, EM_MAXQ30 ), 286 LLVM_READOBJ_ENUM_ENT(ELF, EM_XIMO16 ), 287 LLVM_READOBJ_ENUM_ENT(ELF, EM_MANIK ), 288 LLVM_READOBJ_ENUM_ENT(ELF, EM_CRAYNV2 ), 289 LLVM_READOBJ_ENUM_ENT(ELF, EM_RX ), 290 LLVM_READOBJ_ENUM_ENT(ELF, EM_METAG ), 291 LLVM_READOBJ_ENUM_ENT(ELF, EM_MCST_ELBRUS ), 292 LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG16 ), 293 LLVM_READOBJ_ENUM_ENT(ELF, EM_CR16 ), 294 LLVM_READOBJ_ENUM_ENT(ELF, EM_ETPU ), 295 LLVM_READOBJ_ENUM_ENT(ELF, EM_SLE9X ), 296 LLVM_READOBJ_ENUM_ENT(ELF, EM_L10M ), 297 LLVM_READOBJ_ENUM_ENT(ELF, EM_K10M ), 298 LLVM_READOBJ_ENUM_ENT(ELF, EM_AARCH64 ), 299 LLVM_READOBJ_ENUM_ENT(ELF, EM_AVR32 ), 300 LLVM_READOBJ_ENUM_ENT(ELF, EM_STM8 ), 301 LLVM_READOBJ_ENUM_ENT(ELF, EM_TILE64 ), 302 LLVM_READOBJ_ENUM_ENT(ELF, EM_TILEPRO ), 303 LLVM_READOBJ_ENUM_ENT(ELF, EM_CUDA ), 304 LLVM_READOBJ_ENUM_ENT(ELF, EM_TILEGX ), 305 LLVM_READOBJ_ENUM_ENT(ELF, EM_CLOUDSHIELD ), 306 LLVM_READOBJ_ENUM_ENT(ELF, EM_COREA_1ST ), 307 LLVM_READOBJ_ENUM_ENT(ELF, EM_COREA_2ND ), 308 LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC_COMPACT2 ), 309 LLVM_READOBJ_ENUM_ENT(ELF, EM_OPEN8 ), 310 LLVM_READOBJ_ENUM_ENT(ELF, EM_RL78 ), 311 LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE5 ), 312 LLVM_READOBJ_ENUM_ENT(ELF, EM_78KOR ), 313 LLVM_READOBJ_ENUM_ENT(ELF, EM_56800EX ) 314 }; 315 316 static const EnumEntry<unsigned> ElfSymbolBindings[] = { 317 { "Local", ELF::STB_LOCAL }, 318 { "Global", ELF::STB_GLOBAL }, 319 { "Weak", ELF::STB_WEAK } 320 }; 321 322 static const EnumEntry<unsigned> ElfSymbolTypes[] = { 323 { "None", ELF::STT_NOTYPE }, 324 { "Object", ELF::STT_OBJECT }, 325 { "Function", ELF::STT_FUNC }, 326 { "Section", ELF::STT_SECTION }, 327 { "File", ELF::STT_FILE }, 328 { "Common", ELF::STT_COMMON }, 329 { "TLS", ELF::STT_TLS }, 330 { "GNU_IFunc", ELF::STT_GNU_IFUNC } 331 }; 332 333 static const char *getElfSectionType(unsigned Arch, unsigned Type) { 334 switch (Arch) { 335 case ELF::EM_ARM: 336 switch (Type) { 337 LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_EXIDX); 338 LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_PREEMPTMAP); 339 LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_ATTRIBUTES); 340 LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_DEBUGOVERLAY); 341 LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_OVERLAYSECTION); 342 } 343 case ELF::EM_HEXAGON: 344 switch (Type) { LLVM_READOBJ_ENUM_CASE(ELF, SHT_HEX_ORDERED); } 345 case ELF::EM_X86_64: 346 switch (Type) { LLVM_READOBJ_ENUM_CASE(ELF, SHT_X86_64_UNWIND); } 347 case ELF::EM_MIPS: 348 case ELF::EM_MIPS_RS3_LE: 349 switch (Type) { 350 LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_REGINFO); 351 LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_OPTIONS); 352 } 353 } 354 355 switch (Type) { 356 LLVM_READOBJ_ENUM_CASE(ELF, SHT_NULL ); 357 LLVM_READOBJ_ENUM_CASE(ELF, SHT_PROGBITS ); 358 LLVM_READOBJ_ENUM_CASE(ELF, SHT_SYMTAB ); 359 LLVM_READOBJ_ENUM_CASE(ELF, SHT_STRTAB ); 360 LLVM_READOBJ_ENUM_CASE(ELF, SHT_RELA ); 361 LLVM_READOBJ_ENUM_CASE(ELF, SHT_HASH ); 362 LLVM_READOBJ_ENUM_CASE(ELF, SHT_DYNAMIC ); 363 LLVM_READOBJ_ENUM_CASE(ELF, SHT_NOTE ); 364 LLVM_READOBJ_ENUM_CASE(ELF, SHT_NOBITS ); 365 LLVM_READOBJ_ENUM_CASE(ELF, SHT_REL ); 366 LLVM_READOBJ_ENUM_CASE(ELF, SHT_SHLIB ); 367 LLVM_READOBJ_ENUM_CASE(ELF, SHT_DYNSYM ); 368 LLVM_READOBJ_ENUM_CASE(ELF, SHT_INIT_ARRAY ); 369 LLVM_READOBJ_ENUM_CASE(ELF, SHT_FINI_ARRAY ); 370 LLVM_READOBJ_ENUM_CASE(ELF, SHT_PREINIT_ARRAY ); 371 LLVM_READOBJ_ENUM_CASE(ELF, SHT_GROUP ); 372 LLVM_READOBJ_ENUM_CASE(ELF, SHT_SYMTAB_SHNDX ); 373 LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_ATTRIBUTES ); 374 LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_HASH ); 375 LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_verdef ); 376 LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_verneed ); 377 LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_versym ); 378 default: return ""; 379 } 380 } 381 382 static const EnumEntry<unsigned> ElfSectionFlags[] = { 383 LLVM_READOBJ_ENUM_ENT(ELF, SHF_WRITE ), 384 LLVM_READOBJ_ENUM_ENT(ELF, SHF_ALLOC ), 385 LLVM_READOBJ_ENUM_ENT(ELF, SHF_EXCLUDE ), 386 LLVM_READOBJ_ENUM_ENT(ELF, SHF_EXECINSTR ), 387 LLVM_READOBJ_ENUM_ENT(ELF, SHF_MERGE ), 388 LLVM_READOBJ_ENUM_ENT(ELF, SHF_STRINGS ), 389 LLVM_READOBJ_ENUM_ENT(ELF, SHF_INFO_LINK ), 390 LLVM_READOBJ_ENUM_ENT(ELF, SHF_LINK_ORDER ), 391 LLVM_READOBJ_ENUM_ENT(ELF, SHF_OS_NONCONFORMING), 392 LLVM_READOBJ_ENUM_ENT(ELF, SHF_GROUP ), 393 LLVM_READOBJ_ENUM_ENT(ELF, SHF_TLS ), 394 LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_CP_SECTION), 395 LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_DP_SECTION), 396 LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NOSTRIP ) 397 }; 398 399 static const char *getElfSegmentType(unsigned Arch, unsigned Type) { 400 // Check potentially overlapped processor-specific 401 // program header type. 402 switch (Arch) { 403 case ELF::EM_ARM: 404 switch (Type) { 405 LLVM_READOBJ_ENUM_CASE(ELF, PT_ARM_EXIDX); 406 } 407 case ELF::EM_MIPS: 408 case ELF::EM_MIPS_RS3_LE: 409 switch (Type) { 410 LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_REGINFO); 411 LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_RTPROC); 412 LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_OPTIONS); 413 } 414 } 415 416 switch (Type) { 417 LLVM_READOBJ_ENUM_CASE(ELF, PT_NULL ); 418 LLVM_READOBJ_ENUM_CASE(ELF, PT_LOAD ); 419 LLVM_READOBJ_ENUM_CASE(ELF, PT_DYNAMIC); 420 LLVM_READOBJ_ENUM_CASE(ELF, PT_INTERP ); 421 LLVM_READOBJ_ENUM_CASE(ELF, PT_NOTE ); 422 LLVM_READOBJ_ENUM_CASE(ELF, PT_SHLIB ); 423 LLVM_READOBJ_ENUM_CASE(ELF, PT_PHDR ); 424 LLVM_READOBJ_ENUM_CASE(ELF, PT_TLS ); 425 426 LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_EH_FRAME); 427 LLVM_READOBJ_ENUM_CASE(ELF, PT_SUNW_UNWIND); 428 429 LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_STACK); 430 LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_RELRO); 431 default: return ""; 432 } 433 } 434 435 static const EnumEntry<unsigned> ElfSegmentFlags[] = { 436 LLVM_READOBJ_ENUM_ENT(ELF, PF_X), 437 LLVM_READOBJ_ENUM_ENT(ELF, PF_W), 438 LLVM_READOBJ_ENUM_ENT(ELF, PF_R) 439 }; 440 441 template<class ELFT> 442 void ELFDumper<ELFT>::printFileHeaders() { 443 const typename ELFO::Elf_Ehdr *Header = Obj->getHeader(); 444 445 { 446 DictScope D(W, "ElfHeader"); 447 { 448 DictScope D(W, "Ident"); 449 W.printBinary("Magic", makeArrayRef(Header->e_ident).slice(ELF::EI_MAG0, 450 4)); 451 W.printEnum ("Class", Header->e_ident[ELF::EI_CLASS], 452 makeArrayRef(ElfClass)); 453 W.printEnum ("DataEncoding", Header->e_ident[ELF::EI_DATA], 454 makeArrayRef(ElfDataEncoding)); 455 W.printNumber("FileVersion", Header->e_ident[ELF::EI_VERSION]); 456 W.printEnum ("OS/ABI", Header->e_ident[ELF::EI_OSABI], 457 makeArrayRef(ElfOSABI)); 458 W.printNumber("ABIVersion", Header->e_ident[ELF::EI_ABIVERSION]); 459 W.printBinary("Unused", makeArrayRef(Header->e_ident).slice(ELF::EI_PAD)); 460 } 461 462 W.printEnum ("Type", Header->e_type, makeArrayRef(ElfObjectFileType)); 463 W.printEnum ("Machine", Header->e_machine, makeArrayRef(ElfMachineType)); 464 W.printNumber("Version", Header->e_version); 465 W.printHex ("Entry", Header->e_entry); 466 W.printHex ("ProgramHeaderOffset", Header->e_phoff); 467 W.printHex ("SectionHeaderOffset", Header->e_shoff); 468 W.printFlags ("Flags", Header->e_flags); 469 W.printNumber("HeaderSize", Header->e_ehsize); 470 W.printNumber("ProgramHeaderEntrySize", Header->e_phentsize); 471 W.printNumber("ProgramHeaderCount", Header->e_phnum); 472 W.printNumber("SectionHeaderEntrySize", Header->e_shentsize); 473 W.printNumber("SectionHeaderCount", Header->e_shnum); 474 W.printNumber("StringTableSectionIndex", Header->e_shstrndx); 475 } 476 } 477 478 template<class ELFT> 479 void ELFDumper<ELFT>::printSections() { 480 ListScope SectionsD(W, "Sections"); 481 482 int SectionIndex = -1; 483 for (typename ELFO::Elf_Shdr_Iter SecI = Obj->begin_sections(), 484 SecE = Obj->end_sections(); 485 SecI != SecE; ++SecI) { 486 ++SectionIndex; 487 488 const Elf_Shdr *Section = &*SecI; 489 StringRef Name = errorOrDefault(Obj->getSectionName(Section)); 490 491 DictScope SectionD(W, "Section"); 492 W.printNumber("Index", SectionIndex); 493 W.printNumber("Name", Name, Section->sh_name); 494 W.printHex("Type", 495 getElfSectionType(Obj->getHeader()->e_machine, Section->sh_type), 496 Section->sh_type); 497 W.printFlags ("Flags", Section->sh_flags, makeArrayRef(ElfSectionFlags)); 498 W.printHex ("Address", Section->sh_addr); 499 W.printHex ("Offset", Section->sh_offset); 500 W.printNumber("Size", Section->sh_size); 501 W.printNumber("Link", Section->sh_link); 502 W.printNumber("Info", Section->sh_info); 503 W.printNumber("AddressAlignment", Section->sh_addralign); 504 W.printNumber("EntrySize", Section->sh_entsize); 505 506 if (opts::SectionRelocations) { 507 ListScope D(W, "Relocations"); 508 printRelocations(Section); 509 } 510 511 if (opts::SectionSymbols) { 512 ListScope D(W, "Symbols"); 513 for (typename ELFO::Elf_Sym_Iter SymI = Obj->begin_symbols(), 514 SymE = Obj->end_symbols(); 515 SymI != SymE; ++SymI) { 516 if (Obj->getSection(&*SymI) == Section) 517 printSymbol(SymI); 518 } 519 } 520 521 if (opts::SectionData) { 522 ArrayRef<uint8_t> Data = errorOrDefault(Obj->getSectionContents(Section)); 523 W.printBinaryBlock("SectionData", 524 StringRef((const char *)Data.data(), Data.size())); 525 } 526 } 527 } 528 529 template<class ELFT> 530 void ELFDumper<ELFT>::printRelocations() { 531 ListScope D(W, "Relocations"); 532 533 int SectionNumber = -1; 534 for (typename ELFO::Elf_Shdr_Iter SecI = Obj->begin_sections(), 535 SecE = Obj->end_sections(); 536 SecI != SecE; ++SecI) { 537 ++SectionNumber; 538 539 if (SecI->sh_type != ELF::SHT_REL && SecI->sh_type != ELF::SHT_RELA) 540 continue; 541 542 StringRef Name = errorOrDefault(Obj->getSectionName(&*SecI)); 543 544 W.startLine() << "Section (" << SectionNumber << ") " << Name << " {\n"; 545 W.indent(); 546 547 printRelocations(&*SecI); 548 549 W.unindent(); 550 W.startLine() << "}\n"; 551 } 552 } 553 554 template <class ELFT> 555 void ELFDumper<ELFT>::printRelocations(const Elf_Shdr *Sec) { 556 switch (Sec->sh_type) { 557 case ELF::SHT_REL: 558 for (typename ELFO::Elf_Rel_Iter RI = Obj->begin_rel(Sec), 559 RE = Obj->end_rel(Sec); 560 RI != RE; ++RI) { 561 typename ELFO::Elf_Rela Rela; 562 Rela.r_offset = RI->r_offset; 563 Rela.r_info = RI->r_info; 564 Rela.r_addend = 0; 565 printRelocation(Sec, Rela); 566 } 567 break; 568 case ELF::SHT_RELA: 569 for (typename ELFO::Elf_Rela_Iter RI = Obj->begin_rela(Sec), 570 RE = Obj->end_rela(Sec); 571 RI != RE; ++RI) { 572 printRelocation(Sec, *RI); 573 } 574 break; 575 } 576 } 577 578 template <class ELFT> 579 void ELFDumper<ELFT>::printRelocation(const Elf_Shdr *Sec, 580 typename ELFO::Elf_Rela Rel) { 581 SmallString<32> RelocName; 582 Obj->getRelocationTypeName(Rel.getType(Obj->isMips64EL()), RelocName); 583 StringRef SymbolName; 584 std::pair<const Elf_Shdr *, const Elf_Sym *> Sym = 585 Obj->getRelocationSymbol(Sec, &Rel); 586 if (Sym.first) 587 SymbolName = errorOrDefault(Obj->getSymbolName(Sym.first, Sym.second)); 588 589 if (opts::ExpandRelocs) { 590 DictScope Group(W, "Relocation"); 591 W.printHex("Offset", Rel.r_offset); 592 W.printNumber("Type", RelocName, (int)Rel.getType(Obj->isMips64EL())); 593 W.printString("Symbol", SymbolName.size() > 0 ? SymbolName : "-"); 594 W.printHex("Addend", Rel.r_addend); 595 } else { 596 raw_ostream& OS = W.startLine(); 597 OS << W.hex(Rel.r_offset) 598 << " " << RelocName 599 << " " << (SymbolName.size() > 0 ? SymbolName : "-") 600 << " " << W.hex(Rel.r_addend) 601 << "\n"; 602 } 603 } 604 605 template<class ELFT> 606 void ELFDumper<ELFT>::printSymbols() { 607 ListScope Group(W, "Symbols"); 608 for (typename ELFO::Elf_Sym_Iter SymI = Obj->begin_symbols(), 609 SymE = Obj->end_symbols(); 610 SymI != SymE; ++SymI) { 611 printSymbol(SymI); 612 } 613 } 614 615 template<class ELFT> 616 void ELFDumper<ELFT>::printDynamicSymbols() { 617 ListScope Group(W, "DynamicSymbols"); 618 619 for (typename ELFO::Elf_Sym_Iter SymI = Obj->begin_dynamic_symbols(), 620 SymE = Obj->end_dynamic_symbols(); 621 SymI != SymE; ++SymI) { 622 printSymbol(SymI); 623 } 624 } 625 626 template <class ELFT> 627 void ELFDumper<ELFT>::printSymbol(typename ELFO::Elf_Sym_Iter Symbol) { 628 StringRef SymbolName = errorOrDefault(Obj->getSymbolName(Symbol)); 629 const Elf_Shdr *Sec = Obj->getSection(&*Symbol); 630 StringRef SectionName = Sec ? errorOrDefault(Obj->getSectionName(Sec)) : ""; 631 std::string FullSymbolName(SymbolName); 632 if (Symbol.isDynamic()) { 633 bool IsDefault; 634 ErrorOr<StringRef> Version = Obj->getSymbolVersion(0, &*Symbol, IsDefault); 635 if (Version) { 636 FullSymbolName += (IsDefault ? "@@" : "@"); 637 FullSymbolName += *Version; 638 } else 639 error(Version.getError()); 640 } 641 642 DictScope D(W, "Symbol"); 643 W.printNumber("Name", FullSymbolName, Symbol->st_name); 644 W.printHex ("Value", Symbol->st_value); 645 W.printNumber("Size", Symbol->st_size); 646 W.printEnum ("Binding", Symbol->getBinding(), 647 makeArrayRef(ElfSymbolBindings)); 648 W.printEnum ("Type", Symbol->getType(), makeArrayRef(ElfSymbolTypes)); 649 W.printNumber("Other", Symbol->st_other); 650 W.printHex ("Section", SectionName, Symbol->st_shndx); 651 } 652 653 #define LLVM_READOBJ_TYPE_CASE(name) \ 654 case DT_##name: return #name 655 656 static const char *getTypeString(uint64_t Type) { 657 switch (Type) { 658 LLVM_READOBJ_TYPE_CASE(BIND_NOW); 659 LLVM_READOBJ_TYPE_CASE(DEBUG); 660 LLVM_READOBJ_TYPE_CASE(FINI); 661 LLVM_READOBJ_TYPE_CASE(FINI_ARRAY); 662 LLVM_READOBJ_TYPE_CASE(FINI_ARRAYSZ); 663 LLVM_READOBJ_TYPE_CASE(FLAGS); 664 LLVM_READOBJ_TYPE_CASE(HASH); 665 LLVM_READOBJ_TYPE_CASE(INIT); 666 LLVM_READOBJ_TYPE_CASE(INIT_ARRAY); 667 LLVM_READOBJ_TYPE_CASE(INIT_ARRAYSZ); 668 LLVM_READOBJ_TYPE_CASE(PREINIT_ARRAY); 669 LLVM_READOBJ_TYPE_CASE(PREINIT_ARRAYSZ); 670 LLVM_READOBJ_TYPE_CASE(JMPREL); 671 LLVM_READOBJ_TYPE_CASE(NEEDED); 672 LLVM_READOBJ_TYPE_CASE(NULL); 673 LLVM_READOBJ_TYPE_CASE(PLTGOT); 674 LLVM_READOBJ_TYPE_CASE(PLTREL); 675 LLVM_READOBJ_TYPE_CASE(PLTRELSZ); 676 LLVM_READOBJ_TYPE_CASE(REL); 677 LLVM_READOBJ_TYPE_CASE(RELA); 678 LLVM_READOBJ_TYPE_CASE(RELENT); 679 LLVM_READOBJ_TYPE_CASE(RELSZ); 680 LLVM_READOBJ_TYPE_CASE(RELAENT); 681 LLVM_READOBJ_TYPE_CASE(RELASZ); 682 LLVM_READOBJ_TYPE_CASE(RPATH); 683 LLVM_READOBJ_TYPE_CASE(RUNPATH); 684 LLVM_READOBJ_TYPE_CASE(SONAME); 685 LLVM_READOBJ_TYPE_CASE(STRSZ); 686 LLVM_READOBJ_TYPE_CASE(STRTAB); 687 LLVM_READOBJ_TYPE_CASE(SYMBOLIC); 688 LLVM_READOBJ_TYPE_CASE(SYMENT); 689 LLVM_READOBJ_TYPE_CASE(SYMTAB); 690 LLVM_READOBJ_TYPE_CASE(TEXTREL); 691 LLVM_READOBJ_TYPE_CASE(VERNEED); 692 LLVM_READOBJ_TYPE_CASE(VERNEEDNUM); 693 LLVM_READOBJ_TYPE_CASE(VERSYM); 694 LLVM_READOBJ_TYPE_CASE(MIPS_RLD_VERSION); 695 LLVM_READOBJ_TYPE_CASE(MIPS_FLAGS); 696 LLVM_READOBJ_TYPE_CASE(MIPS_BASE_ADDRESS); 697 LLVM_READOBJ_TYPE_CASE(MIPS_LOCAL_GOTNO); 698 LLVM_READOBJ_TYPE_CASE(MIPS_SYMTABNO); 699 LLVM_READOBJ_TYPE_CASE(MIPS_UNREFEXTNO); 700 LLVM_READOBJ_TYPE_CASE(MIPS_GOTSYM); 701 LLVM_READOBJ_TYPE_CASE(MIPS_RLD_MAP); 702 LLVM_READOBJ_TYPE_CASE(MIPS_PLTGOT); 703 default: return "unknown"; 704 } 705 } 706 707 #undef LLVM_READOBJ_TYPE_CASE 708 709 template <class ELFT> 710 static void printValue(const ELFFile<ELFT> *O, uint64_t Type, uint64_t Value, 711 bool Is64, raw_ostream &OS) { 712 switch (Type) { 713 case DT_PLTREL: 714 if (Value == DT_REL) { 715 OS << "REL"; 716 break; 717 } else if (Value == DT_RELA) { 718 OS << "RELA"; 719 break; 720 } 721 // Fallthrough. 722 case DT_PLTGOT: 723 case DT_HASH: 724 case DT_STRTAB: 725 case DT_SYMTAB: 726 case DT_RELA: 727 case DT_INIT: 728 case DT_FINI: 729 case DT_REL: 730 case DT_JMPREL: 731 case DT_INIT_ARRAY: 732 case DT_FINI_ARRAY: 733 case DT_PREINIT_ARRAY: 734 case DT_DEBUG: 735 case DT_VERNEED: 736 case DT_VERSYM: 737 case DT_NULL: 738 case DT_MIPS_FLAGS: 739 case DT_MIPS_BASE_ADDRESS: 740 case DT_MIPS_GOTSYM: 741 case DT_MIPS_RLD_MAP: 742 case DT_MIPS_PLTGOT: 743 OS << format("0x%" PRIX64, Value); 744 break; 745 case DT_VERNEEDNUM: 746 case DT_MIPS_RLD_VERSION: 747 case DT_MIPS_LOCAL_GOTNO: 748 case DT_MIPS_SYMTABNO: 749 case DT_MIPS_UNREFEXTNO: 750 OS << Value; 751 break; 752 case DT_PLTRELSZ: 753 case DT_RELASZ: 754 case DT_RELAENT: 755 case DT_STRSZ: 756 case DT_SYMENT: 757 case DT_RELSZ: 758 case DT_RELENT: 759 case DT_INIT_ARRAYSZ: 760 case DT_FINI_ARRAYSZ: 761 case DT_PREINIT_ARRAYSZ: 762 OS << Value << " (bytes)"; 763 break; 764 case DT_NEEDED: 765 OS << "SharedLibrary (" << O->getDynamicString(Value) << ")"; 766 break; 767 case DT_SONAME: 768 OS << "LibrarySoname (" << O->getDynamicString(Value) << ")"; 769 break; 770 case DT_RPATH: 771 case DT_RUNPATH: 772 OS << O->getDynamicString(Value); 773 break; 774 } 775 } 776 777 template<class ELFT> 778 void ELFDumper<ELFT>::printUnwindInfo() { 779 W.startLine() << "UnwindInfo not implemented.\n"; 780 } 781 782 namespace { 783 template <> 784 void ELFDumper<ELFType<support::little, 2, false> >::printUnwindInfo() { 785 const unsigned Machine = Obj->getHeader()->e_machine; 786 if (Machine == EM_ARM) { 787 ARM::EHABI::PrinterContext<ELFType<support::little, 2, false> > Ctx(W, Obj); 788 return Ctx.PrintUnwindInformation(); 789 } 790 W.startLine() << "UnwindInfo not implemented.\n"; 791 } 792 } 793 794 template<class ELFT> 795 void ELFDumper<ELFT>::printDynamicTable() { 796 typedef typename ELFO::Elf_Dyn_Iter EDI; 797 EDI Start = Obj->begin_dynamic_table(), End = Obj->end_dynamic_table(true); 798 799 if (Start == End) 800 return; 801 802 ptrdiff_t Total = std::distance(Start, End); 803 raw_ostream &OS = W.getOStream(); 804 W.startLine() << "DynamicSection [ (" << Total << " entries)\n"; 805 806 bool Is64 = ELFT::Is64Bits; 807 808 W.startLine() 809 << " Tag" << (Is64 ? " " : " ") << "Type" 810 << " " << "Name/Value\n"; 811 for (; Start != End; ++Start) { 812 W.startLine() 813 << " " 814 << format(Is64 ? "0x%016" PRIX64 : "0x%08" PRIX64, Start->getTag()) 815 << " " << format("%-21s", getTypeString(Start->getTag())); 816 printValue(Obj, Start->getTag(), Start->getVal(), Is64, OS); 817 OS << "\n"; 818 } 819 820 W.startLine() << "]\n"; 821 } 822 823 template<class ELFT> 824 void ELFDumper<ELFT>::printNeededLibraries() { 825 ListScope D(W, "NeededLibraries"); 826 827 typedef std::vector<StringRef> LibsTy; 828 LibsTy Libs; 829 830 for (typename ELFO::Elf_Dyn_Iter DynI = Obj->begin_dynamic_table(), 831 DynE = Obj->end_dynamic_table(); 832 DynI != DynE; ++DynI) 833 if (DynI->d_tag == ELF::DT_NEEDED) 834 Libs.push_back(Obj->getDynamicString(DynI->d_un.d_val)); 835 836 std::stable_sort(Libs.begin(), Libs.end()); 837 838 for (LibsTy::const_iterator I = Libs.begin(), E = Libs.end(); I != E; ++I) { 839 outs() << " " << *I << "\n"; 840 } 841 } 842 843 template<class ELFT> 844 void ELFDumper<ELFT>::printProgramHeaders() { 845 ListScope L(W, "ProgramHeaders"); 846 847 for (typename ELFO::Elf_Phdr_Iter PI = Obj->begin_program_headers(), 848 PE = Obj->end_program_headers(); 849 PI != PE; ++PI) { 850 DictScope P(W, "ProgramHeader"); 851 W.printHex ("Type", 852 getElfSegmentType(Obj->getHeader()->e_machine, PI->p_type), 853 PI->p_type); 854 W.printHex ("Offset", PI->p_offset); 855 W.printHex ("VirtualAddress", PI->p_vaddr); 856 W.printHex ("PhysicalAddress", PI->p_paddr); 857 W.printNumber("FileSize", PI->p_filesz); 858 W.printNumber("MemSize", PI->p_memsz); 859 W.printFlags ("Flags", PI->p_flags, makeArrayRef(ElfSegmentFlags)); 860 W.printNumber("Alignment", PI->p_align); 861 } 862 } 863 864 template <class ELFT> 865 void ELFDumper<ELFT>::printAttributes() { 866 W.startLine() << "Attributes not implemented.\n"; 867 } 868 869 namespace { 870 template <> 871 void ELFDumper<ELFType<support::little, 2, false> >::printAttributes() { 872 if (Obj->getHeader()->e_machine != EM_ARM) { 873 W.startLine() << "Attributes not implemented.\n"; 874 return; 875 } 876 877 DictScope BA(W, "BuildAttributes"); 878 for (ELFO::Elf_Shdr_Iter SI = Obj->begin_sections(), SE = Obj->end_sections(); 879 SI != SE; ++SI) { 880 if (SI->sh_type != ELF::SHT_ARM_ATTRIBUTES) 881 continue; 882 883 ErrorOr<ArrayRef<uint8_t> > Contents = Obj->getSectionContents(&(*SI)); 884 if (!Contents) 885 continue; 886 887 if ((*Contents)[0] != ARMBuildAttrs::Format_Version) { 888 errs() << "unrecognised FormatVersion: 0x" << utohexstr((*Contents)[0]) 889 << '\n'; 890 continue; 891 } 892 893 W.printHex("FormatVersion", (*Contents)[0]); 894 if (Contents->size() == 1) 895 continue; 896 897 ARMAttributeParser(W).Parse(*Contents); 898 } 899 } 900 } 901 902