diff options
author | Igor Kudrin <ikudrin.dev@gmail.com> | 2015-10-14 12:11:50 +0000 |
---|---|---|
committer | Igor Kudrin <ikudrin.dev@gmail.com> | 2015-10-14 12:11:50 +0000 |
commit | 496fb2f040dca8432941d6fd2f63505bcecc54b4 (patch) | |
tree | 82702003bcb6e585938a2b48078fad7153dce2e0 /llvm/tools/llvm-readobj/ELFDumper.cpp | |
parent | dee8834570f0eb5b76e85a243cc6fb0b1e8cf4c7 (diff) | |
download | bcm5719-llvm-496fb2f040dca8432941d6fd2f63505bcecc54b4.tar.gz bcm5719-llvm-496fb2f040dca8432941d6fd2f63505bcecc54b4.zip |
[llvm-readobj/ELF] Print GNU Hash section
Add a new command line switch, -gnu-hash-table, to print the content of that section.
Differential Revision: http://reviews.llvm.org/D13696
llvm-svn: 250291
Diffstat (limited to 'llvm/tools/llvm-readobj/ELFDumper.cpp')
-rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index b39d56667c1..2f07f47919e 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/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<Elf_Word> ShndxTable; @@ -850,6 +853,10 @@ ELFDumper<ELFT>::ELFDumper(const ELFFile<ELFT> *Obj, StreamWriter &Writer) HashTable = reinterpret_cast<const Elf_Hash *>(toMappedAddr(Dyn.getPtr())); break; + case ELF::DT_GNU_HASH: + GnuHashTable = + reinterpret_cast<const Elf_GnuHash *>(toMappedAddr(Dyn.getPtr())); + break; case ELF::DT_RELA: DynRelaRegion.Addr = toMappedAddr(Dyn.getPtr()); break; @@ -1533,6 +1540,23 @@ void ELFDumper<ELFT>::printHashTable() { W.printList("Chains", HashTable->chains()); } +template <typename ELFT> +void ELFDumper<ELFT>::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 <typename ELFT> void ELFDumper<ELFT>::printLoadName() { outs() << "LoadName: " << SOName << '\n'; } |