X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=tools%2Fllvm-readobj%2FELFDumper.cpp;fp=tools%2Fllvm-readobj%2FELFDumper.cpp;h=2f07f47919e72eee91158ab816b5c6cf06a788da;hp=b39d56667c134ad818ffa671f8cc21cd994acc9d;hb=4598154b646272c19ffe8f42beac08c41bd12fc4;hpb=6cb6b24b788cd250923fd569e38c73248adb8830 diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp index b39d56667c1..2f07f47919e 100644 --- a/tools/llvm-readobj/ELFDumper.cpp +++ b/tools/llvm-readobj/ELFDumper.cpp @@ -56,6 +56,7 @@ public: void printNeededLibraries() override; void printProgramHeaders() override; void printHashTable() override; + void printGnuHashTable() override; void printLoadName() override; void printAttributes() override; @@ -76,6 +77,7 @@ private: typedef typename ELFO::Elf_Rela_Range Elf_Rela_Range; typedef typename ELFO::Elf_Phdr Elf_Phdr; typedef typename ELFO::Elf_Hash Elf_Hash; + typedef typename ELFO::Elf_GnuHash Elf_GnuHash; typedef typename ELFO::Elf_Ehdr Elf_Ehdr; typedef typename ELFO::Elf_Word Elf_Word; typedef typename ELFO::uintX_t uintX_t; @@ -136,6 +138,7 @@ private: const Elf_Sym *DynSymStart = nullptr; StringRef SOName; const Elf_Hash *HashTable = nullptr; + const Elf_GnuHash *GnuHashTable = nullptr; const Elf_Shdr *DotDynSymSec = nullptr; const Elf_Shdr *DotSymtabSec = nullptr; ArrayRef ShndxTable; @@ -850,6 +853,10 @@ ELFDumper::ELFDumper(const ELFFile *Obj, StreamWriter &Writer) HashTable = reinterpret_cast(toMappedAddr(Dyn.getPtr())); break; + case ELF::DT_GNU_HASH: + GnuHashTable = + reinterpret_cast(toMappedAddr(Dyn.getPtr())); + break; case ELF::DT_RELA: DynRelaRegion.Addr = toMappedAddr(Dyn.getPtr()); break; @@ -1533,6 +1540,23 @@ void ELFDumper::printHashTable() { W.printList("Chains", HashTable->chains()); } +template +void ELFDumper::printGnuHashTable() { + DictScope D(W, "GnuHashTable"); + if (!GnuHashTable) + return; + W.printNumber("Num Buckets", GnuHashTable->nbuckets); + W.printNumber("First Hashed Symbol Index", GnuHashTable->symndx); + W.printNumber("Num Mask Words", GnuHashTable->maskwords); + W.printNumber("Shift Count", GnuHashTable->shift2); + W.printHexList("Bloom Filter", GnuHashTable->filter()); + W.printList("Buckets", GnuHashTable->buckets()); + if (!DotDynSymSec) + reportError("No dynamic symbol section"); + W.printHexList("Values", + GnuHashTable->values(DotDynSymSec->getEntityCount())); +} + template void ELFDumper::printLoadName() { outs() << "LoadName: " << SOName << '\n'; }