summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-readobj
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-08-07 20:11:08 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-08-07 20:11:08 +0000
commitee0b2b5c2b9a7e8af3e278b5f9f4aaf10827754f (patch)
treee70d8d590d5a1a47b38addf1bf2a8bfcd09e0a58 /llvm/tools/llvm-readobj
parenta3db7d26ab4d440a18189b7c6787cd37abd28933 (diff)
downloadbcm5719-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.cpp11
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);
OpenPOWER on IntegriCloud