diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-08-07 20:11:08 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-08-07 20:11:08 +0000 |
commit | ee0b2b5c2b9a7e8af3e278b5f9f4aaf10827754f (patch) | |
tree | e70d8d590d5a1a47b38addf1bf2a8bfcd09e0a58 /llvm/tools/llvm-readobj | |
parent | a3db7d26ab4d440a18189b7c6787cd37abd28933 (diff) | |
download | bcm5719-llvm-ee0b2b5c2b9a7e8af3e278b5f9f4aaf10827754f.tar.gz bcm5719-llvm-ee0b2b5c2b9a7e8af3e278b5f9f4aaf10827754f.zip |
Don't look for a SHT_DYNSYM in the ELFFile's constructor.
Yet another step in not having it scan every section.
llvm-svn: 244353
Diffstat (limited to 'llvm/tools/llvm-readobj')
-rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 50473d7bb04..05fef7262ff 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -133,6 +133,7 @@ private: const Elf_Sym *DynSymStart = nullptr; StringRef SOName; const Elf_Hash *HashTable = nullptr; + const Elf_Shdr *DotDynSymSec = nullptr; const Elf_Shdr *dot_gnu_version_sec = nullptr; // .gnu.version const Elf_Shdr *dot_gnu_version_r_sec = nullptr; // .gnu.version_r @@ -164,6 +165,7 @@ private: public: std::string getFullSymbolName(const Elf_Sym *Symbol, StringRef StrTable, bool IsDynamic); + const Elf_Shdr *getDotDynSymSec() const { return DotDynSymSec; } }; template <class T> T errorOrDefault(ErrorOr<T> Val, T Default = T()) { @@ -884,6 +886,11 @@ ELFDumper<ELFT>::ELFDumper(const ELFFile<ELFT> *Obj, StreamWriter &Writer) reportError("Multilpe SHT_GNU_verneed"); dot_gnu_version_r_sec = &Sec; break; + case ELF::SHT_DYNSYM: + if (DotDynSymSec != nullptr) + reportError("Multilpe SHT_DYNSYM"); + DotDynSymSec = &Sec; + break; } } } @@ -1134,7 +1141,7 @@ template<class ELFT> void ELFDumper<ELFT>::printDynamicSymbols() { ListScope Group(W, "DynamicSymbols"); - const Elf_Shdr *Symtab = Obj->getDotDynSymSec(); + const Elf_Shdr *Symtab = DotDynSymSec; ErrorOr<StringRef> StrTableOrErr = Obj->getStringTableForSymtab(*Symtab); error(StrTableOrErr.getError()); StringRef StrTable = *StrTableOrErr; @@ -1643,7 +1650,7 @@ template <class ELFT> void MipsGOTParser<ELFT>::parseGOT() { return; } - const Elf_Shdr *DynSymSec = Obj->getDotDynSymSec(); + const Elf_Shdr *DynSymSec = Dumper->getDotDynSymSec(); ErrorOr<StringRef> StrTable = Obj->getStringTableForSymtab(*DynSymSec); error(StrTable.getError()); const Elf_Sym *DynSymBegin = Obj->symbol_begin(DynSymSec); |