From: Yuanfang Chen Date: Thu, 18 Jul 2019 17:04:28 +0000 (+0000) Subject: [NFC][llvm-readobj] Refactor dynamic string table indexing into a function. X-Git-Tag: llvmorg-11-init~14083 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=abbc3ff4ad9e744b89f1bd8755f4f56ee4539393;p=platform%2Fupstream%2Fllvm.git [NFC][llvm-readobj] Refactor dynamic string table indexing into a function. Restore printDynamicString removed in rL363868. It provides better error handling whenever indexing dynamic string table is needed. Reviewers: jhenderson, MaskRay, grimar Reviewed by: jhenderson, MaskRay, grimar Differential Revision: https://reviews.llvm.org/D64674 llvm-svn: 366464 --- diff --git a/llvm/test/tools/llvm-readobj/elf-dynamic-malformed.test b/llvm/test/tools/llvm-readobj/elf-dynamic-malformed.test index e78e1af..328638b 100644 --- a/llvm/test/tools/llvm-readobj/elf-dynamic-malformed.test +++ b/llvm/test/tools/llvm-readobj/elf-dynamic-malformed.test @@ -98,22 +98,22 @@ ProgramHeaders: # RUN: llvm-readelf --dynamic-table %t.bad-string | FileCheck %s --check-prefix BAD-STRING-GNU # BAD-STRING-LLVM: 0x000000000000000A STRSZ 1 (bytes) -# BAD-STRING-LLVM: 0x0000000000000001 NEEDED Shared library: -# BAD-STRING-LLVM: 0x000000007FFFFFFF FILTER Filter library: -# BAD-STRING-LLVM: 0x000000007FFFFFFD AUXILIARY Auxiliary library: -# BAD-STRING-LLVM: 0x000000007FFFFFFE USED Not needed object: -# BAD-STRING-LLVM: 0x000000000000000E SONAME Library soname: -# BAD-STRING-LLVM: 0x000000000000000F RPATH Library rpath: -# BAD-STRING-LLVM: 0x000000000000001D RUNPATH Library runpath: +# BAD-STRING-LLVM: 0x0000000000000001 NEEDED Shared library: [] +# BAD-STRING-LLVM: 0x000000007FFFFFFF FILTER Filter library: [] +# BAD-STRING-LLVM: 0x000000007FFFFFFD AUXILIARY Auxiliary library: [] +# BAD-STRING-LLVM: 0x000000007FFFFFFE USED Not needed object: [] +# BAD-STRING-LLVM: 0x000000000000000E SONAME Library soname: [] +# BAD-STRING-LLVM: 0x000000000000000F RPATH Library rpath: [] +# BAD-STRING-LLVM: 0x000000000000001D RUNPATH Library runpath: [] # BAD-STRING-GNU: 0x000000000000000a (STRSZ) 1 (bytes) -# BAD-STRING-GNU: 0x0000000000000001 (NEEDED) Shared library: -# BAD-STRING-GNU: 0x000000007fffffff (FILTER) Filter library: -# BAD-STRING-GNU: 0x000000007ffffffd (AUXILIARY) Auxiliary library: -# BAD-STRING-GNU: 0x000000007ffffffe (USED) Not needed object: -# BAD-STRING-GNU: 0x000000000000000e (SONAME) Library soname: -# BAD-STRING-GNU: 0x000000000000000f (RPATH) Library rpath: -# BAD-STRING-GNU: 0x000000000000001d (RUNPATH) Library runpath: +# BAD-STRING-GNU: 0x0000000000000001 (NEEDED) Shared library: [] +# BAD-STRING-GNU: 0x000000007fffffff (FILTER) Filter library: [] +# BAD-STRING-GNU: 0x000000007ffffffd (AUXILIARY) Auxiliary library: [] +# BAD-STRING-GNU: 0x000000007ffffffe (USED) Not needed object: [] +# BAD-STRING-GNU: 0x000000000000000e (SONAME) Library soname: [] +# BAD-STRING-GNU: 0x000000000000000f (RPATH) Library rpath: [] +# BAD-STRING-GNU: 0x000000000000001d (RUNPATH) Library runpath: [] --- !ELF FileHeader: @@ -169,11 +169,11 @@ ProgramHeaders: # RUN: llvm-readobj --dynamic-table --needed-libs %t.bad-strtab | FileCheck %s --check-prefixes=BAD-STRTAB,BAD-STRTAB-LLVM # RUN: llvm-readelf --dynamic-table --needed-libs %t.bad-strtab | FileCheck %s --check-prefixes=BAD-STRTAB,BAD-STRTAB-GNU -# BAD-STRTAB-LLVM: LoadName: -# BAD-STRTAB-LLVM: 0x0000000000000001 NEEDED Shared library: -# BAD-STRTAB-GNU: 0x0000000000000001 (NEEDED) Shared library: +# BAD-STRTAB-LLVM: LoadName: +# BAD-STRTAB-LLVM: 0x0000000000000001 NEEDED Shared library: [] +# BAD-STRTAB-GNU: 0x0000000000000001 (NEEDED) Shared library: [] # BAD-STRTAB: NeededLibraries [ -# BAD-STRTAB: +# BAD-STRTAB: # BAD-STRTAB: ] --- !ELF diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 4e1cb7d..4822ed1 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -226,7 +226,7 @@ private: DynRegionInfo DynSymRegion; DynRegionInfo DynamicTable; StringRef DynamicStringTable; - StringRef SOName = ""; + std::string SOName = ""; const Elf_Hash *HashTable = nullptr; const Elf_GnuHash *GnuHashTable = nullptr; const Elf_Shdr *DotSymtabSec = nullptr; @@ -292,6 +292,7 @@ public: StringRef &SectionName, unsigned &SectionIndex) const; std::string getStaticSymbolName(uint32_t Index) const; + std::string getDynamicString(uint64_t Value) const; StringRef getSymbolVersionByIndex(StringRef StrTab, uint32_t VersionSymbolIndex, bool &IsDefault) const; @@ -1632,8 +1633,7 @@ template void ELFDumper::parseDynamicTable() { } if (StringTableBegin) DynamicStringTable = StringRef(StringTableBegin, StringTableSize); - if (SONameOffset && SONameOffset < DynamicStringTable.size()) - SOName = DynamicStringTable.data() + SONameOffset; + SOName = getDynamicString(SONameOffset); } template @@ -1953,13 +1953,7 @@ void ELFDumper::printDynamicEntry(raw_ostream &OS, uint64_t Type, {DT_RPATH, "Library rpath"}, {DT_RUNPATH, "Library runpath"}, }; - OS << TagNames.at(Type) << ": "; - if (DynamicStringTable.empty()) - OS << " "; - else if (Value < DynamicStringTable.size()) - OS << "[" << StringRef(DynamicStringTable.data() + Value) << "]"; - else - OS << ""; + OS << TagNames.at(Type) << ": [" << getDynamicString(Value) << "]"; break; } case DT_FLAGS: @@ -1974,6 +1968,15 @@ void ELFDumper::printDynamicEntry(raw_ostream &OS, uint64_t Type, } } +template +std::string ELFDumper::getDynamicString(uint64_t Value) const { + if (DynamicStringTable.empty()) + return ""; + if (Value < DynamicStringTable.size()) + return DynamicStringTable.data() + Value; + return Twine("").str(); +} + template void ELFDumper::printUnwindInfo() { DwarfCFIEH::PrinterContext Ctx(W, ObjF); Ctx.printUnwindInformation(); @@ -2001,17 +2004,10 @@ template void ELFDumper::printDynamicTable() { template void ELFDumper::printNeededLibraries() { ListScope D(W, "NeededLibraries"); - using LibsTy = std::vector; - LibsTy Libs; - + std::vector Libs; for (const auto &Entry : dynamic_table()) - if (Entry.d_tag == ELF::DT_NEEDED) { - uint64_t Value = Entry.d_un.d_val; - if (Value < DynamicStringTable.size()) - Libs.push_back(StringRef(DynamicStringTable.data() + Value)); - else - Libs.push_back(""); - } + if (Entry.d_tag == ELF::DT_NEEDED) + Libs.push_back(getDynamicString(Entry.d_un.d_val)); llvm::stable_sort(Libs);