diff options
author | Michael J. Spencer <bigcheesegs@gmail.com> | 2016-02-11 04:59:26 +0000 |
---|---|---|
committer | Michael J. Spencer <bigcheesegs@gmail.com> | 2016-02-11 04:59:26 +0000 |
commit | 37304f18a3bc9393a456472bf3bf9d843723776f (patch) | |
tree | eb2a1e8bcfe7a60172c8d2b8031acb7f4ecf8687 /llvm/tools/llvm-readobj | |
parent | f84cda756469beac61e7fedfe396f7b708216c0b (diff) | |
download | bcm5719-llvm-37304f18a3bc9393a456472bf3bf9d843723776f.tar.gz bcm5719-llvm-37304f18a3bc9393a456472bf3bf9d843723776f.zip |
[readobj] Parse sections before dynamic table.
NFC. This code will be expanded to handle dynamic tables that don't have a
PT_DYNAMIC.
llvm-svn: 260485
Diffstat (limited to 'llvm/tools/llvm-readobj')
-rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 72 |
1 files changed, 36 insertions, 36 deletions
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 75a0da70802..e5be8aad47e 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -996,6 +996,42 @@ ELFDumper<ELFT>::ELFDumper(const ELFFile<ELFT> *Obj, StreamWriter &Writer) LoadSegments.push_back(&Phdr); } + for (const Elf_Shdr &Sec : Obj->sections()) { + switch (Sec.sh_type) { + case ELF::SHT_GNU_versym: + if (dot_gnu_version_sec != nullptr) + reportError("Multiple SHT_GNU_versym"); + dot_gnu_version_sec = &Sec; + break; + case ELF::SHT_GNU_verdef: + if (dot_gnu_version_d_sec != nullptr) + reportError("Multiple SHT_GNU_verdef"); + dot_gnu_version_d_sec = &Sec; + break; + case ELF::SHT_GNU_verneed: + if (dot_gnu_version_r_sec != nullptr) + reportError("Multilpe SHT_GNU_verneed"); + dot_gnu_version_r_sec = &Sec; + break; + case ELF::SHT_DYNSYM: + if (DotDynSymSec != nullptr) + reportError("Multilpe SHT_DYNSYM"); + DotDynSymSec = &Sec; + break; + case ELF::SHT_SYMTAB: + if (DotSymtabSec != nullptr) + reportError("Multilpe SHT_SYMTAB"); + DotSymtabSec = &Sec; + break; + case ELF::SHT_SYMTAB_SHNDX: { + ErrorOr<ArrayRef<Elf_Word>> TableOrErr = Obj->getSHNDXTable(Sec); + error(TableOrErr.getError()); + ShndxTable = *TableOrErr; + break; + } + } + } + auto toMappedAddr = [&](uint64_t VAddr) -> const uint8_t * { const Elf_Phdr **I = std::upper_bound( LoadSegments.begin(), LoadSegments.end(), VAddr, compareAddr<ELFT>); @@ -1059,42 +1095,6 @@ ELFDumper<ELFT>::ELFDumper(const ELFFile<ELFT> *Obj, StreamWriter &Writer) DynamicStringTable = StringRef(StringTableBegin, StringTableSize); if (SONameOffset) SOName = getDynamicString(SONameOffset); - - for (const Elf_Shdr &Sec : Obj->sections()) { - switch (Sec.sh_type) { - case ELF::SHT_GNU_versym: - if (dot_gnu_version_sec != nullptr) - reportError("Multiple SHT_GNU_versym"); - dot_gnu_version_sec = &Sec; - break; - case ELF::SHT_GNU_verdef: - if (dot_gnu_version_d_sec != nullptr) - reportError("Multiple SHT_GNU_verdef"); - dot_gnu_version_d_sec = &Sec; - break; - case ELF::SHT_GNU_verneed: - if (dot_gnu_version_r_sec != nullptr) - reportError("Multilpe SHT_GNU_verneed"); - dot_gnu_version_r_sec = &Sec; - break; - case ELF::SHT_DYNSYM: - if (DotDynSymSec != nullptr) - reportError("Multilpe SHT_DYNSYM"); - DotDynSymSec = &Sec; - break; - case ELF::SHT_SYMTAB: - if (DotSymtabSec != nullptr) - reportError("Multilpe SHT_SYMTAB"); - DotSymtabSec = &Sec; - break; - case ELF::SHT_SYMTAB_SHNDX: { - ErrorOr<ArrayRef<Elf_Word>> TableOrErr = Obj->getSHNDXTable(Sec); - error(TableOrErr.getError()); - ShndxTable = *TableOrErr; - break; - } - } - } if (opts::Output == opts::GNU) ELFDumperStyle.reset(new GNUStyle<ELFT>(Writer)); else |