diff options
author | Xing GUO <higuoxing@gmail.com> | 2018-12-08 05:32:28 +0000 |
---|---|---|
committer | Xing GUO <higuoxing@gmail.com> | 2018-12-08 05:32:28 +0000 |
commit | fe5a6c315be58370b06cd41a1067255d7bbacc52 (patch) | |
tree | 1d740a0808b95e966b5e75ee59b92790445b9ff5 /llvm/tools/llvm-readobj/ELFDumper.cpp | |
parent | e388680dfa178e5f433f766b51fea2471c40d7be (diff) | |
download | bcm5719-llvm-fe5a6c315be58370b06cd41a1067255d7bbacc52.tar.gz bcm5719-llvm-fe5a6c315be58370b06cd41a1067255d7bbacc52.zip |
[llvm-readobj] Little clean up inside `parseDynamicTable`
Summary:
This anoymous function actually has same logic with `Obj->toMappedAddr`.
Besides, I have a question on resolving illegal value. `gnu-readelf`, `gnu-objdump` and `llvm-objdump` could parse the test file 'test/tools/llvm-objdump/Inputs/private-headers-x86_64.elf', but `llvm-readobj` will fail when parse `DT_RELR` segment. Because, the value is 0x87654321 which is illegal. So, shall we do this clean up rather then remove the checking statements inside anoymous function?
```
if (Delta >= Phdr.p_filesz)
return createError("Virtual address is not in any segment");
```
Reviewers: rupprecht, jhenderson
Reviewed By: jhenderson
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D55329
llvm-svn: 348701
Diffstat (limited to 'llvm/tools/llvm-readobj/ELFDumper.cpp')
-rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 17 |
1 files changed, 4 insertions, 13 deletions
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 557acd31805..83fb4864cb3 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -1484,19 +1484,10 @@ template <typename ELFT> void ELFDumper<ELFT>::parseDynamicTable( ArrayRef<const Elf_Phdr *> LoadSegments) { auto toMappedAddr = [&](uint64_t VAddr) -> const uint8_t * { - const Elf_Phdr *const *I = - std::upper_bound(LoadSegments.begin(), LoadSegments.end(), VAddr, - [](uint64_t VAddr, const Elf_Phdr_Impl<ELFT> *Phdr) { - return VAddr < Phdr->p_vaddr; - }); - if (I == LoadSegments.begin()) - report_fatal_error("Virtual address is not in any segment"); - --I; - const Elf_Phdr &Phdr = **I; - uint64_t Delta = VAddr - Phdr.p_vaddr; - if (Delta >= Phdr.p_filesz) - report_fatal_error("Virtual address is not in any segment"); - return Obj->base() + Phdr.p_offset + Delta; + auto MappedAddrOrError = Obj->toMappedAddr(VAddr); + if (!MappedAddrOrError) + report_fatal_error(MappedAddrOrError.takeError()); + return MappedAddrOrError.get(); }; uint64_t SONameOffset = 0; |