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/Optional.h" 22 #include "llvm/ADT/SmallString.h" 23 #include "llvm/ADT/StringExtras.h" 24 #include "llvm/Object/ELFObjectFile.h" 25 #include "llvm/Support/ARMBuildAttributes.h" 26 #include "llvm/Support/Compiler.h" 27 #include "llvm/Support/Format.h" 28 #include "llvm/Support/MathExtras.h" 29 #include "llvm/Support/raw_ostream.h" 30 31 using namespace llvm; 32 using namespace llvm::object; 33 using namespace ELF; 34 35 #define LLVM_READOBJ_ENUM_CASE(ns, enum) \ 36 case ns::enum: return #enum; 37 38 namespace { 39 40 template<typename ELFT> 41 class ELFDumper : public ObjDumper { 42 public: 43 ELFDumper(const ELFFile<ELFT> *Obj, StreamWriter &Writer) 44 : ObjDumper(Writer), Obj(Obj) {} 45 46 void printFileHeaders() override; 47 void printSections() override; 48 void printRelocations() override; 49 void printSymbols() override; 50 void printDynamicSymbols() override; 51 void printUnwindInfo() override; 52 53 void printDynamicTable() override; 54 void printNeededLibraries() override; 55 void printProgramHeaders() override; 56 57 void printAttributes() override; 58 void printMipsPLTGOT() override; 59 60 private: 61 typedef ELFFile<ELFT> ELFO; 62 typedef typename ELFO::Elf_Shdr Elf_Shdr; 63 typedef typename ELFO::Elf_Sym Elf_Sym; 64 65 void printSymbol(typename ELFO::Elf_Sym_Iter Symbol); 66 67 void printRelocations(const Elf_Shdr *Sec); 68 void printRelocation(const Elf_Shdr *Sec, typename ELFO::Elf_Rela Rel); 69 70 const ELFO *Obj; 71 }; 72 73 template <class T> T errorOrDefault(ErrorOr<T> Val, T Default = T()) { 74 if (!Val) { 75 error(Val.getError()); 76 return Default; 77 } 78 79 return *Val; 80 } 81 } // namespace 82 83 namespace llvm { 84 85 template <class ELFT> 86 static std::error_code createELFDumper(const ELFFile<ELFT> *Obj, 87 StreamWriter &Writer, 88 std::unique_ptr<ObjDumper> &Result) { 89 Result.reset(new ELFDumper<ELFT>(Obj, Writer)); 90 return readobj_error::success; 91 } 92 93 std::error_code createELFDumper(const object::ObjectFile *Obj, 94 StreamWriter &Writer, 95 std::unique_ptr<ObjDumper> &Result) { 96 // Little-endian 32-bit 97 if (const ELF32LEObjectFile *ELFObj = dyn_cast<ELF32LEObjectFile>(Obj)) 98 return createELFDumper(ELFObj->getELFFile(), Writer, Result); 99 100 // Big-endian 32-bit 101 if (const ELF32BEObjectFile *ELFObj = dyn_cast<ELF32BEObjectFile>(Obj)) 102 return createELFDumper(ELFObj->getELFFile(), Writer, Result); 103 104 // Little-endian 64-bit 105 if (const ELF64LEObjectFile *ELFObj = dyn_cast<ELF64LEObjectFile>(Obj)) 106 return createELFDumper(ELFObj->getELFFile(), Writer, Result); 107 108 // Big-endian 64-bit 109 if (const ELF64BEObjectFile *ELFObj = dyn_cast<ELF64BEObjectFile>(Obj)) 110 return createELFDumper(ELFObj->getELFFile(), Writer, Result); 111 112 return readobj_error::unsupported_obj_file_format; 113 } 114 115 } // namespace llvm 116 117 template <typename ELFO> 118 static std::string getFullSymbolName(const ELFO &Obj, 119 typename ELFO::Elf_Sym_Iter Symbol) { 120 StringRef SymbolName = errorOrDefault(Obj.getSymbolName(Symbol)); 121 if (!Symbol.isDynamic()) 122 return SymbolName; 123 124 std::string FullSymbolName(SymbolName); 125 126 bool IsDefault; 127 ErrorOr<StringRef> Version = 128 Obj.getSymbolVersion(nullptr, &*Symbol, IsDefault); 129 if (Version) { 130 FullSymbolName += (IsDefault ? "@@" : "@"); 131 FullSymbolName += *Version; 132 } else 133 error(Version.getError()); 134 return FullSymbolName; 135 } 136 137 template <typename ELFO> 138 static void 139 getSectionNameIndex(const ELFO &Obj, typename ELFO::Elf_Sym_Iter Symbol, 140 StringRef &SectionName, unsigned &SectionIndex) { 141 SectionIndex = Symbol->st_shndx; 142 if (SectionIndex == SHN_UNDEF) { 143 SectionName = "Undefined"; 144 } else if (SectionIndex >= SHN_LOPROC && SectionIndex <= SHN_HIPROC) { 145 SectionName = "Processor Specific"; 146 } else if (SectionIndex >= SHN_LOOS && SectionIndex <= SHN_HIOS) { 147 SectionName = "Operating System Specific"; 148 } else if (SectionIndex > SHN_HIOS && SectionIndex < SHN_ABS) { 149 SectionName = "Reserved"; 150 } else if (SectionIndex == SHN_ABS) { 151 SectionName = "Absolute"; 152 } else if (SectionIndex == SHN_COMMON) { 153 SectionName = "Common"; 154 } else { 155 if (SectionIndex == SHN_XINDEX) 156 SectionIndex = Obj.getSymbolTableIndex(&*Symbol); 157 assert(SectionIndex != SHN_XINDEX && 158 "getSymbolTableIndex should handle this"); 159 const typename ELFO::Elf_Shdr *Sec = Obj.getSection(SectionIndex); 160 SectionName = errorOrDefault(Obj.getSectionName(Sec)); 161 } 162 } 163 164 template <class ELFT> 165 static const typename ELFFile<ELFT>::Elf_Shdr * 166 findSectionByAddress(const ELFFile<ELFT> *Obj, uint64_t Addr) { 167 for (const auto &Shdr : Obj->sections()) 168 if (Shdr.sh_addr == Addr) 169 return &Shdr; 170 return nullptr; 171 } 172 173 static const EnumEntry<unsigned> ElfClass[] = { 174 { "None", ELF::ELFCLASSNONE }, 175 { "32-bit", ELF::ELFCLASS32 }, 176 { "64-bit", ELF::ELFCLASS64 }, 177 }; 178 179 static const EnumEntry<unsigned> ElfDataEncoding[] = { 180 { "None", ELF::ELFDATANONE }, 181 { "LittleEndian", ELF::ELFDATA2LSB }, 182 { "BigEndian", ELF::ELFDATA2MSB }, 183 }; 184 185 static const EnumEntry<unsigned> ElfObjectFileType[] = { 186 { "None", ELF::ET_NONE }, 187 { "Relocatable", ELF::ET_REL }, 188 { "Executable", ELF::ET_EXEC }, 189 { "SharedObject", ELF::ET_DYN }, 190 { "Core", ELF::ET_CORE }, 191 }; 192 193 static const EnumEntry<unsigned> ElfOSABI[] = { 194 { "SystemV", ELF::ELFOSABI_NONE }, 195 { "HPUX", ELF::ELFOSABI_HPUX }, 196 { "NetBSD", ELF::ELFOSABI_NETBSD }, 197 { "GNU/Linux", ELF::ELFOSABI_LINUX }, 198 { "GNU/Hurd", ELF::ELFOSABI_HURD }, 199 { "Solaris", ELF::ELFOSABI_SOLARIS }, 200 { "AIX", ELF::ELFOSABI_AIX }, 201 { "IRIX", ELF::ELFOSABI_IRIX }, 202 { "FreeBSD", ELF::ELFOSABI_FREEBSD }, 203 { "TRU64", ELF::ELFOSABI_TRU64 }, 204 { "Modesto", ELF::ELFOSABI_MODESTO }, 205 { "OpenBSD", ELF::ELFOSABI_OPENBSD }, 206 { "OpenVMS", ELF::ELFOSABI_OPENVMS }, 207 { "NSK", ELF::ELFOSABI_NSK }, 208 { "AROS", ELF::ELFOSABI_AROS }, 209 { "FenixOS", ELF::ELFOSABI_FENIXOS }, 210 { "CloudABI", ELF::ELFOSABI_CLOUDABI }, 211 { "C6000_ELFABI", ELF::ELFOSABI_C6000_ELFABI }, 212 { "C6000_LINUX" , ELF::ELFOSABI_C6000_LINUX }, 213 { "ARM", ELF::ELFOSABI_ARM }, 214 { "Standalone" , ELF::ELFOSABI_STANDALONE } 215 }; 216 217 static const EnumEntry<unsigned> ElfMachineType[] = { 218 LLVM_READOBJ_ENUM_ENT(ELF, EM_NONE ), 219 LLVM_READOBJ_ENUM_ENT(ELF, EM_M32 ), 220 LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARC ), 221 LLVM_READOBJ_ENUM_ENT(ELF, EM_386 ), 222 LLVM_READOBJ_ENUM_ENT(ELF, EM_68K ), 223 LLVM_READOBJ_ENUM_ENT(ELF, EM_88K ), 224 LLVM_READOBJ_ENUM_ENT(ELF, EM_486 ), 225 LLVM_READOBJ_ENUM_ENT(ELF, EM_860 ), 226 LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS ), 227 LLVM_READOBJ_ENUM_ENT(ELF, EM_S370 ), 228 LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS_RS3_LE ), 229 LLVM_READOBJ_ENUM_ENT(ELF, EM_PARISC ), 230 LLVM_READOBJ_ENUM_ENT(ELF, EM_VPP500 ), 231 LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARC32PLUS ), 232 LLVM_READOBJ_ENUM_ENT(ELF, EM_960 ), 233 LLVM_READOBJ_ENUM_ENT(ELF, EM_PPC ), 234 LLVM_READOBJ_ENUM_ENT(ELF, EM_PPC64 ), 235 LLVM_READOBJ_ENUM_ENT(ELF, EM_S390 ), 236 LLVM_READOBJ_ENUM_ENT(ELF, EM_SPU ), 237 LLVM_READOBJ_ENUM_ENT(ELF, EM_V800 ), 238 LLVM_READOBJ_ENUM_ENT(ELF, EM_FR20 ), 239 LLVM_READOBJ_ENUM_ENT(ELF, EM_RH32 ), 240 LLVM_READOBJ_ENUM_ENT(ELF, EM_RCE ), 241 LLVM_READOBJ_ENUM_ENT(ELF, EM_ARM ), 242 LLVM_READOBJ_ENUM_ENT(ELF, EM_ALPHA ), 243 LLVM_READOBJ_ENUM_ENT(ELF, EM_SH ), 244 LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARCV9 ), 245 LLVM_READOBJ_ENUM_ENT(ELF, EM_TRICORE ), 246 LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC ), 247 LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_300 ), 248 LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_300H ), 249 LLVM_READOBJ_ENUM_ENT(ELF, EM_H8S ), 250 LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_500 ), 251 LLVM_READOBJ_ENUM_ENT(ELF, EM_IA_64 ), 252 LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS_X ), 253 LLVM_READOBJ_ENUM_ENT(ELF, EM_COLDFIRE ), 254 LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC12 ), 255 LLVM_READOBJ_ENUM_ENT(ELF, EM_MMA ), 256 LLVM_READOBJ_ENUM_ENT(ELF, EM_PCP ), 257 LLVM_READOBJ_ENUM_ENT(ELF, EM_NCPU ), 258 LLVM_READOBJ_ENUM_ENT(ELF, EM_NDR1 ), 259 LLVM_READOBJ_ENUM_ENT(ELF, EM_STARCORE ), 260 LLVM_READOBJ_ENUM_ENT(ELF, EM_ME16 ), 261 LLVM_READOBJ_ENUM_ENT(ELF, EM_ST100 ), 262 LLVM_READOBJ_ENUM_ENT(ELF, EM_TINYJ ), 263 LLVM_READOBJ_ENUM_ENT(ELF, EM_X86_64 ), 264 LLVM_READOBJ_ENUM_ENT(ELF, EM_PDSP ), 265 LLVM_READOBJ_ENUM_ENT(ELF, EM_PDP10 ), 266 LLVM_READOBJ_ENUM_ENT(ELF, EM_PDP11 ), 267 LLVM_READOBJ_ENUM_ENT(ELF, EM_FX66 ), 268 LLVM_READOBJ_ENUM_ENT(ELF, EM_ST9PLUS ), 269 LLVM_READOBJ_ENUM_ENT(ELF, EM_ST7 ), 270 LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC16 ), 271 LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC11 ), 272 LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC08 ), 273 LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC05 ), 274 LLVM_READOBJ_ENUM_ENT(ELF, EM_SVX ), 275 LLVM_READOBJ_ENUM_ENT(ELF, EM_ST19 ), 276 LLVM_READOBJ_ENUM_ENT(ELF, EM_VAX ), 277 LLVM_READOBJ_ENUM_ENT(ELF, EM_CRIS ), 278 LLVM_READOBJ_ENUM_ENT(ELF, EM_JAVELIN ), 279 LLVM_READOBJ_ENUM_ENT(ELF, EM_FIREPATH ), 280 LLVM_READOBJ_ENUM_ENT(ELF, EM_ZSP ), 281 LLVM_READOBJ_ENUM_ENT(ELF, EM_MMIX ), 282 LLVM_READOBJ_ENUM_ENT(ELF, EM_HUANY ), 283 LLVM_READOBJ_ENUM_ENT(ELF, EM_PRISM ), 284 LLVM_READOBJ_ENUM_ENT(ELF, EM_AVR ), 285 LLVM_READOBJ_ENUM_ENT(ELF, EM_FR30 ), 286 LLVM_READOBJ_ENUM_ENT(ELF, EM_D10V ), 287 LLVM_READOBJ_ENUM_ENT(ELF, EM_D30V ), 288 LLVM_READOBJ_ENUM_ENT(ELF, EM_V850 ), 289 LLVM_READOBJ_ENUM_ENT(ELF, EM_M32R ), 290 LLVM_READOBJ_ENUM_ENT(ELF, EM_MN10300 ), 291 LLVM_READOBJ_ENUM_ENT(ELF, EM_MN10200 ), 292 LLVM_READOBJ_ENUM_ENT(ELF, EM_PJ ), 293 LLVM_READOBJ_ENUM_ENT(ELF, EM_OPENRISC ), 294 LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC_COMPACT ), 295 LLVM_READOBJ_ENUM_ENT(ELF, EM_XTENSA ), 296 LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE ), 297 LLVM_READOBJ_ENUM_ENT(ELF, EM_TMM_GPP ), 298 LLVM_READOBJ_ENUM_ENT(ELF, EM_NS32K ), 299 LLVM_READOBJ_ENUM_ENT(ELF, EM_TPC ), 300 LLVM_READOBJ_ENUM_ENT(ELF, EM_SNP1K ), 301 LLVM_READOBJ_ENUM_ENT(ELF, EM_ST200 ), 302 LLVM_READOBJ_ENUM_ENT(ELF, EM_IP2K ), 303 LLVM_READOBJ_ENUM_ENT(ELF, EM_MAX ), 304 LLVM_READOBJ_ENUM_ENT(ELF, EM_CR ), 305 LLVM_READOBJ_ENUM_ENT(ELF, EM_F2MC16 ), 306 LLVM_READOBJ_ENUM_ENT(ELF, EM_MSP430 ), 307 LLVM_READOBJ_ENUM_ENT(ELF, EM_BLACKFIN ), 308 LLVM_READOBJ_ENUM_ENT(ELF, EM_SE_C33 ), 309 LLVM_READOBJ_ENUM_ENT(ELF, EM_SEP ), 310 LLVM_READOBJ_ENUM_ENT(ELF, EM_ARCA ), 311 LLVM_READOBJ_ENUM_ENT(ELF, EM_UNICORE ), 312 LLVM_READOBJ_ENUM_ENT(ELF, EM_EXCESS ), 313 LLVM_READOBJ_ENUM_ENT(ELF, EM_DXP ), 314 LLVM_READOBJ_ENUM_ENT(ELF, EM_ALTERA_NIOS2 ), 315 LLVM_READOBJ_ENUM_ENT(ELF, EM_CRX ), 316 LLVM_READOBJ_ENUM_ENT(ELF, EM_XGATE ), 317 LLVM_READOBJ_ENUM_ENT(ELF, EM_C166 ), 318 LLVM_READOBJ_ENUM_ENT(ELF, EM_M16C ), 319 LLVM_READOBJ_ENUM_ENT(ELF, EM_DSPIC30F ), 320 LLVM_READOBJ_ENUM_ENT(ELF, EM_CE ), 321 LLVM_READOBJ_ENUM_ENT(ELF, EM_M32C ), 322 LLVM_READOBJ_ENUM_ENT(ELF, EM_TSK3000 ), 323 LLVM_READOBJ_ENUM_ENT(ELF, EM_RS08 ), 324 LLVM_READOBJ_ENUM_ENT(ELF, EM_SHARC ), 325 LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG2 ), 326 LLVM_READOBJ_ENUM_ENT(ELF, EM_SCORE7 ), 327 LLVM_READOBJ_ENUM_ENT(ELF, EM_DSP24 ), 328 LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE3 ), 329 LLVM_READOBJ_ENUM_ENT(ELF, EM_LATTICEMICO32), 330 LLVM_READOBJ_ENUM_ENT(ELF, EM_SE_C17 ), 331 LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C6000 ), 332 LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C2000 ), 333 LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C5500 ), 334 LLVM_READOBJ_ENUM_ENT(ELF, EM_MMDSP_PLUS ), 335 LLVM_READOBJ_ENUM_ENT(ELF, EM_CYPRESS_M8C ), 336 LLVM_READOBJ_ENUM_ENT(ELF, EM_R32C ), 337 LLVM_READOBJ_ENUM_ENT(ELF, EM_TRIMEDIA ), 338 LLVM_READOBJ_ENUM_ENT(ELF, EM_HEXAGON ), 339 LLVM_READOBJ_ENUM_ENT(ELF, EM_8051 ), 340 LLVM_READOBJ_ENUM_ENT(ELF, EM_STXP7X ), 341 LLVM_READOBJ_ENUM_ENT(ELF, EM_NDS32 ), 342 LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG1 ), 343 LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG1X ), 344 LLVM_READOBJ_ENUM_ENT(ELF, EM_MAXQ30 ), 345 LLVM_READOBJ_ENUM_ENT(ELF, EM_XIMO16 ), 346 LLVM_READOBJ_ENUM_ENT(ELF, EM_MANIK ), 347 LLVM_READOBJ_ENUM_ENT(ELF, EM_CRAYNV2 ), 348 LLVM_READOBJ_ENUM_ENT(ELF, EM_RX ), 349 LLVM_READOBJ_ENUM_ENT(ELF, EM_METAG ), 350 LLVM_READOBJ_ENUM_ENT(ELF, EM_MCST_ELBRUS ), 351 LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG16 ), 352 LLVM_READOBJ_ENUM_ENT(ELF, EM_CR16 ), 353 LLVM_READOBJ_ENUM_ENT(ELF, EM_ETPU ), 354 LLVM_READOBJ_ENUM_ENT(ELF, EM_SLE9X ), 355 LLVM_READOBJ_ENUM_ENT(ELF, EM_L10M ), 356 LLVM_READOBJ_ENUM_ENT(ELF, EM_K10M ), 357 LLVM_READOBJ_ENUM_ENT(ELF, EM_AARCH64 ), 358 LLVM_READOBJ_ENUM_ENT(ELF, EM_AVR32 ), 359 LLVM_READOBJ_ENUM_ENT(ELF, EM_STM8 ), 360 LLVM_READOBJ_ENUM_ENT(ELF, EM_TILE64 ), 361 LLVM_READOBJ_ENUM_ENT(ELF, EM_TILEPRO ), 362 LLVM_READOBJ_ENUM_ENT(ELF, EM_CUDA ), 363 LLVM_READOBJ_ENUM_ENT(ELF, EM_TILEGX ), 364 LLVM_READOBJ_ENUM_ENT(ELF, EM_CLOUDSHIELD ), 365 LLVM_READOBJ_ENUM_ENT(ELF, EM_COREA_1ST ), 366 LLVM_READOBJ_ENUM_ENT(ELF, EM_COREA_2ND ), 367 LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC_COMPACT2 ), 368 LLVM_READOBJ_ENUM_ENT(ELF, EM_OPEN8 ), 369 LLVM_READOBJ_ENUM_ENT(ELF, EM_RL78 ), 370 LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE5 ), 371 LLVM_READOBJ_ENUM_ENT(ELF, EM_78KOR ), 372 LLVM_READOBJ_ENUM_ENT(ELF, EM_56800EX ) 373 }; 374 375 static const EnumEntry<unsigned> ElfSymbolBindings[] = { 376 { "Local", ELF::STB_LOCAL }, 377 { "Global", ELF::STB_GLOBAL }, 378 { "Weak", ELF::STB_WEAK }, 379 { "Unique", ELF::STB_GNU_UNIQUE } 380 }; 381 382 static const EnumEntry<unsigned> ElfSymbolTypes[] = { 383 { "None", ELF::STT_NOTYPE }, 384 { "Object", ELF::STT_OBJECT }, 385 { "Function", ELF::STT_FUNC }, 386 { "Section", ELF::STT_SECTION }, 387 { "File", ELF::STT_FILE }, 388 { "Common", ELF::STT_COMMON }, 389 { "TLS", ELF::STT_TLS }, 390 { "GNU_IFunc", ELF::STT_GNU_IFUNC } 391 }; 392 393 static const char *getElfSectionType(unsigned Arch, unsigned Type) { 394 switch (Arch) { 395 case ELF::EM_ARM: 396 switch (Type) { 397 LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_EXIDX); 398 LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_PREEMPTMAP); 399 LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_ATTRIBUTES); 400 LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_DEBUGOVERLAY); 401 LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_OVERLAYSECTION); 402 } 403 case ELF::EM_HEXAGON: 404 switch (Type) { LLVM_READOBJ_ENUM_CASE(ELF, SHT_HEX_ORDERED); } 405 case ELF::EM_X86_64: 406 switch (Type) { LLVM_READOBJ_ENUM_CASE(ELF, SHT_X86_64_UNWIND); } 407 case ELF::EM_MIPS: 408 case ELF::EM_MIPS_RS3_LE: 409 switch (Type) { 410 LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_REGINFO); 411 LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_OPTIONS); 412 LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_ABIFLAGS); 413 } 414 } 415 416 switch (Type) { 417 LLVM_READOBJ_ENUM_CASE(ELF, SHT_NULL ); 418 LLVM_READOBJ_ENUM_CASE(ELF, SHT_PROGBITS ); 419 LLVM_READOBJ_ENUM_CASE(ELF, SHT_SYMTAB ); 420 LLVM_READOBJ_ENUM_CASE(ELF, SHT_STRTAB ); 421 LLVM_READOBJ_ENUM_CASE(ELF, SHT_RELA ); 422 LLVM_READOBJ_ENUM_CASE(ELF, SHT_HASH ); 423 LLVM_READOBJ_ENUM_CASE(ELF, SHT_DYNAMIC ); 424 LLVM_READOBJ_ENUM_CASE(ELF, SHT_NOTE ); 425 LLVM_READOBJ_ENUM_CASE(ELF, SHT_NOBITS ); 426 LLVM_READOBJ_ENUM_CASE(ELF, SHT_REL ); 427 LLVM_READOBJ_ENUM_CASE(ELF, SHT_SHLIB ); 428 LLVM_READOBJ_ENUM_CASE(ELF, SHT_DYNSYM ); 429 LLVM_READOBJ_ENUM_CASE(ELF, SHT_INIT_ARRAY ); 430 LLVM_READOBJ_ENUM_CASE(ELF, SHT_FINI_ARRAY ); 431 LLVM_READOBJ_ENUM_CASE(ELF, SHT_PREINIT_ARRAY ); 432 LLVM_READOBJ_ENUM_CASE(ELF, SHT_GROUP ); 433 LLVM_READOBJ_ENUM_CASE(ELF, SHT_SYMTAB_SHNDX ); 434 LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_ATTRIBUTES ); 435 LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_HASH ); 436 LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_verdef ); 437 LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_verneed ); 438 LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_versym ); 439 default: return ""; 440 } 441 } 442 443 static const EnumEntry<unsigned> ElfSectionFlags[] = { 444 LLVM_READOBJ_ENUM_ENT(ELF, SHF_WRITE ), 445 LLVM_READOBJ_ENUM_ENT(ELF, SHF_ALLOC ), 446 LLVM_READOBJ_ENUM_ENT(ELF, SHF_EXCLUDE ), 447 LLVM_READOBJ_ENUM_ENT(ELF, SHF_EXECINSTR ), 448 LLVM_READOBJ_ENUM_ENT(ELF, SHF_MERGE ), 449 LLVM_READOBJ_ENUM_ENT(ELF, SHF_STRINGS ), 450 LLVM_READOBJ_ENUM_ENT(ELF, SHF_INFO_LINK ), 451 LLVM_READOBJ_ENUM_ENT(ELF, SHF_LINK_ORDER ), 452 LLVM_READOBJ_ENUM_ENT(ELF, SHF_OS_NONCONFORMING), 453 LLVM_READOBJ_ENUM_ENT(ELF, SHF_GROUP ), 454 LLVM_READOBJ_ENUM_ENT(ELF, SHF_TLS ), 455 LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_CP_SECTION), 456 LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_DP_SECTION), 457 LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NOSTRIP ) 458 }; 459 460 static const char *getElfSegmentType(unsigned Arch, unsigned Type) { 461 // Check potentially overlapped processor-specific 462 // program header type. 463 switch (Arch) { 464 case ELF::EM_ARM: 465 switch (Type) { 466 LLVM_READOBJ_ENUM_CASE(ELF, PT_ARM_EXIDX); 467 } 468 case ELF::EM_MIPS: 469 case ELF::EM_MIPS_RS3_LE: 470 switch (Type) { 471 LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_REGINFO); 472 LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_RTPROC); 473 LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_OPTIONS); 474 } 475 } 476 477 switch (Type) { 478 LLVM_READOBJ_ENUM_CASE(ELF, PT_NULL ); 479 LLVM_READOBJ_ENUM_CASE(ELF, PT_LOAD ); 480 LLVM_READOBJ_ENUM_CASE(ELF, PT_DYNAMIC); 481 LLVM_READOBJ_ENUM_CASE(ELF, PT_INTERP ); 482 LLVM_READOBJ_ENUM_CASE(ELF, PT_NOTE ); 483 LLVM_READOBJ_ENUM_CASE(ELF, PT_SHLIB ); 484 LLVM_READOBJ_ENUM_CASE(ELF, PT_PHDR ); 485 LLVM_READOBJ_ENUM_CASE(ELF, PT_TLS ); 486 487 LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_EH_FRAME); 488 LLVM_READOBJ_ENUM_CASE(ELF, PT_SUNW_UNWIND); 489 490 LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_STACK); 491 LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_RELRO); 492 default: return ""; 493 } 494 } 495 496 static const EnumEntry<unsigned> ElfSegmentFlags[] = { 497 LLVM_READOBJ_ENUM_ENT(ELF, PF_X), 498 LLVM_READOBJ_ENUM_ENT(ELF, PF_W), 499 LLVM_READOBJ_ENUM_ENT(ELF, PF_R) 500 }; 501 502 static const EnumEntry<unsigned> ElfHeaderMipsFlags[] = { 503 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_NOREORDER), 504 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_PIC), 505 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_CPIC), 506 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ABI2), 507 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_32BITMODE), 508 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_NAN2008), 509 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ABI_O32), 510 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_MICROMIPS), 511 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_ASE_M16), 512 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_1), 513 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_2), 514 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_3), 515 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_4), 516 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_5), 517 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_32), 518 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_64), 519 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_32R2), 520 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_64R2), 521 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_32R6), 522 LLVM_READOBJ_ENUM_ENT(ELF, EF_MIPS_ARCH_64R6) 523 }; 524 525 template<class ELFT> 526 void ELFDumper<ELFT>::printFileHeaders() { 527 const typename ELFO::Elf_Ehdr *Header = Obj->getHeader(); 528 529 { 530 DictScope D(W, "ElfHeader"); 531 { 532 DictScope D(W, "Ident"); 533 W.printBinary("Magic", makeArrayRef(Header->e_ident).slice(ELF::EI_MAG0, 534 4)); 535 W.printEnum ("Class", Header->e_ident[ELF::EI_CLASS], 536 makeArrayRef(ElfClass)); 537 W.printEnum ("DataEncoding", Header->e_ident[ELF::EI_DATA], 538 makeArrayRef(ElfDataEncoding)); 539 W.printNumber("FileVersion", Header->e_ident[ELF::EI_VERSION]); 540 W.printEnum ("OS/ABI", Header->e_ident[ELF::EI_OSABI], 541 makeArrayRef(ElfOSABI)); 542 W.printNumber("ABIVersion", Header->e_ident[ELF::EI_ABIVERSION]); 543 W.printBinary("Unused", makeArrayRef(Header->e_ident).slice(ELF::EI_PAD)); 544 } 545 546 W.printEnum ("Type", Header->e_type, makeArrayRef(ElfObjectFileType)); 547 W.printEnum ("Machine", Header->e_machine, makeArrayRef(ElfMachineType)); 548 W.printNumber("Version", Header->e_version); 549 W.printHex ("Entry", Header->e_entry); 550 W.printHex ("ProgramHeaderOffset", Header->e_phoff); 551 W.printHex ("SectionHeaderOffset", Header->e_shoff); 552 if (Header->e_machine == EM_MIPS) 553 W.printFlags("Flags", Header->e_flags, makeArrayRef(ElfHeaderMipsFlags), 554 unsigned(ELF::EF_MIPS_ARCH)); 555 else 556 W.printFlags("Flags", Header->e_flags); 557 W.printNumber("HeaderSize", Header->e_ehsize); 558 W.printNumber("ProgramHeaderEntrySize", Header->e_phentsize); 559 W.printNumber("ProgramHeaderCount", Header->e_phnum); 560 W.printNumber("SectionHeaderEntrySize", Header->e_shentsize); 561 W.printNumber("SectionHeaderCount", Header->e_shnum); 562 W.printNumber("StringTableSectionIndex", Header->e_shstrndx); 563 } 564 } 565 566 template<class ELFT> 567 void ELFDumper<ELFT>::printSections() { 568 ListScope SectionsD(W, "Sections"); 569 570 int SectionIndex = -1; 571 for (typename ELFO::Elf_Shdr_Iter SecI = Obj->begin_sections(), 572 SecE = Obj->end_sections(); 573 SecI != SecE; ++SecI) { 574 ++SectionIndex; 575 576 const Elf_Shdr *Section = &*SecI; 577 StringRef Name = errorOrDefault(Obj->getSectionName(Section)); 578 579 DictScope SectionD(W, "Section"); 580 W.printNumber("Index", SectionIndex); 581 W.printNumber("Name", Name, Section->sh_name); 582 W.printHex("Type", 583 getElfSectionType(Obj->getHeader()->e_machine, Section->sh_type), 584 Section->sh_type); 585 W.printFlags ("Flags", Section->sh_flags, makeArrayRef(ElfSectionFlags)); 586 W.printHex ("Address", Section->sh_addr); 587 W.printHex ("Offset", Section->sh_offset); 588 W.printNumber("Size", Section->sh_size); 589 W.printNumber("Link", Section->sh_link); 590 W.printNumber("Info", Section->sh_info); 591 W.printNumber("AddressAlignment", Section->sh_addralign); 592 W.printNumber("EntrySize", Section->sh_entsize); 593 594 if (opts::SectionRelocations) { 595 ListScope D(W, "Relocations"); 596 printRelocations(Section); 597 } 598 599 if (opts::SectionSymbols) { 600 ListScope D(W, "Symbols"); 601 for (typename ELFO::Elf_Sym_Iter SymI = Obj->begin_symbols(), 602 SymE = Obj->end_symbols(); 603 SymI != SymE; ++SymI) { 604 if (Obj->getSection(&*SymI) == Section) 605 printSymbol(SymI); 606 } 607 } 608 609 if (opts::SectionData && Section->sh_type != ELF::SHT_NOBITS) { 610 ArrayRef<uint8_t> Data = errorOrDefault(Obj->getSectionContents(Section)); 611 W.printBinaryBlock("SectionData", 612 StringRef((const char *)Data.data(), Data.size())); 613 } 614 } 615 } 616 617 template<class ELFT> 618 void ELFDumper<ELFT>::printRelocations() { 619 ListScope D(W, "Relocations"); 620 621 int SectionNumber = -1; 622 for (typename ELFO::Elf_Shdr_Iter SecI = Obj->begin_sections(), 623 SecE = Obj->end_sections(); 624 SecI != SecE; ++SecI) { 625 ++SectionNumber; 626 627 if (SecI->sh_type != ELF::SHT_REL && SecI->sh_type != ELF::SHT_RELA) 628 continue; 629 630 StringRef Name = errorOrDefault(Obj->getSectionName(&*SecI)); 631 632 W.startLine() << "Section (" << SectionNumber << ") " << Name << " {\n"; 633 W.indent(); 634 635 printRelocations(&*SecI); 636 637 W.unindent(); 638 W.startLine() << "}\n"; 639 } 640 } 641 642 template <class ELFT> 643 void ELFDumper<ELFT>::printRelocations(const Elf_Shdr *Sec) { 644 switch (Sec->sh_type) { 645 case ELF::SHT_REL: 646 for (typename ELFO::Elf_Rel_Iter RI = Obj->begin_rel(Sec), 647 RE = Obj->end_rel(Sec); 648 RI != RE; ++RI) { 649 typename ELFO::Elf_Rela Rela; 650 Rela.r_offset = RI->r_offset; 651 Rela.r_info = RI->r_info; 652 Rela.r_addend = 0; 653 printRelocation(Sec, Rela); 654 } 655 break; 656 case ELF::SHT_RELA: 657 for (typename ELFO::Elf_Rela_Iter RI = Obj->begin_rela(Sec), 658 RE = Obj->end_rela(Sec); 659 RI != RE; ++RI) { 660 printRelocation(Sec, *RI); 661 } 662 break; 663 } 664 } 665 666 template <class ELFT> 667 void ELFDumper<ELFT>::printRelocation(const Elf_Shdr *Sec, 668 typename ELFO::Elf_Rela Rel) { 669 SmallString<32> RelocName; 670 Obj->getRelocationTypeName(Rel.getType(Obj->isMips64EL()), RelocName); 671 StringRef SymbolName; 672 std::pair<const Elf_Shdr *, const Elf_Sym *> Sym = 673 Obj->getRelocationSymbol(Sec, &Rel); 674 if (Sym.first) 675 SymbolName = errorOrDefault(Obj->getSymbolName(Sym.first, Sym.second)); 676 677 if (opts::ExpandRelocs) { 678 DictScope Group(W, "Relocation"); 679 W.printHex("Offset", Rel.r_offset); 680 W.printNumber("Type", RelocName, (int)Rel.getType(Obj->isMips64EL())); 681 W.printNumber("Symbol", SymbolName.size() > 0 ? SymbolName : "-", 682 Rel.getSymbol(Obj->isMips64EL())); 683 W.printHex("Addend", Rel.r_addend); 684 } else { 685 raw_ostream& OS = W.startLine(); 686 OS << W.hex(Rel.r_offset) 687 << " " << RelocName 688 << " " << (SymbolName.size() > 0 ? SymbolName : "-") 689 << " " << W.hex(Rel.r_addend) 690 << "\n"; 691 } 692 } 693 694 template<class ELFT> 695 void ELFDumper<ELFT>::printSymbols() { 696 ListScope Group(W, "Symbols"); 697 for (typename ELFO::Elf_Sym_Iter SymI = Obj->begin_symbols(), 698 SymE = Obj->end_symbols(); 699 SymI != SymE; ++SymI) { 700 printSymbol(SymI); 701 } 702 } 703 704 template<class ELFT> 705 void ELFDumper<ELFT>::printDynamicSymbols() { 706 ListScope Group(W, "DynamicSymbols"); 707 708 for (typename ELFO::Elf_Sym_Iter SymI = Obj->begin_dynamic_symbols(), 709 SymE = Obj->end_dynamic_symbols(); 710 SymI != SymE; ++SymI) { 711 printSymbol(SymI); 712 } 713 } 714 715 template <class ELFT> 716 void ELFDumper<ELFT>::printSymbol(typename ELFO::Elf_Sym_Iter Symbol) { 717 unsigned SectionIndex = 0; 718 StringRef SectionName; 719 getSectionNameIndex(*Obj, Symbol, SectionName, SectionIndex); 720 std::string FullSymbolName = getFullSymbolName(*Obj, Symbol); 721 722 DictScope D(W, "Symbol"); 723 W.printNumber("Name", FullSymbolName, Symbol->st_name); 724 W.printHex ("Value", Symbol->st_value); 725 W.printNumber("Size", Symbol->st_size); 726 W.printEnum ("Binding", Symbol->getBinding(), 727 makeArrayRef(ElfSymbolBindings)); 728 W.printEnum ("Type", Symbol->getType(), makeArrayRef(ElfSymbolTypes)); 729 W.printNumber("Other", Symbol->st_other); 730 W.printHex("Section", SectionName, SectionIndex); 731 } 732 733 #define LLVM_READOBJ_TYPE_CASE(name) \ 734 case DT_##name: return #name 735 736 static const char *getTypeString(uint64_t Type) { 737 switch (Type) { 738 LLVM_READOBJ_TYPE_CASE(BIND_NOW); 739 LLVM_READOBJ_TYPE_CASE(DEBUG); 740 LLVM_READOBJ_TYPE_CASE(FINI); 741 LLVM_READOBJ_TYPE_CASE(FINI_ARRAY); 742 LLVM_READOBJ_TYPE_CASE(FINI_ARRAYSZ); 743 LLVM_READOBJ_TYPE_CASE(FLAGS); 744 LLVM_READOBJ_TYPE_CASE(HASH); 745 LLVM_READOBJ_TYPE_CASE(INIT); 746 LLVM_READOBJ_TYPE_CASE(INIT_ARRAY); 747 LLVM_READOBJ_TYPE_CASE(INIT_ARRAYSZ); 748 LLVM_READOBJ_TYPE_CASE(PREINIT_ARRAY); 749 LLVM_READOBJ_TYPE_CASE(PREINIT_ARRAYSZ); 750 LLVM_READOBJ_TYPE_CASE(JMPREL); 751 LLVM_READOBJ_TYPE_CASE(NEEDED); 752 LLVM_READOBJ_TYPE_CASE(NULL); 753 LLVM_READOBJ_TYPE_CASE(PLTGOT); 754 LLVM_READOBJ_TYPE_CASE(PLTREL); 755 LLVM_READOBJ_TYPE_CASE(PLTRELSZ); 756 LLVM_READOBJ_TYPE_CASE(REL); 757 LLVM_READOBJ_TYPE_CASE(RELA); 758 LLVM_READOBJ_TYPE_CASE(RELENT); 759 LLVM_READOBJ_TYPE_CASE(RELSZ); 760 LLVM_READOBJ_TYPE_CASE(RELAENT); 761 LLVM_READOBJ_TYPE_CASE(RELASZ); 762 LLVM_READOBJ_TYPE_CASE(RPATH); 763 LLVM_READOBJ_TYPE_CASE(RUNPATH); 764 LLVM_READOBJ_TYPE_CASE(SONAME); 765 LLVM_READOBJ_TYPE_CASE(STRSZ); 766 LLVM_READOBJ_TYPE_CASE(STRTAB); 767 LLVM_READOBJ_TYPE_CASE(SYMBOLIC); 768 LLVM_READOBJ_TYPE_CASE(SYMENT); 769 LLVM_READOBJ_TYPE_CASE(SYMTAB); 770 LLVM_READOBJ_TYPE_CASE(TEXTREL); 771 LLVM_READOBJ_TYPE_CASE(VERNEED); 772 LLVM_READOBJ_TYPE_CASE(VERNEEDNUM); 773 LLVM_READOBJ_TYPE_CASE(VERSYM); 774 LLVM_READOBJ_TYPE_CASE(RELCOUNT); 775 LLVM_READOBJ_TYPE_CASE(GNU_HASH); 776 LLVM_READOBJ_TYPE_CASE(MIPS_RLD_VERSION); 777 LLVM_READOBJ_TYPE_CASE(MIPS_FLAGS); 778 LLVM_READOBJ_TYPE_CASE(MIPS_BASE_ADDRESS); 779 LLVM_READOBJ_TYPE_CASE(MIPS_LOCAL_GOTNO); 780 LLVM_READOBJ_TYPE_CASE(MIPS_SYMTABNO); 781 LLVM_READOBJ_TYPE_CASE(MIPS_UNREFEXTNO); 782 LLVM_READOBJ_TYPE_CASE(MIPS_GOTSYM); 783 LLVM_READOBJ_TYPE_CASE(MIPS_RLD_MAP); 784 LLVM_READOBJ_TYPE_CASE(MIPS_PLTGOT); 785 default: return "unknown"; 786 } 787 } 788 789 #undef LLVM_READOBJ_TYPE_CASE 790 791 #define LLVM_READOBJ_DT_FLAG_ENT(prefix, enum) \ 792 { #enum, prefix##_##enum } 793 794 static const EnumEntry<unsigned> ElfDynamicDTFlags[] = { 795 LLVM_READOBJ_DT_FLAG_ENT(DF, ORIGIN), 796 LLVM_READOBJ_DT_FLAG_ENT(DF, SYMBOLIC), 797 LLVM_READOBJ_DT_FLAG_ENT(DF, TEXTREL), 798 LLVM_READOBJ_DT_FLAG_ENT(DF, BIND_NOW), 799 LLVM_READOBJ_DT_FLAG_ENT(DF, STATIC_TLS) 800 }; 801 802 static const EnumEntry<unsigned> ElfDynamicDTMipsFlags[] = { 803 LLVM_READOBJ_DT_FLAG_ENT(RHF, NONE), 804 LLVM_READOBJ_DT_FLAG_ENT(RHF, QUICKSTART), 805 LLVM_READOBJ_DT_FLAG_ENT(RHF, NOTPOT), 806 LLVM_READOBJ_DT_FLAG_ENT(RHS, NO_LIBRARY_REPLACEMENT), 807 LLVM_READOBJ_DT_FLAG_ENT(RHF, NO_MOVE), 808 LLVM_READOBJ_DT_FLAG_ENT(RHF, SGI_ONLY), 809 LLVM_READOBJ_DT_FLAG_ENT(RHF, GUARANTEE_INIT), 810 LLVM_READOBJ_DT_FLAG_ENT(RHF, DELTA_C_PLUS_PLUS), 811 LLVM_READOBJ_DT_FLAG_ENT(RHF, GUARANTEE_START_INIT), 812 LLVM_READOBJ_DT_FLAG_ENT(RHF, PIXIE), 813 LLVM_READOBJ_DT_FLAG_ENT(RHF, DEFAULT_DELAY_LOAD), 814 LLVM_READOBJ_DT_FLAG_ENT(RHF, REQUICKSTART), 815 LLVM_READOBJ_DT_FLAG_ENT(RHF, REQUICKSTARTED), 816 LLVM_READOBJ_DT_FLAG_ENT(RHF, CORD), 817 LLVM_READOBJ_DT_FLAG_ENT(RHF, NO_UNRES_UNDEF), 818 LLVM_READOBJ_DT_FLAG_ENT(RHF, RLD_ORDER_SAFE) 819 }; 820 821 #undef LLVM_READOBJ_DT_FLAG_ENT 822 823 template <typename T, typename TFlag> 824 void printFlags(T Value, ArrayRef<EnumEntry<TFlag>> Flags, raw_ostream &OS) { 825 typedef EnumEntry<TFlag> FlagEntry; 826 typedef SmallVector<FlagEntry, 10> FlagVector; 827 FlagVector SetFlags; 828 829 for (const auto &Flag : Flags) { 830 if (Flag.Value == 0) 831 continue; 832 833 if ((Value & Flag.Value) == Flag.Value) 834 SetFlags.push_back(Flag); 835 } 836 837 for (const auto &Flag : SetFlags) { 838 OS << Flag.Name << " "; 839 } 840 } 841 842 template <class ELFT> 843 static void printValue(const ELFFile<ELFT> *O, uint64_t Type, uint64_t Value, 844 bool Is64, raw_ostream &OS) { 845 switch (Type) { 846 case DT_PLTREL: 847 if (Value == DT_REL) { 848 OS << "REL"; 849 break; 850 } else if (Value == DT_RELA) { 851 OS << "RELA"; 852 break; 853 } 854 // Fallthrough. 855 case DT_PLTGOT: 856 case DT_HASH: 857 case DT_STRTAB: 858 case DT_SYMTAB: 859 case DT_RELA: 860 case DT_INIT: 861 case DT_FINI: 862 case DT_REL: 863 case DT_JMPREL: 864 case DT_INIT_ARRAY: 865 case DT_FINI_ARRAY: 866 case DT_PREINIT_ARRAY: 867 case DT_DEBUG: 868 case DT_VERNEED: 869 case DT_VERSYM: 870 case DT_GNU_HASH: 871 case DT_NULL: 872 case DT_MIPS_BASE_ADDRESS: 873 case DT_MIPS_GOTSYM: 874 case DT_MIPS_RLD_MAP: 875 case DT_MIPS_PLTGOT: 876 OS << format("0x%" PRIX64, Value); 877 break; 878 case DT_RELCOUNT: 879 case DT_VERNEEDNUM: 880 case DT_MIPS_RLD_VERSION: 881 case DT_MIPS_LOCAL_GOTNO: 882 case DT_MIPS_SYMTABNO: 883 case DT_MIPS_UNREFEXTNO: 884 OS << Value; 885 break; 886 case DT_PLTRELSZ: 887 case DT_RELASZ: 888 case DT_RELAENT: 889 case DT_STRSZ: 890 case DT_SYMENT: 891 case DT_RELSZ: 892 case DT_RELENT: 893 case DT_INIT_ARRAYSZ: 894 case DT_FINI_ARRAYSZ: 895 case DT_PREINIT_ARRAYSZ: 896 OS << Value << " (bytes)"; 897 break; 898 case DT_NEEDED: 899 OS << "SharedLibrary (" << O->getDynamicString(Value) << ")"; 900 break; 901 case DT_SONAME: 902 OS << "LibrarySoname (" << O->getDynamicString(Value) << ")"; 903 break; 904 case DT_RPATH: 905 case DT_RUNPATH: 906 OS << O->getDynamicString(Value); 907 break; 908 case DT_MIPS_FLAGS: 909 printFlags(Value, makeArrayRef(ElfDynamicDTMipsFlags), OS); 910 break; 911 case DT_FLAGS: 912 printFlags(Value, makeArrayRef(ElfDynamicDTFlags), OS); 913 break; 914 } 915 } 916 917 template<class ELFT> 918 void ELFDumper<ELFT>::printUnwindInfo() { 919 W.startLine() << "UnwindInfo not implemented.\n"; 920 } 921 922 namespace { 923 template <> 924 void ELFDumper<ELFType<support::little, 2, false> >::printUnwindInfo() { 925 const unsigned Machine = Obj->getHeader()->e_machine; 926 if (Machine == EM_ARM) { 927 ARM::EHABI::PrinterContext<ELFType<support::little, 2, false> > Ctx(W, Obj); 928 return Ctx.PrintUnwindInformation(); 929 } 930 W.startLine() << "UnwindInfo not implemented.\n"; 931 } 932 } 933 934 template<class ELFT> 935 void ELFDumper<ELFT>::printDynamicTable() { 936 auto DynTable = Obj->dynamic_table(true); 937 938 ptrdiff_t Total = std::distance(DynTable.begin(), DynTable.end()); 939 if (Total == 0) 940 return; 941 942 raw_ostream &OS = W.getOStream(); 943 W.startLine() << "DynamicSection [ (" << Total << " entries)\n"; 944 945 bool Is64 = ELFT::Is64Bits; 946 947 W.startLine() 948 << " Tag" << (Is64 ? " " : " ") << "Type" 949 << " " << "Name/Value\n"; 950 for (const auto &Entry : DynTable) { 951 W.startLine() 952 << " " 953 << format(Is64 ? "0x%016" PRIX64 : "0x%08" PRIX64, Entry.getTag()) 954 << " " << format("%-21s", getTypeString(Entry.getTag())); 955 printValue(Obj, Entry.getTag(), Entry.getVal(), Is64, OS); 956 OS << "\n"; 957 } 958 959 W.startLine() << "]\n"; 960 } 961 962 template<class ELFT> 963 void ELFDumper<ELFT>::printNeededLibraries() { 964 ListScope D(W, "NeededLibraries"); 965 966 typedef std::vector<StringRef> LibsTy; 967 LibsTy Libs; 968 969 for (const auto &Entry : Obj->dynamic_table()) 970 if (Entry.d_tag == ELF::DT_NEEDED) 971 Libs.push_back(Obj->getDynamicString(Entry.d_un.d_val)); 972 973 std::stable_sort(Libs.begin(), Libs.end()); 974 975 for (LibsTy::const_iterator I = Libs.begin(), E = Libs.end(); I != E; ++I) { 976 outs() << " " << *I << "\n"; 977 } 978 } 979 980 template<class ELFT> 981 void ELFDumper<ELFT>::printProgramHeaders() { 982 ListScope L(W, "ProgramHeaders"); 983 984 for (typename ELFO::Elf_Phdr_Iter PI = Obj->begin_program_headers(), 985 PE = Obj->end_program_headers(); 986 PI != PE; ++PI) { 987 DictScope P(W, "ProgramHeader"); 988 W.printHex ("Type", 989 getElfSegmentType(Obj->getHeader()->e_machine, PI->p_type), 990 PI->p_type); 991 W.printHex ("Offset", PI->p_offset); 992 W.printHex ("VirtualAddress", PI->p_vaddr); 993 W.printHex ("PhysicalAddress", PI->p_paddr); 994 W.printNumber("FileSize", PI->p_filesz); 995 W.printNumber("MemSize", PI->p_memsz); 996 W.printFlags ("Flags", PI->p_flags, makeArrayRef(ElfSegmentFlags)); 997 W.printNumber("Alignment", PI->p_align); 998 } 999 } 1000 1001 template <class ELFT> 1002 void ELFDumper<ELFT>::printAttributes() { 1003 W.startLine() << "Attributes not implemented.\n"; 1004 } 1005 1006 namespace { 1007 template <> 1008 void ELFDumper<ELFType<support::little, 2, false> >::printAttributes() { 1009 if (Obj->getHeader()->e_machine != EM_ARM) { 1010 W.startLine() << "Attributes not implemented.\n"; 1011 return; 1012 } 1013 1014 DictScope BA(W, "BuildAttributes"); 1015 for (ELFO::Elf_Shdr_Iter SI = Obj->begin_sections(), SE = Obj->end_sections(); 1016 SI != SE; ++SI) { 1017 if (SI->sh_type != ELF::SHT_ARM_ATTRIBUTES) 1018 continue; 1019 1020 ErrorOr<ArrayRef<uint8_t> > Contents = Obj->getSectionContents(&(*SI)); 1021 if (!Contents) 1022 continue; 1023 1024 if ((*Contents)[0] != ARMBuildAttrs::Format_Version) { 1025 errs() << "unrecognised FormatVersion: 0x" << utohexstr((*Contents)[0]) 1026 << '\n'; 1027 continue; 1028 } 1029 1030 W.printHex("FormatVersion", (*Contents)[0]); 1031 if (Contents->size() == 1) 1032 continue; 1033 1034 ARMAttributeParser(W).Parse(*Contents); 1035 } 1036 } 1037 } 1038 1039 namespace { 1040 template <class ELFT> class MipsGOTParser { 1041 public: 1042 typedef object::ELFFile<ELFT> ObjectFile; 1043 typedef typename ObjectFile::Elf_Shdr Elf_Shdr; 1044 1045 MipsGOTParser(const ObjectFile *Obj, StreamWriter &W) : Obj(Obj), W(W) {} 1046 1047 void parseGOT(const Elf_Shdr &GOTShdr); 1048 1049 private: 1050 typedef typename ObjectFile::Elf_Sym_Iter Elf_Sym_Iter; 1051 typedef typename ObjectFile::Elf_Addr GOTEntry; 1052 typedef typename ObjectFile::template ELFEntityIterator<const GOTEntry> 1053 GOTIter; 1054 1055 const ObjectFile *Obj; 1056 StreamWriter &W; 1057 1058 std::size_t getGOTTotal(ArrayRef<uint8_t> GOT) const; 1059 GOTIter makeGOTIter(ArrayRef<uint8_t> GOT, std::size_t EntryNum); 1060 1061 bool getGOTTags(uint64_t &LocalGotNum, uint64_t &GotSym); 1062 void printGotEntry(uint64_t GotAddr, GOTIter BeginIt, GOTIter It); 1063 void printGlobalGotEntry(uint64_t GotAddr, GOTIter BeginIt, GOTIter It, 1064 Elf_Sym_Iter Sym); 1065 }; 1066 } 1067 1068 template <class ELFT> 1069 void MipsGOTParser<ELFT>::parseGOT(const Elf_Shdr &GOTShdr) { 1070 // See "Global Offset Table" in Chapter 5 in the following document 1071 // for detailed GOT description. 1072 // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf 1073 1074 ErrorOr<ArrayRef<uint8_t>> GOT = Obj->getSectionContents(&GOTShdr); 1075 if (!GOT) { 1076 W.startLine() << "The .got section is empty.\n"; 1077 return; 1078 } 1079 1080 uint64_t DtLocalGotNum; 1081 uint64_t DtGotSym; 1082 if (!getGOTTags(DtLocalGotNum, DtGotSym)) 1083 return; 1084 1085 if (DtLocalGotNum > getGOTTotal(*GOT)) { 1086 W.startLine() << "MIPS_LOCAL_GOTNO exceeds a number of GOT entries.\n"; 1087 return; 1088 } 1089 1090 Elf_Sym_Iter DynSymBegin = Obj->begin_dynamic_symbols(); 1091 Elf_Sym_Iter DynSymEnd = Obj->end_dynamic_symbols(); 1092 std::size_t DynSymTotal = std::size_t(std::distance(DynSymBegin, DynSymEnd)); 1093 1094 if (DtGotSym > DynSymTotal) { 1095 W.startLine() << "MIPS_GOTSYM exceeds a number of dynamic symbols.\n"; 1096 return; 1097 } 1098 1099 std::size_t GlobalGotNum = DynSymTotal - DtGotSym; 1100 1101 if (DtLocalGotNum + GlobalGotNum > getGOTTotal(*GOT)) { 1102 W.startLine() << "Number of global GOT entries exceeds the size of GOT.\n"; 1103 return; 1104 } 1105 1106 GOTIter GotBegin = makeGOTIter(*GOT, 0); 1107 GOTIter GotLocalEnd = makeGOTIter(*GOT, DtLocalGotNum); 1108 GOTIter It = GotBegin; 1109 1110 DictScope GS(W, "Primary GOT"); 1111 1112 W.printHex("Canonical gp value", GOTShdr.sh_addr + 0x7ff0); 1113 { 1114 ListScope RS(W, "Reserved entries"); 1115 1116 { 1117 DictScope D(W, "Entry"); 1118 printGotEntry(GOTShdr.sh_addr, GotBegin, It++); 1119 W.printString("Purpose", StringRef("Lazy resolver")); 1120 } 1121 1122 if (It != GotLocalEnd && (*It >> (sizeof(GOTEntry) * 8 - 1)) != 0) { 1123 DictScope D(W, "Entry"); 1124 printGotEntry(GOTShdr.sh_addr, GotBegin, It++); 1125 W.printString("Purpose", StringRef("Module pointer (GNU extension)")); 1126 } 1127 } 1128 { 1129 ListScope LS(W, "Local entries"); 1130 for (; It != GotLocalEnd; ++It) { 1131 DictScope D(W, "Entry"); 1132 printGotEntry(GOTShdr.sh_addr, GotBegin, It); 1133 } 1134 } 1135 { 1136 ListScope GS(W, "Global entries"); 1137 1138 GOTIter GotGlobalEnd = makeGOTIter(*GOT, DtLocalGotNum + GlobalGotNum); 1139 Elf_Sym_Iter GotDynSym = DynSymBegin + DtGotSym; 1140 for (; It != GotGlobalEnd; ++It) { 1141 DictScope D(W, "Entry"); 1142 printGlobalGotEntry(GOTShdr.sh_addr, GotBegin, It, GotDynSym++); 1143 } 1144 } 1145 1146 std::size_t SpecGotNum = getGOTTotal(*GOT) - DtLocalGotNum - GlobalGotNum; 1147 W.printNumber("Number of TLS and multi-GOT entries", uint64_t(SpecGotNum)); 1148 } 1149 1150 template <class ELFT> 1151 std::size_t MipsGOTParser<ELFT>::getGOTTotal(ArrayRef<uint8_t> GOT) const { 1152 return GOT.size() / sizeof(GOTEntry); 1153 } 1154 1155 template <class ELFT> 1156 typename MipsGOTParser<ELFT>::GOTIter 1157 MipsGOTParser<ELFT>::makeGOTIter(ArrayRef<uint8_t> GOT, std::size_t EntryNum) { 1158 const char *Data = reinterpret_cast<const char *>(GOT.data()); 1159 return GOTIter(sizeof(GOTEntry), Data + EntryNum * sizeof(GOTEntry)); 1160 } 1161 1162 template <class ELFT> 1163 bool MipsGOTParser<ELFT>::getGOTTags(uint64_t &LocalGotNum, uint64_t &GotSym) { 1164 bool FoundLocalGotNum = false; 1165 bool FoundGotSym = false; 1166 for (const auto &Entry : Obj->dynamic_table()) { 1167 switch (Entry.getTag()) { 1168 case ELF::DT_MIPS_LOCAL_GOTNO: 1169 LocalGotNum = Entry.getVal(); 1170 FoundLocalGotNum = true; 1171 break; 1172 case ELF::DT_MIPS_GOTSYM: 1173 GotSym = Entry.getVal(); 1174 FoundGotSym = true; 1175 break; 1176 } 1177 } 1178 1179 if (!FoundLocalGotNum) { 1180 W.startLine() << "Cannot find MIPS_LOCAL_GOTNO dynamic table tag.\n"; 1181 return false; 1182 } 1183 1184 if (!FoundGotSym) { 1185 W.startLine() << "Cannot find MIPS_GOTSYM dynamic table tag.\n"; 1186 return false; 1187 } 1188 1189 return true; 1190 } 1191 1192 template <class ELFT> 1193 void MipsGOTParser<ELFT>::printGotEntry(uint64_t GotAddr, GOTIter BeginIt, 1194 GOTIter It) { 1195 int64_t Offset = std::distance(BeginIt, It) * sizeof(GOTEntry); 1196 W.printHex("Address", GotAddr + Offset); 1197 W.printNumber("Access", Offset - 0x7ff0); 1198 W.printHex("Initial", *It); 1199 } 1200 1201 template <class ELFT> 1202 void MipsGOTParser<ELFT>::printGlobalGotEntry(uint64_t GotAddr, GOTIter BeginIt, 1203 GOTIter It, Elf_Sym_Iter Sym) { 1204 printGotEntry(GotAddr, BeginIt, It); 1205 1206 W.printHex("Value", Sym->st_value); 1207 W.printEnum("Type", Sym->getType(), makeArrayRef(ElfSymbolTypes)); 1208 1209 unsigned SectionIndex = 0; 1210 StringRef SectionName; 1211 getSectionNameIndex(*Obj, Sym, SectionName, SectionIndex); 1212 W.printHex("Section", SectionName, SectionIndex); 1213 1214 std::string FullSymbolName = getFullSymbolName(*Obj, Sym); 1215 W.printNumber("Name", FullSymbolName, Sym->st_name); 1216 } 1217 1218 template <class ELFT> void ELFDumper<ELFT>::printMipsPLTGOT() { 1219 if (Obj->getHeader()->e_machine != EM_MIPS) { 1220 W.startLine() << "MIPS PLT GOT is available for MIPS targets only.\n"; 1221 return; 1222 } 1223 1224 llvm::Optional<uint64_t> DtPltGot; 1225 for (const auto &Entry : Obj->dynamic_table()) { 1226 if (Entry.getTag() == ELF::DT_PLTGOT) { 1227 DtPltGot = Entry.getVal(); 1228 break; 1229 } 1230 } 1231 1232 if (!DtPltGot) { 1233 W.startLine() << "Cannot find PLTGOT dynamic table tag.\n"; 1234 return; 1235 } 1236 1237 const Elf_Shdr *GotShdr = findSectionByAddress(Obj, *DtPltGot); 1238 if (!GotShdr) { 1239 W.startLine() << "There is no .got section in the file.\n"; 1240 return; 1241 } 1242 1243 MipsGOTParser<ELFT>(Obj, W).parseGOT(*GotShdr); 1244 } 1245