};
DynRegionInfo DynamicRegion;
- DynRegionInfo DynHashRegion;
DynRegionInfo DynStrRegion;
DynRegionInfo DynRelaRegion;
- // Pointer to SONAME entry in dynamic string table
- // This is set the first time getLoadName is called.
- mutable const char *dt_soname = nullptr;
+ // SONAME entry in dynamic string table
+ StringRef DTSoname;
// Records for each version index the corresponding Verdef or Vernaux entry.
// This is filled the first time LoadVersionMap() is called.
}
const Elf_Dyn *dynamic_table_begin() const;
- /// \param NULLEnd use one past the first DT_NULL entry as the end instead of
- /// the section size.
- const Elf_Dyn *dynamic_table_end(bool NULLEnd = false) const;
- Elf_Dyn_Range dynamic_table(bool NULLEnd = false) const {
- return make_range(dynamic_table_begin(), dynamic_table_end(NULLEnd));
+ const Elf_Dyn *dynamic_table_end() const;
+ Elf_Dyn_Range dynamic_table() const {
+ return make_range(dynamic_table_begin(), dynamic_table_end());
}
const Elf_Sym *dynamic_symbol_begin() const {
return this->base() + Phdr.p_offset + Delta;
};
+ uint64_t SONameOffset = 0;
for (const Elf_Dyn &Dyn : dynamic_table()) {
switch (Dyn.d_tag) {
case ELF::DT_HASH:
break;
case ELF::DT_RELAENT:
DynRelaRegion.EntSize = Dyn.getVal();
+ break;
+ case ELF::DT_SONAME:
+ SONameOffset = Dyn.getVal();
+ break;
}
}
+ if (SONameOffset)
+ DTSoname = getDynamicString(SONameOffset);
}
template <class ELFT>
template <class ELFT>
const typename ELFFile<ELFT>::Elf_Dyn *
-ELFFile<ELFT>::dynamic_table_end(bool NULLEnd) const {
+ELFFile<ELFT>::dynamic_table_end() const {
uint64_t Size = DynamicRegion.Size;
if (Size % sizeof(Elf_Dyn))
report_fatal_error("Invalid dynamic table size");
- const Elf_Dyn *Ret = dynamic_table_begin() + Size / sizeof(Elf_Dyn);
-
- if (NULLEnd) {
- const Elf_Dyn *Start = dynamic_table_begin();
- while (Start != Ret && Start->getTag() != ELF::DT_NULL)
- ++Start;
-
- // Include the DT_NULL.
- if (Start != Ret)
- ++Start;
- Ret = Start;
- }
- return Ret;
+ return dynamic_table_begin() + Size / sizeof(Elf_Dyn);
}
template <class ELFT>
StringRef ELFFile<ELFT>::getLoadName() const {
- if (!dt_soname) {
- dt_soname = "";
- // Find the DT_SONAME entry
- for (const auto &Entry : dynamic_table())
- if (Entry.getTag() == ELF::DT_SONAME) {
- dt_soname = getDynamicString(Entry.getVal());
- break;
- }
- }
- return dt_soname;
+ return DTSoname;
}
template <class ELFT>