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=05fef7262ff34e9b3b7017bed671cb859ff2a595;hp=50473d7bb04280b490693193dff10ef29878f61d;hb=310e6c3606ecb8847600b5ed0be455ac31d76731;hpb=9f316a2e0c1c60eb656bfbf387e6545e01d065ff diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp index 50473d7bb04..05fef7262ff 100644 --- a/tools/llvm-readobj/ELFDumper.cpp +++ b/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 T errorOrDefault(ErrorOr Val, T Default = T()) { @@ -884,6 +886,11 @@ ELFDumper::ELFDumper(const ELFFile *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 void ELFDumper::printDynamicSymbols() { ListScope Group(W, "DynamicSymbols"); - const Elf_Shdr *Symtab = Obj->getDotDynSymSec(); + const Elf_Shdr *Symtab = DotDynSymSec; ErrorOr StrTableOrErr = Obj->getStringTableForSymtab(*Symtab); error(StrTableOrErr.getError()); StringRef StrTable = *StrTableOrErr; @@ -1643,7 +1650,7 @@ template void MipsGOTParser::parseGOT() { return; } - const Elf_Shdr *DynSymSec = Obj->getDotDynSymSec(); + const Elf_Shdr *DynSymSec = Dumper->getDotDynSymSec(); ErrorOr StrTable = Obj->getStringTableForSymtab(*DynSymSec); error(StrTable.getError()); const Elf_Sym *DynSymBegin = Obj->symbol_begin(DynSymSec);