Lines Matching +full:38 +full:- +full:bloom
1 //===-- ELFDumper.cpp - ELF-specific dumper ---------------------*- C++ -*-===//
8 //===----------------------------------------------------------------------===//
11 /// \brief This file implements the ELF-specific dumper for llvm-readobj.
13 //===----------------------------------------------------------------------===//
20 #include "llvm-readobj.h"
155 if (DRI.Addr < Obj->base() || in checkDRI()
156 (const uint8_t *)DRI.Addr + DRI.Size > Obj->base() + Obj->getBufSize()) in checkDRI()
162 return checkDRI({Obj->base() + P->p_offset, P->p_filesz, EntSize}); in createDRIFrom()
166 return checkDRI({Obj->base() + S->sh_offset, S->sh_size, S->sh_entsize}); in createDRIFrom()
260 StrTable = unwrapOrError(Obj->getStringTableForSymtab(*DotSymtabSec)); in printSymbolsHelper()
261 Syms = Obj->symbols(DotSymtabSec); in printSymbolsHelper()
262 SymtabName = unwrapOrError(Obj->getSectionName(DotSymtabSec)); in printSymbolsHelper()
263 Entries = DotSymtabSec->getEntityCount(); in printSymbolsHelper()
267 ELFDumperStyle->printSymtabMessage(Obj, SymtabName, Entries); in printSymbolsHelper()
269 ELFDumperStyle->printSymbol(Obj, &Sym, Syms.begin(), StrTable, IsDynamic); in printSymbolsHelper()
394 // Little-endian 32-bit in createELFDumper()
396 return createELFDumper(ELFObj->getELFFile(), Writer, Result); in createELFDumper()
398 // Big-endian 32-bit in createELFDumper()
400 return createELFDumper(ELFObj->getELFFile(), Writer, Result); in createELFDumper()
402 // Little-endian 64-bit in createELFDumper()
404 return createELFDumper(ELFObj->getELFFile(), Writer, Result); in createELFDumper()
406 // Big-endian 64-bit in createELFDumper()
408 return createELFDumper(ELFObj->getELFFile(), Writer, Result); in createELFDumper()
419 unsigned vn_size = sec->sh_size; // Size of section in bytes in LoadVersionNeeds()
420 unsigned vn_count = sec->sh_info; // Number of Verneed entries in LoadVersionNeeds()
421 const char *sec_start = (const char *)Obj->base() + sec->sh_offset; in LoadVersionNeeds()
430 if (vn->vn_version != ELF::VER_NEED_CURRENT) in LoadVersionNeeds()
433 const char *paux = p + vn->vn_aux; in LoadVersionNeeds()
434 for (unsigned j = 0; j < vn->vn_cnt; j++) { in LoadVersionNeeds()
439 size_t index = vna->vna_other & ELF::VERSYM_VERSION; in LoadVersionNeeds()
443 paux += vna->vna_next; in LoadVersionNeeds()
445 p += vn->vn_next; in LoadVersionNeeds()
453 unsigned vd_size = sec->sh_size; // Size of section in bytes in LoadVersionDefs()
454 unsigned vd_count = sec->sh_info; // Number of Verdef entries in LoadVersionDefs()
455 const char *sec_start = (const char *)Obj->base() + sec->sh_offset; in LoadVersionDefs()
464 if (vd->vd_version != ELF::VER_DEF_CURRENT) in LoadVersionDefs()
466 size_t index = vd->vd_ndx & ELF::VERSYM_VERSION; in LoadVersionDefs()
470 p += vd->vd_next; in LoadVersionDefs()
502 StringRef Name = unwrapOrError(Obj->getSectionName(Sec)); in printVersionSymbolSection()
503 W.printNumber("Section Name", Name, Sec->sh_name); in printVersionSymbolSection()
504 W.printHex("Address", Sec->sh_addr); in printVersionSymbolSection()
505 W.printHex("Offset", Sec->sh_offset); in printVersionSymbolSection()
506 W.printNumber("Link", Sec->sh_link); in printVersionSymbolSection()
508 const uint8_t *P = (const uint8_t *)Obj->base() + Sec->sh_offset; in printVersionSymbolSection()
509 StringRef StrTable = Dumper->getDynamicStringTable(); in printVersionSymbolSection()
513 for (const typename ELFO::Elf_Sym &Sym : Dumper->dynamic_symbols()) { in printVersionSymbolSection()
516 Dumper->getFullSymbolName(&Sym, StrTable, true /* IsDynamic */); in printVersionSymbolSection()
543 for (const typename ELFO::Elf_Dyn &Dyn : Dumper->dynamic_table()) { in printVersionDefinitionSection()
548 (const uint8_t *)Obj->base() + Sec->sh_offset; in printVersionDefinitionSection()
549 const uint8_t *SecEndAddress = SecStartAddress + Sec->sh_size; in printVersionDefinitionSection()
552 unwrapOrError(Obj->getSection(Sec->sh_link)); in printVersionDefinitionSection()
554 while (VerDefsNum--) { in printVersionDefinitionSection()
560 W.printNumber("Version", VD->vd_version); in printVersionDefinitionSection()
561 W.printEnum("Flags", VD->vd_flags, makeArrayRef(SymVersionFlags)); in printVersionDefinitionSection()
562 W.printNumber("Index", VD->vd_ndx); in printVersionDefinitionSection()
563 W.printNumber("Hash", VD->vd_hash); in printVersionDefinitionSection()
565 StringRef((const char *)(Obj->base() + StrTab->sh_offset + in printVersionDefinitionSection()
566 VD->getAux()->vda_name))); in printVersionDefinitionSection()
567 if (!VD->vd_cnt) in printVersionDefinitionSection()
569 if (VD->vd_cnt > 2) in printVersionDefinitionSection()
572 if (VD->vd_cnt == 2) { in printVersionDefinitionSection()
573 const uint8_t *PAux = P + VD->vd_aux + VD->getAux()->vda_next; in printVersionDefinitionSection()
576 StringRef((const char *)(Obj->base() + StrTab->sh_offset + in printVersionDefinitionSection()
577 Aux->vda_name))); in printVersionDefinitionSection()
580 P += VD->vd_next; in printVersionDefinitionSection()
597 for (const typename ELFO::Elf_Dyn &Dyn : Dumper->dynamic_table()) in printVersionDependencySection()
601 const uint8_t *SecData = (const uint8_t *)Obj->base() + Sec->sh_offset; in printVersionDependencySection()
603 unwrapOrError(Obj->getSection(Sec->sh_link)); in printVersionDependencySection()
609 W.printNumber("Version", Need->vn_version); in printVersionDependencySection()
610 W.printNumber("Count", Need->vn_cnt); in printVersionDependencySection()
612 StringRef((const char *)(Obj->base() + StrTab->sh_offset + in printVersionDependencySection()
613 Need->vn_file))); in printVersionDependencySection()
615 const uint8_t *PAux = P + Need->vn_aux; in printVersionDependencySection()
616 for (unsigned J = 0; J < Need->vn_cnt; ++J) { in printVersionDependencySection()
619 W.printNumber("Hash", Aux->vna_hash); in printVersionDependencySection()
620 W.printEnum("Flags", Aux->vna_flags, makeArrayRef(SymVersionFlags)); in printVersionDependencySection()
621 W.printNumber("Index", Aux->vna_other); in printVersionDependencySection()
623 StringRef((const char *)(Obj->base() + StrTab->sh_offset + in printVersionDependencySection()
624 Aux->vna_name))); in printVersionDependencySection()
625 PAux += Aux->vna_next; in printVersionDependencySection()
627 P += Need->vn_next; in printVersionDependencySection()
654 size_t entry_index = (reinterpret_cast<uintptr_t>(symb) - in getSymbolVersion()
660 Obj->template getEntry<Elf_Versym>(dot_gnu_version_sec, entry_index); in getSymbolVersion()
661 size_t version_index = vs->vs_index & ELF::VERSYM_VERSION; in getSymbolVersion()
680 name_offset = entry.getVerdef()->getAux()->vda_name; in getSymbolVersion()
681 IsDefault = !(vs->vs_index & ELF::VERSYM_HIDDEN); in getSymbolVersion()
683 name_offset = entry.getVernaux()->vna_name; in getSymbolVersion()
695 StringRef SymbolName = unwrapOrError(Symbol->getName(StrTable)); in getFullSymbolName()
714 SectionIndex = Symbol->st_shndx; in getSectionNameIndex()
715 if (Symbol->isUndefined()) in getSectionNameIndex()
717 else if (Symbol->isProcessorSpecific()) in getSectionNameIndex()
719 else if (Symbol->isOSSpecific()) in getSectionNameIndex()
721 else if (Symbol->isAbsolute()) in getSectionNameIndex()
723 else if (Symbol->isCommon()) in getSectionNameIndex()
725 else if (Symbol->isReserved() && SectionIndex != SHN_XINDEX) in getSectionNameIndex()
740 for (const auto &Shdr : unwrapOrError(Obj->sections())) in findNotEmptySectionByAddress()
758 {"32-bit", "ELF32", ELF::ELFCLASS32},
759 {"64-bit", "ELF64", ELF::ELFCLASS64},
777 {"SystemV", "UNIX - System V", ELF::ELFOSABI_NONE},
778 {"HPUX", "UNIX - HP-UX", ELF::ELFOSABI_HPUX},
779 {"NetBSD", "UNIX - NetBSD", ELF::ELFOSABI_NETBSD},
780 {"GNU/Linux", "UNIX - GNU", ELF::ELFOSABI_LINUX},
782 {"Solaris", "UNIX - Solaris", ELF::ELFOSABI_SOLARIS},
783 {"AIX", "UNIX - AIX", ELF::ELFOSABI_AIX},
784 {"IRIX", "UNIX - IRIX", ELF::ELFOSABI_IRIX},
785 {"FreeBSD", "UNIX - FreeBSD", ELF::ELFOSABI_FREEBSD},
786 {"TRU64", "UNIX - TRU64", ELF::ELFOSABI_TRU64},
787 {"Modesto", "Novell - Modesto", ELF::ELFOSABI_MODESTO},
788 {"OpenBSD", "UNIX - OpenBSD", ELF::ELFOSABI_OPENBSD},
789 {"OpenVMS", "VMS - OpenVMS", ELF::ELFOSABI_OPENVMS},
790 {"NSK", "HP - Non-Stop Kernel", ELF::ELFOSABI_NSK},
794 {"C6000_ELFABI", "Bare-metal C6000", ELF::ELFOSABI_C6000_ELFABI},
811 ENUM_ENT(EM_MIPS_RS3_LE, "MIPS R3000 little-endian"),
822 ENUM_ENT(EM_RH32, "TRW RH-32"),
834 ENUM_ENT(EM_IA_64, "Intel IA-64"),
835 ENUM_ENT(EM_MIPS_X, "Stanford MIPS-X"),
846 ENUM_ENT(EM_X86_64, "Advanced Micro Devices X86-64"),
848 ENUM_ENT(EM_PDP10, "Digital Equipment Corp. PDP-10"),
849 ENUM_ENT(EM_PDP11, "Digital Equipment Corp. PDP-11"),
852 ENUM_ENT(EM_ST7, "STMicroelectronics ST7 8-bit microcontroller"),
858 ENUM_ENT(EM_ST19, "STMicroelectronics ST19 8-bit microcontroller"),
860 ENUM_ENT(EM_CRIS, "Axis Communications 32-bit embedded processor"),
861 ENUM_ENT(EM_JAVELIN, "Infineon Technologies 32-bit embedded cpu"),
862 ENUM_ENT(EM_FIREPATH, "Element 14 64-bit DSP processor"),
863 ENUM_ENT(EM_ZSP, "LSI Logic's 16-bit DSP processor"),
864 ENUM_ENT(EM_MMIX, "Donald Knuth's educational 64-bit processor"),
865 ENUM_ENT(EM_HUANY, "Harvard Universitys's machine-independent object format"),
867 ENUM_ENT(EM_AVR, "Atmel AVR 8-bit microcontroller"),
876 ENUM_ENT(EM_OPENRISC, "OpenRISC 32-bit embedded processor"),
885 ENUM_ENT(EM_IP2K, "Ubicom IP2xxx 8-bit microcontrollers"),
895 ENUM_ENT(EM_EXCESS, "eXcess 16/32/64-bit configurable embedded CPU"),
910 ENUM_ENT(EM_DSP24, "New Japan Radio (NJR) 24-bit DSP Processor"),
928 ENUM_ENT(EM_XIMO16, "New Japan Radio (NJR) 16-bit DSP Processor"),
941 ENUM_ENT(EM_AVR32, "Atmel AVR 8-bit microcontroller"),
942 ENUM_ENT(EM_STM8, "STMicroeletronics STM8 8-bit microcontroller"),
946 ENUM_ENT(EM_TILEGX, "Tilera TILE-Gx multicore architecture family"),
1126 // Check potentially overlapped processor-specific in getElfSegmentType()
1311 for (const Elf_Phdr &Phdr : Obj->program_headers()) { in ELFDumper()
1321 for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { in ELFDumper()
1333 DynSymtabName = unwrapOrError(Obj->getSectionName(&Sec)); in ELFDumper()
1336 ShndxTable = unwrapOrError(Obj->getSHNDXTable(Sec)); in ELFDumper()
1367 auto toMappedAddr = [&](uint64_t VAddr) -> const uint8_t * { in parseDynamicTable()
1372 --I; in parseDynamicTable()
1374 uint64_t Delta = VAddr - Phdr.p_vaddr; in parseDynamicTable()
1377 return Obj->base() + Phdr.p_offset + Delta; in parseDynamicTable()
1459 ELFDumperStyle->printFileHeaders(Obj); in printFileHeaders()
1464 ELFDumperStyle->printSections(Obj); in printSections()
1469 ELFDumperStyle->printRelocations(Obj); in printRelocations()
1473 ELFDumperStyle->printProgramHeaders(Obj); in printProgramHeaders()
1477 ELFDumperStyle->printDynamicRelocations(Obj); in printDynamicRelocations()
1482 ELFDumperStyle->printSymbols(Obj); in printSymbols()
1487 ELFDumperStyle->printDynamicSymbols(Obj); in printDynamicSymbols()
1491 ELFDumperStyle->printHashHistogram(Obj); in printHashHistogram()
1739 const unsigned Machine = Obj->getHeader()->e_machine; in printUnwindInfo()
1757 --E; in printDynamicTable()
1758 while (I != E && E->getTag() == ELF::DT_NULL) in printDynamicTable()
1759 --E; in printDynamicTable()
1760 if (E->getTag() != ELF::DT_NULL) in printDynamicTable()
1781 << format("%-21s", getTypeString(Tag)); in printDynamicTable()
1813 W.printNumber("Num Buckets", HashTable->nbucket); in printHashTable()
1814 W.printNumber("Num Chains", HashTable->nchain); in printHashTable()
1815 W.printList("Buckets", HashTable->buckets()); in printHashTable()
1816 W.printList("Chains", HashTable->chains()); in printHashTable()
1824 W.printNumber("Num Buckets", GnuHashTable->nbuckets); in printGnuHashTable()
1825 W.printNumber("First Hashed Symbol Index", GnuHashTable->symndx); in printGnuHashTable()
1826 W.printNumber("Num Mask Words", GnuHashTable->maskwords); in printGnuHashTable()
1827 W.printNumber("Shift Count", GnuHashTable->shift2); in printGnuHashTable()
1828 W.printHexList("Bloom Filter", GnuHashTable->filter()); in printGnuHashTable()
1829 W.printList("Buckets", GnuHashTable->buckets()); in printGnuHashTable()
1834 W.printHexList("Values", GnuHashTable->values(NumSyms)); in printGnuHashTable()
1848 if (Obj->getHeader()->e_machine != EM_ARM) { in printAttributes()
1854 for (const ELFO::Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { in printAttributes()
1858 ArrayRef<uint8_t> Contents = unwrapOrError(Obj->getSectionContents(&Sec)); in printAttributes()
1945 // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf in parseGOT()
1959 StringRef StrTable = Dumper->getDynamicStringTable(); in parseGOT()
1960 const Elf_Sym *DynSymBegin = Dumper->dynamic_symbols().begin(); in parseGOT()
1961 const Elf_Sym *DynSymEnd = Dumper->dynamic_symbols().end(); in parseGOT()
1967 std::size_t GlobalGotNum = DynSymTotal - *DtGotSym; in parseGOT()
1979 ArrayRef<uint8_t> GOT = unwrapOrError(Obj->getSectionContents(GOTShdr)); in parseGOT()
1990 W.printHex("Canonical gp value", GOTShdr->sh_addr + 0x7ff0); in parseGOT()
1996 printGotEntry(GOTShdr->sh_addr, GotBegin, It++); in parseGOT()
2000 if (It != GotLocalEnd && (*It >> (sizeof(GOTEntry) * 8 - 1)) != 0) { in parseGOT()
2002 printGotEntry(GOTShdr->sh_addr, GotBegin, It++); in parseGOT()
2010 printGotEntry(GOTShdr->sh_addr, GotBegin, It); in parseGOT()
2021 printGlobalGotEntry(GOTShdr->sh_addr, GotBegin, It, GotDynSym++, StrTable, in parseGOT()
2026 std::size_t SpecGotNum = getGOTTotal(GOT) - *DtLocalGotNum - GlobalGotNum; in parseGOT()
2027 W.printNumber("Number of TLS and multi-GOT entries", uint64_t(SpecGotNum)); in parseGOT()
2044 ArrayRef<uint8_t> PLT = unwrapOrError(Obj->getSectionContents(PLTShdr)); in parsePLT()
2051 unwrapOrError(Obj->getSection(PLTRelShdr->sh_link)); in parsePLT()
2052 StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*SymTable)); in parsePLT()
2061 printPLTEntry(PLTShdr->sh_addr, PLTBegin, It++, "PLT lazy resolver"); in parsePLT()
2063 printPLTEntry(PLTShdr->sh_addr, PLTBegin, It++, "Module pointer"); in parsePLT()
2068 switch (PLTRelShdr->sh_type) { in parsePLT()
2070 for (const Elf_Rel *RI = Obj->rel_begin(PLTRelShdr), in parsePLT()
2071 *RE = Obj->rel_end(PLTRelShdr); in parsePLT()
2073 const Elf_Sym *Sym = Obj->getRelocationSymbol(&*RI, SymTable); in parsePLT()
2074 printPLTEntry(PLTShdr->sh_addr, PLTBegin, It, StrTable, Sym); in parsePLT()
2078 for (const Elf_Rela *RI = Obj->rela_begin(PLTRelShdr), in parsePLT()
2079 *RE = Obj->rela_end(PLTRelShdr); in parsePLT()
2081 const Elf_Sym *Sym = Obj->getRelocationSymbol(&*RI, SymTable); in parsePLT()
2082 printPLTEntry(PLTShdr->sh_addr, PLTBegin, It, StrTable, Sym); in parsePLT()
2107 W.printNumber("Access", Offset - 0x7ff0); in printGotEntry()
2117 W.printHex("Value", Sym->st_value); in printGlobalGotEntry()
2118 W.printEnum("Type", Sym->getType(), makeArrayRef(ElfSymbolTypes)); in printGlobalGotEntry()
2122 getSectionNameIndex(*Obj, Sym, Dumper->dynamic_symbols().begin(), in printGlobalGotEntry()
2123 Dumper->getShndxTable(), SectionName, SectionIndex); in printGlobalGotEntry()
2127 Dumper->getFullSymbolName(Sym, StrTable, IsDynamic); in printGlobalGotEntry()
2128 W.printNumber("Name", FullSymbolName, Sym->st_name); in printGlobalGotEntry()
2151 W.printHex("Value", Sym->st_value); in printPLTEntry()
2152 W.printEnum("Type", Sym->getType(), makeArrayRef(ElfSymbolTypes)); in printPLTEntry()
2156 getSectionNameIndex(*Obj, Sym, Dumper->dynamic_symbols().begin(), in printPLTEntry()
2157 Dumper->getShndxTable(), SectionName, SectionIndex); in printPLTEntry()
2160 std::string FullSymbolName = Dumper->getFullSymbolName(Sym, StrTable, true); in printPLTEntry()
2161 W.printNumber("Name", FullSymbolName, Sym->st_name); in printPLTEntry()
2165 if (Obj->getHeader()->e_machine != EM_MIPS) { in printMipsPLTGOT()
2177 {"Broadcom SB-1", Mips::AFL_EXT_SB1},
2204 {"MIPS-3D", Mips::AFL_ASE_MIPS3D},
2219 {"Hard float (MIPS32r2 64-bit FPU 12 callee-saved)",
2221 {"Hard float (32-bit CPU, Any FPU)", Mips::Val_GNU_MIPS_ABI_FP_XX},
2222 {"Hard float (32-bit CPU, 64-bit FPU)", Mips::Val_GNU_MIPS_ABI_FP_64},
2223 {"Hard float compat (32-bit CPU, 64-bit FPU)",
2242 return -1; in getMipsRegisterSize()
2252 ArrayRef<uint8_t> Sec = unwrapOrError(Obj->getSectionContents(Shdr)); in printMipsABIFlags()
2263 W.printNumber("Version", Flags->version); in printMipsABIFlags()
2265 if (Flags->isa_rev <= 1) in printMipsABIFlags()
2266 OS << format("MIPS%u", Flags->isa_level); in printMipsABIFlags()
2268 OS << format("MIPS%ur%u", Flags->isa_level, Flags->isa_rev); in printMipsABIFlags()
2270 W.printEnum("ISA Extension", Flags->isa_ext, makeArrayRef(ElfMipsISAExtType)); in printMipsABIFlags()
2271 W.printFlags("ASEs", Flags->ases, makeArrayRef(ElfMipsASEFlags)); in printMipsABIFlags()
2272 W.printEnum("FP ABI", Flags->fp_abi, makeArrayRef(ElfMipsFpABIType)); in printMipsABIFlags()
2273 W.printNumber("GPR size", getMipsRegisterSize(Flags->gpr_size)); in printMipsABIFlags()
2274 W.printNumber("CPR1 size", getMipsRegisterSize(Flags->cpr1_size)); in printMipsABIFlags()
2275 W.printNumber("CPR2 size", getMipsRegisterSize(Flags->cpr2_size)); in printMipsABIFlags()
2276 W.printFlags("Flags 1", Flags->flags1, makeArrayRef(ElfMipsFlags1)); in printMipsABIFlags()
2277 W.printHex("Flags 2", Flags->flags2); in printMipsABIFlags()
2285 W.printHex("Co-Proc Mask0", Reginfo.ri_cprmask[0]); in printMipsReginfoData()
2286 W.printHex("Co-Proc Mask1", Reginfo.ri_cprmask[1]); in printMipsReginfoData()
2287 W.printHex("Co-Proc Mask2", Reginfo.ri_cprmask[2]); in printMipsReginfoData()
2288 W.printHex("Co-Proc Mask3", Reginfo.ri_cprmask[3]); in printMipsReginfoData()
2297 ArrayRef<uint8_t> Sec = unwrapOrError(Obj->getSectionContents(Shdr)); in printMipsReginfo()
2317 ArrayRef<uint8_t> Sec = unwrapOrError(Obj->getSectionContents(Shdr)); in printMipsOptions()
2324 DictScope GS(W, getElfMipsOptionsOdkType(O->kind)); in printMipsOptions()
2325 switch (O->kind) { in printMipsOptions()
2327 printMipsReginfoData(W, O->getRegInfo()); in printMipsOptions()
2333 Sec = Sec.slice(O->size); in printMipsOptions()
2339 for (const auto &Sec : unwrapOrError(Obj->sections())) { in printStackMap()
2340 StringRef Name = unwrapOrError(Obj->getSectionName(&Sec)); in printStackMap()
2352 unwrapOrError(Obj->getSectionContents(StackMapSection)); in printStackMap()
2359 ELFDumperStyle->printGroupSections(Obj); in printGroupSections()
2372 const Elf_Ehdr *e = Obj->getHeader(); in printFileHeaders()
2377 OS << format(" %02x", static_cast<int>(e->e_ident[i])); in printFileHeaders()
2379 Str = printEnum(e->e_ident[ELF::EI_CLASS], makeArrayRef(ElfClass)); in printFileHeaders()
2381 Str = printEnum(e->e_ident[ELF::EI_DATA], makeArrayRef(ElfDataEncoding)); in printFileHeaders()
2386 OS << to_hexString(e->e_ident[ELF::EI_VERSION]); in printFileHeaders()
2387 if (e->e_version == ELF::EV_CURRENT) in printFileHeaders()
2390 Str = printEnum(e->e_ident[ELF::EI_OSABI], makeArrayRef(ElfOSABI)); in printFileHeaders()
2392 Str = "0x" + to_hexString(e->e_version); in printFileHeaders()
2393 Str = to_hexString(e->e_ident[ELF::EI_ABIVERSION]); in printFileHeaders()
2395 Str = printEnum(e->e_type, makeArrayRef(ElfObjectFileType)); in printFileHeaders()
2397 Str = printEnum(e->e_machine, makeArrayRef(ElfMachineType)); in printFileHeaders()
2399 Str = "0x" + to_hexString(e->e_version); in printFileHeaders()
2401 Str = "0x" + to_hexString(e->e_entry); in printFileHeaders()
2403 Str = to_string(e->e_phoff) + " (bytes into file)"; in printFileHeaders()
2405 Str = to_string(e->e_shoff) + " (bytes into file)"; in printFileHeaders()
2407 Str = "0x" + to_hexString(e->e_flags); in printFileHeaders()
2409 Str = to_string(e->e_ehsize) + " (bytes)"; in printFileHeaders()
2411 Str = to_string(e->e_phentsize) + " (bytes)"; in printFileHeaders()
2413 Str = to_string(e->e_phnum); in printFileHeaders()
2415 Str = to_string(e->e_shentsize) + " (bytes)"; in printFileHeaders()
2417 Str = to_string(e->e_shnum); in printFileHeaders()
2419 Str = to_string(e->e_shstrndx); in printFileHeaders()
2426 for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { in printGroupSections()
2429 const Elf_Shdr *Symtab = unwrapOrError(Obj->getSection(Sec.sh_link)); in printGroupSections()
2430 StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*Symtab)); in printGroupSections()
2432 Obj->template getEntry<Elf_Sym>(Symtab, Sec.sh_info); in printGroupSections()
2434 Obj->template getSectionContentsAsArray<Elf_Word>(&Sec)); in printGroupSections()
2435 StringRef Name = unwrapOrError(Obj->getSectionName(&Sec)); in printGroupSections()
2438 << StrTable.data() + Signature->st_name << "] contains " in printGroupSections()
2439 << (Data.size() - 1) << " sections:\n" in printGroupSections()
2442 auto Sec = unwrapOrError(Obj->getSection(Ndx)); in printGroupSections()
2443 const StringRef Name = unwrapOrError(Obj->getSectionName(Sec)); in printGroupSections()
2459 StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*SymTab)); in printRelocation()
2468 Obj->getRelocationTypeName(R.getType(Obj->isMips64EL()), RelocName); in printRelocation()
2469 Sym = Obj->getRelocationSymbol(&R, SymTab); in printRelocation()
2470 if (Sym && Sym->getType() == ELF::STT_SECTION) { in printRelocation()
2472 Obj->getSection(Sym, SymTab, this->dumper()->getShndxTable())); in printRelocation()
2473 TargetName = unwrapOrError(Obj->getSectionName(Sec)); in printRelocation()
2475 TargetName = unwrapOrError(Sym->getName(StrTable)); in printRelocation()
2480 Addend = " - "; in printRelocation()
2493 Value = to_string(format_hex_no_prefix(Sym->getValue(), Width)); in printRelocation()
2520 for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { in printRelocations()
2524 StringRef Name = unwrapOrError(Obj->getSectionName(&Sec)); in printRelocations()
2531 const Elf_Shdr *SymTab = unwrapOrError(Obj->getSection(Sec.sh_link)); in printRelocations()
2533 for (const auto &R : Obj->rels(&Sec)) { in printRelocations()
2541 for (const auto &R : Obj->relas(&Sec)) in printRelocations()
2647 OS << "There are " << to_string(Obj->getHeader()->e_shnum) in printSections()
2649 << "0x" << to_hexString(Obj->getHeader()->e_shoff, false) << ":\n\n"; in printSections()
2655 {"Off", 58 - Bias}, in printSections()
2656 {"Size", 65 - Bias}, in printSections()
2657 {"ES", 72 - Bias}, in printSections()
2658 {"Flg", 75 - Bias}, in printSections()
2659 {"Lk", 79 - Bias}, in printSections()
2660 {"Inf", 82 - Bias}, in printSections()
2661 {"Al", 86 - Bias}}; in printSections()
2666 for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { in printSections()
2669 Fields[1].Str = unwrapOrError(Obj->getSectionName(&Sec)); in printSections()
2670 Type = getSectionTypeString(Obj->getHeader()->e_machine, Sec.sh_type); in printSections()
2731 unsigned SectionIndex = Symbol->st_shndx; in getSymbolSectionNdx()
2740 SectionIndex = Obj->getExtendedSymbolTableIndex( in getSymbolSectionNdx()
2741 Symbol, FirstSym, this->dumper()->getShndxTable()); in getSymbolSectionNdx()
2787 31 + Bias, 38 + Bias, 47 + Bias, 51 + Bias}; in printSymbol()
2789 Value = to_string(format_hex_no_prefix(Symbol->st_value, Width)); in printSymbol()
2790 Size = to_string(format_decimal(Symbol->st_size, 5)); in printSymbol()
2791 unsigned char SymbolType = Symbol->getType(); in printSymbol()
2792 if (Obj->getHeader()->e_machine == ELF::EM_AMDGPU && in printSymbol()
2797 unsigned Vis = Symbol->getVisibility(); in printSymbol()
2798 Binding = printEnum(Symbol->getBinding(), makeArrayRef(ElfSymbolBindings)); in printSymbol()
2801 Name = this->dumper()->getFullSymbolName(Symbol, StrTable, IsDynamic); in printSymbol()
2816 this->dumper()->printSymbolsHelper(true); in printSymbols()
2817 this->dumper()->printSymbolsHelper(false); in printSymbols()
2822 this->dumper()->printSymbolsHelper(true); in printDynamicSymbols()
2844 // Non-SHT_NOBITS must have its offset inside the segment
2845 // Only non-zero section can be at end of segment
2857 /*only non-zero sized sections at end*/ && in checkoffsets()
2863 // Only non-zero section can be at end of segment
2899 const Elf_Ehdr *Header = Obj->getHeader(); in printProgramHeaders()
2903 << printEnum(Header->e_type, makeArrayRef(ElfObjectFileType)) << "\n" in printProgramHeaders()
2904 << "Entry point " << format_hex(Header->e_entry, 3) << "\n" in printProgramHeaders()
2905 << "There are " << Header->e_phnum << " program headers," in printProgramHeaders()
2906 << " starting at offset " << Header->e_phoff << "\n\n" in printProgramHeaders()
2914 for (const auto &Phdr : Obj->program_headers()) { in printProgramHeaders()
2915 Type = getElfPtType(Header->e_machine, Phdr.p_type); in printProgramHeaders()
2935 OS << reinterpret_cast<const char *>(Obj->base()) + Phdr.p_offset << "]"; in printProgramHeaders()
2941 for (const Elf_Phdr &Phdr : Obj->program_headers()) { in printProgramHeaders()
2944 for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { in printProgramHeaders()
2955 Sections += unwrapOrError(Obj->getSectionName(&Sec)).str() + " "; in printProgramHeaders()
2973 uint32_t SymIndex = R.getSymbol(Obj->isMips64EL()); in printDynamicRelocation()
2974 const Elf_Sym *Sym = this->dumper()->dynamic_symbols().begin() + SymIndex; in printDynamicRelocation()
2975 Obj->getRelocationTypeName(R.getType(Obj->isMips64EL()), RelocName); in printDynamicRelocation()
2977 unwrapOrError(Sym->getName(this->dumper()->getDynamicStringTable())); in printDynamicRelocation()
2981 Value = to_string(format_hex_no_prefix(Sym->getValue(), Width)); in printDynamicRelocation()
2985 Addend = " - "; in printDynamicRelocation()
2990 if (!SymbolName.size() && Sym->getValue() == 0) in printDynamicRelocation()
3010 const DynRegionInfo &DynRelRegion = this->dumper()->getDynRelRegion(); in printDynamicRelocations()
3011 const DynRegionInfo &DynRelaRegion = this->dumper()->getDynRelaRegion(); in printDynamicRelocations()
3012 const DynRegionInfo &DynPLTRelRegion = this->dumper()->getDynPLTRelRegion(); in printDynamicRelocations()
3015 << format_hex(reinterpret_cast<const uint8_t *>(DynRelaRegion.Addr) - in printDynamicRelocations()
3016 Obj->base(), in printDynamicRelocations()
3019 for (const Elf_Rela &Rela : this->dumper()->dyn_relas()) in printDynamicRelocations()
3024 << format_hex(reinterpret_cast<const uint8_t *>(DynRelRegion.Addr) - in printDynamicRelocations()
3025 Obj->base(), in printDynamicRelocations()
3028 for (const Elf_Rel &Rel : this->dumper()->dyn_rels()) { in printDynamicRelocations()
3038 << format_hex(reinterpret_cast<const uint8_t *>(DynPLTRelRegion.Addr) - in printDynamicRelocations()
3039 Obj->base(), in printDynamicRelocations()
3065 const Elf_Hash *HashTable = this->dumper()->getHashTable(); in printHashHistogram()
3066 const Elf_GnuHash *GnuHashTable = this->dumper()->getGnuHashTable(); in printHashHistogram()
3070 size_t NBucket = HashTable->nbucket; in printHashHistogram()
3071 size_t NChain = HashTable->nchain; in printHashHistogram()
3072 ArrayRef<Elf_Word> Buckets = HashTable->buckets(); in printHashHistogram()
3073 ArrayRef<Elf_Word> Chains = HashTable->chains(); in printHashHistogram()
3106 OS << format("%7lu %-10lu (%5.1f%%) %5.1f%%\n", I, Count[I], in printHashHistogram()
3114 size_t NBucket = GnuHashTable->nbuckets; in printHashHistogram()
3115 ArrayRef<Elf_Word> Buckets = GnuHashTable->buckets(); in printHashHistogram()
3116 unsigned NumSyms = this->dumper()->dynamic_symbols().size(); in printHashHistogram()
3119 ArrayRef<Elf_Word> Chains = GnuHashTable->values(NumSyms); in printHashHistogram()
3120 size_t Symndx = GnuHashTable->symndx; in printHashHistogram()
3134 for (size_t C = Buckets[B] - Symndx; in printHashHistogram()
3156 OS << format("%7lu %-10lu (%5.1f%%) %5.1f%%\n", I, Count[I], in printHashHistogram()
3164 const Elf_Ehdr *e = Obj->getHeader(); in printFileHeaders()
3169 W.printBinary("Magic", makeArrayRef(e->e_ident).slice(ELF::EI_MAG0, 4)); in printFileHeaders()
3170 W.printEnum("Class", e->e_ident[ELF::EI_CLASS], makeArrayRef(ElfClass)); in printFileHeaders()
3171 W.printEnum("DataEncoding", e->e_ident[ELF::EI_DATA], in printFileHeaders()
3173 W.printNumber("FileVersion", e->e_ident[ELF::EI_VERSION]); in printFileHeaders()
3176 if (e->e_machine == ELF::EM_AMDGPU && in printFileHeaders()
3177 e->e_ident[ELF::EI_OSABI] == ELF::ELFOSABI_AMDGPU_HSA) in printFileHeaders()
3180 W.printEnum("OS/ABI", e->e_ident[ELF::EI_OSABI], in printFileHeaders()
3182 W.printNumber("ABIVersion", e->e_ident[ELF::EI_ABIVERSION]); in printFileHeaders()
3183 W.printBinary("Unused", makeArrayRef(e->e_ident).slice(ELF::EI_PAD)); in printFileHeaders()
3186 W.printEnum("Type", e->e_type, makeArrayRef(ElfObjectFileType)); in printFileHeaders()
3187 W.printEnum("Machine", e->e_machine, makeArrayRef(ElfMachineType)); in printFileHeaders()
3188 W.printNumber("Version", e->e_version); in printFileHeaders()
3189 W.printHex("Entry", e->e_entry); in printFileHeaders()
3190 W.printHex("ProgramHeaderOffset", e->e_phoff); in printFileHeaders()
3191 W.printHex("SectionHeaderOffset", e->e_shoff); in printFileHeaders()
3192 if (e->e_machine == EM_MIPS) in printFileHeaders()
3193 W.printFlags("Flags", e->e_flags, makeArrayRef(ElfHeaderMipsFlags), in printFileHeaders()
3197 W.printFlags("Flags", e->e_flags); in printFileHeaders()
3198 W.printNumber("HeaderSize", e->e_ehsize); in printFileHeaders()
3199 W.printNumber("ProgramHeaderEntrySize", e->e_phentsize); in printFileHeaders()
3200 W.printNumber("ProgramHeaderCount", e->e_phnum); in printFileHeaders()
3201 W.printNumber("SectionHeaderEntrySize", e->e_shentsize); in printFileHeaders()
3202 W.printNumber("SectionHeaderCount", e->e_shnum); in printFileHeaders()
3203 W.printNumber("StringTableSectionIndex", e->e_shstrndx); in printFileHeaders()
3212 for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { in printGroupSections()
3215 const Elf_Shdr *Symtab = unwrapOrError(Obj->getSection(Sec.sh_link)); in printGroupSections()
3216 StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*Symtab)); in printGroupSections()
3217 const Elf_Sym *Sym = Obj->template getEntry<Elf_Sym>(Symtab, Sec.sh_info); in printGroupSections()
3219 Obj->template getSectionContentsAsArray<Elf_Word>(&Sec)); in printGroupSections()
3221 StringRef Name = unwrapOrError(Obj->getSectionName(&Sec)); in printGroupSections()
3225 W.startLine() << "Signature: " << StrTable.data() + Sym->st_name << "\n"; in printGroupSections()
3230 auto Sec = unwrapOrError(Obj->getSection(Data[Member])); in printGroupSections()
3231 const StringRef Name = unwrapOrError(Obj->getSectionName(Sec)); in printGroupSections()
3245 int SectionNumber = -1; in printRelocations()
3246 for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { in printRelocations()
3252 StringRef Name = unwrapOrError(Obj->getSectionName(&Sec)); in printRelocations()
3266 const Elf_Shdr *SymTab = unwrapOrError(Obj->getSection(Sec->sh_link)); in printRelocations()
3268 switch (Sec->sh_type) { in printRelocations()
3270 for (const Elf_Rel &R : Obj->rels(Sec)) { in printRelocations()
3279 for (const Elf_Rela &R : Obj->relas(Sec)) in printRelocations()
3289 Obj->getRelocationTypeName(Rel.getType(Obj->isMips64EL()), RelocName); in printRelocation()
3291 const Elf_Sym *Sym = Obj->getRelocationSymbol(&Rel, SymTab); in printRelocation()
3292 if (Sym && Sym->getType() == ELF::STT_SECTION) { in printRelocation()
3294 Obj->getSection(Sym, SymTab, this->dumper()->getShndxTable())); in printRelocation()
3295 TargetName = unwrapOrError(Obj->getSectionName(Sec)); in printRelocation()
3297 StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*SymTab)); in printRelocation()
3298 TargetName = unwrapOrError(Sym->getName(StrTable)); in printRelocation()
3304 W.printNumber("Type", RelocName, (int)Rel.getType(Obj->isMips64EL())); in printRelocation()
3305 W.printNumber("Symbol", TargetName.size() > 0 ? TargetName : "-", in printRelocation()
3306 Rel.getSymbol(Obj->isMips64EL())); in printRelocation()
3311 << (TargetName.size() > 0 ? TargetName : "-") << " " in printRelocation()
3319 int SectionIndex = -1; in printSections()
3320 for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { in printSections()
3323 StringRef Name = unwrapOrError(Obj->getSectionName(&Sec)); in printSections()
3329 getElfSectionType(Obj->getHeader()->e_machine, Sec.sh_type), in printSections()
3333 switch (Obj->getHeader()->e_machine) { in printSections()
3375 const Elf_Shdr *Symtab = this->dumper()->getDotSymtabSec(); in printSections()
3376 StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*Symtab)); in printSections()
3378 for (const Elf_Sym &Sym : Obj->symbols(Symtab)) { in printSections()
3380 Obj->getSection(&Sym, Symtab, this->dumper()->getShndxTable())); in printSections()
3382 printSymbol(Obj, &Sym, Obj->symbol_begin(Symtab), StrTable, false); in printSections()
3387 ArrayRef<uint8_t> Data = unwrapOrError(Obj->getSectionContents(&Sec)); in printSections()
3400 getSectionNameIndex(*Obj, Symbol, First, this->dumper()->getShndxTable(), in printSymbol()
3403 this->dumper()->getFullSymbolName(Symbol, StrTable, IsDynamic); in printSymbol()
3404 unsigned char SymbolType = Symbol->getType(); in printSymbol()
3407 W.printNumber("Name", FullSymbolName, Symbol->st_name); in printSymbol()
3408 W.printHex("Value", Symbol->st_value); in printSymbol()
3409 W.printNumber("Size", Symbol->st_size); in printSymbol()
3410 W.printEnum("Binding", Symbol->getBinding(), makeArrayRef(ElfSymbolBindings)); in printSymbol()
3411 if (Obj->getHeader()->e_machine == ELF::EM_AMDGPU && in printSymbol()
3416 if (Symbol->st_other == 0) in printSymbol()
3423 if (Obj->getHeader()->e_machine == EM_MIPS) { in printSymbol()
3427 if ((Symbol->st_other & STO_MIPS_MIPS16) == STO_MIPS_MIPS16) in printSymbol()
3436 W.printFlags("Other", Symbol->st_other, makeArrayRef(SymOtherFlags), 0x3u); in printSymbol()
3443 this->dumper()->printSymbolsHelper(false); in printSymbols()
3449 this->dumper()->printSymbolsHelper(true); in printDynamicSymbols()
3454 const DynRegionInfo &DynRelRegion = this->dumper()->getDynRelRegion(); in printDynamicRelocations()
3455 const DynRegionInfo &DynRelaRegion = this->dumper()->getDynRelaRegion(); in printDynamicRelocations()
3456 const DynRegionInfo &DynPLTRelRegion = this->dumper()->getDynPLTRelRegion(); in printDynamicRelocations()
3462 for (const Elf_Rela &Rela : this->dumper()->dyn_relas()) in printDynamicRelocations()
3465 for (const Elf_Rel &Rel : this->dumper()->dyn_rels()) { in printDynamicRelocations()
3490 Obj->getRelocationTypeName(Rel.getType(Obj->isMips64EL()), RelocName); in printDynamicRelocation()
3492 uint32_t SymIndex = Rel.getSymbol(Obj->isMips64EL()); in printDynamicRelocation()
3493 const Elf_Sym *Sym = this->dumper()->dynamic_symbols().begin() + SymIndex; in printDynamicRelocation()
3495 unwrapOrError(Sym->getName(this->dumper()->getDynamicStringTable())); in printDynamicRelocation()
3499 W.printNumber("Type", RelocName, (int)Rel.getType(Obj->isMips64EL())); in printDynamicRelocation()
3500 W.printString("Symbol", SymbolName.size() > 0 ? SymbolName : "-"); in printDynamicRelocation()
3505 << (SymbolName.size() > 0 ? SymbolName : "-") << " " in printDynamicRelocation()
3514 for (const Elf_Phdr &Phdr : Obj->program_headers()) { in printProgramHeaders()
3517 getElfSegmentType(Obj->getHeader()->e_machine, Phdr.p_type), in printProgramHeaders()