diff options
Diffstat (limited to 'llvm/tools/llvm-readobj')
| -rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 37 |
1 files changed, 15 insertions, 22 deletions
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 916cb2acfb9..5887d2944d1 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -104,10 +104,20 @@ private: const Elf_Rela *dyn_rela_end() const; Elf_Rela_Range dyn_relas() const; StringRef getDynamicString(uint64_t Offset) const; - const Elf_Dyn *dynamic_table_begin() const; - const Elf_Dyn *dynamic_table_end() const; + const Elf_Dyn *dynamic_table_begin() const { + ErrorOr<const Elf_Dyn *> Ret = Obj->dynamic_table_begin(DynamicProgHeader); + error(Ret.getError()); + return *Ret; + } + const Elf_Dyn *dynamic_table_end() const { + ErrorOr<const Elf_Dyn *> Ret = Obj->dynamic_table_end(DynamicProgHeader); + error(Ret.getError()); + return *Ret; + } Elf_Dyn_Range dynamic_table() const { - return make_range(dynamic_table_begin(), dynamic_table_end()); + ErrorOr<Elf_Dyn_Range> Ret = Obj->dynamic_table(DynamicProgHeader); + error(Ret.getError()); + return *Ret; } StringRef getSymbolVersion(StringRef StrTab, const Elf_Sym *symb, @@ -118,7 +128,7 @@ private: const ELFO *Obj; DynRegionInfo DynRelaRegion; - DynRegionInfo DynamicRegion; + const Elf_Phdr *DynamicProgHeader = nullptr; StringRef DynamicStringTable; const Elf_Sym *DynSymStart = nullptr; StringRef SOName; @@ -798,11 +808,7 @@ ELFDumper<ELFT>::ELFDumper(const ELFFile<ELFT> *Obj, StreamWriter &Writer) SmallVector<const Elf_Phdr *, 4> LoadSegments; for (const Elf_Phdr &Phdr : Obj->program_headers()) { if (Phdr.p_type == ELF::PT_DYNAMIC) { - DynamicRegion.Addr = Obj->base() + Phdr.p_offset; - uint64_t Size = Phdr.p_filesz; - if (Size % sizeof(Elf_Dyn)) - report_fatal_error("Invalid dynamic table size"); - DynamicRegion.Size = Phdr.p_filesz; + DynamicProgHeader = &Phdr; continue; } if (Phdr.p_type != ELF::PT_LOAD || Phdr.p_filesz == 0) @@ -904,19 +910,6 @@ typename ELFDumper<ELFT>::Elf_Rela_Range ELFDumper<ELFT>::dyn_relas() const { return make_range(dyn_rela_begin(), dyn_rela_end()); } -template <typename ELFT> -const typename ELFDumper<ELFT>::Elf_Dyn * -ELFDumper<ELFT>::dynamic_table_begin() const { - return reinterpret_cast<const Elf_Dyn *>(DynamicRegion.Addr); -} - -template <typename ELFT> -const typename ELFDumper<ELFT>::Elf_Dyn * -ELFDumper<ELFT>::dynamic_table_end() const { - uint64_t Size = DynamicRegion.Size; - return dynamic_table_begin() + Size / sizeof(Elf_Dyn); -} - template<class ELFT> void ELFDumper<ELFT>::printFileHeaders() { const Elf_Ehdr *Header = Obj->getHeader(); |

