@@ -206,7 +206,8 @@ template <typename ELFT> class ELFDumper : public ObjDumper {
206
206
void loadDynamicTable (const ELFFile<ELFT> *Obj);
207
207
void parseDynamicTable ();
208
208
209
- StringRef getDynamicString (uint64_t Offset) const ;
209
+ void printDynamicString (uint64_t Offset, raw_ostream &OS,
210
+ bool WithBracket = true ) const ;
210
211
StringRef getSymbolVersion (StringRef StrTab, const Elf_Sym *symb,
211
212
bool &IsDefault) const ;
212
213
void LoadVersionMap () const ;
@@ -221,7 +222,7 @@ template <typename ELFT> class ELFDumper : public ObjDumper {
221
222
DynRegionInfo DynSymRegion;
222
223
DynRegionInfo DynamicTable;
223
224
StringRef DynamicStringTable;
224
- StringRef SOName;
225
+ StringRef SOName = " <Not found> " ;
225
226
const Elf_Hash *HashTable = nullptr ;
226
227
const Elf_GnuHash *GnuHashTable = nullptr ;
227
228
const Elf_Shdr *DotSymtabSec = nullptr ;
@@ -1626,8 +1627,8 @@ template <typename ELFT> void ELFDumper<ELFT>::parseDynamicTable() {
1626
1627
}
1627
1628
if (StringTableBegin)
1628
1629
DynamicStringTable = StringRef (StringTableBegin, StringTableSize);
1629
- if (SONameOffset)
1630
- SOName = getDynamicString (SONameOffset) ;
1630
+ if (SONameOffset && SONameOffset < DynamicStringTable. size () )
1631
+ SOName = DynamicStringTable. data () + SONameOffset ;
1631
1632
}
1632
1633
1633
1634
template <typename ELFT>
@@ -1790,14 +1791,19 @@ void printFlags(T Value, ArrayRef<EnumEntry<TFlag>> Flags, raw_ostream &OS) {
1790
1791
}
1791
1792
1792
1793
template <class ELFT >
1793
- StringRef ELFDumper<ELFT>::getDynamicString(uint64_t Value) const {
1794
- if (Value >= DynamicStringTable.size ())
1795
- reportError (" Invalid dynamic string table reference" );
1796
- return StringRef (DynamicStringTable.data () + Value);
1797
- }
1798
-
1799
- static void printLibrary (raw_ostream &OS, const Twine &Tag, const Twine &Name) {
1800
- OS << Tag << " : [" << Name << " ]" ;
1794
+ void ELFDumper<ELFT>::printDynamicString(uint64_t Value,
1795
+ raw_ostream &OS,
1796
+ bool WithBracket) const {
1797
+ if (DynamicStringTable.empty ())
1798
+ OS << " <String table is empty or was not found> " ;
1799
+ else if (Value < DynamicStringTable.size ()) {
1800
+ if (WithBracket)
1801
+ OS << " [" ;
1802
+ OS << StringRef (DynamicStringTable.data () + Value);
1803
+ if (WithBracket)
1804
+ OS << " ]" ;
1805
+ } else
1806
+ OS << " <Invalid offset 0x" << utohexstr (Value) << " >" ;
1801
1807
}
1802
1808
1803
1809
template <class ELFT >
@@ -1943,23 +1949,24 @@ void ELFDumper<ELFT>::printDynamicEntry(raw_ostream &OS, uint64_t Type,
1943
1949
OS << Value << " (bytes)" ;
1944
1950
break ;
1945
1951
case DT_NEEDED:
1946
- printLibrary (OS, " Shared library" , getDynamicString (Value));
1947
- break ;
1948
1952
case DT_SONAME:
1949
- printLibrary (OS, " Library soname" , getDynamicString (Value));
1950
- break ;
1951
1953
case DT_AUXILIARY:
1952
- printLibrary (OS, " Auxiliary library" , getDynamicString (Value));
1953
- break ;
1954
1954
case DT_USED:
1955
- printLibrary (OS, " Not needed object" , getDynamicString (Value));
1956
- break ;
1957
- case DT_FILTER:
1958
- printLibrary (OS, " Filter library" , getDynamicString (Value));
1955
+ case DT_FILTER: {
1956
+ const std::map<uint64_t , const char *> TagNames = {
1957
+ {DT_NEEDED, " Shared library" },
1958
+ {DT_SONAME, " Library soname" },
1959
+ {DT_AUXILIARY, " Auxiliary library" },
1960
+ {DT_USED, " Not needed object" },
1961
+ {DT_FILTER, " Filter library" },
1962
+ };
1963
+ OS << TagNames.at (Type) << " : " ;
1964
+ printDynamicString (Value, OS);
1959
1965
break ;
1966
+ }
1960
1967
case DT_RPATH:
1961
1968
case DT_RUNPATH:
1962
- OS << getDynamicString (Value);
1969
+ printDynamicString (Value, OS, false );
1963
1970
break ;
1964
1971
case DT_FLAGS:
1965
1972
printFlags (Value, makeArrayRef (ElfDynamicDTFlags), OS);
@@ -2004,8 +2011,13 @@ template <class ELFT> void ELFDumper<ELFT>::printNeededLibraries() {
2004
2011
LibsTy Libs;
2005
2012
2006
2013
for (const auto &Entry : dynamic_table ())
2007
- if (Entry.d_tag == ELF::DT_NEEDED)
2008
- Libs.push_back (getDynamicString (Entry.d_un .d_val ));
2014
+ if (Entry.d_tag == ELF::DT_NEEDED) {
2015
+ uint64_t Value = Entry.d_un .d_val ;
2016
+ if (Value < DynamicStringTable.size ())
2017
+ Libs.push_back (StringRef (DynamicStringTable.data () + Value));
2018
+ else
2019
+ Libs.push_back (" <Library name index out of range>" );
2020
+ }
2009
2021
2010
2022
llvm::stable_sort (Libs);
2011
2023
0 commit comments