From 3a27979633d2d1c6e8ebf43b402a1147da7f0809 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 2 Jul 2015 16:03:38 +0000 Subject: [PATCH] Handle .dynsym a bit more like we handle .symtab. They have the same format and we find them in the same way, no reason to handle them differently. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241280 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/ELF.h | 50 +++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/include/llvm/Object/ELF.h b/include/llvm/Object/ELF.h index 1f2a4ea0160..7ec47527939 100644 --- a/include/llvm/Object/ELF.h +++ b/include/llvm/Object/ELF.h @@ -174,6 +174,8 @@ private: StringRef DotShstrtab; // Section header string table. StringRef DotStrtab; // Symbol header string table. const Elf_Shdr *dot_symtab_sec = nullptr; // Symbol table section. + StringRef DynSymStrTab; // Dynnamic symbol string table. + const Elf_Shdr *DotDynSymSec = nullptr; // Dynamic symbol table section. const Elf_Shdr *SymbolTableSectionHeaderIndex = nullptr; DenseMap ExtendedSymbolTable; @@ -195,8 +197,6 @@ private: DynRegionInfo DynamicRegion; DynRegionInfo DynHashRegion; - DynRegionInfo DynStrRegion; - DynRegionInfo DynSymRegion; DynRegionInfo DynRelaRegion; // Pointer to SONAME entry in dynamic string table @@ -284,18 +284,18 @@ public: } const Elf_Sym *dynamic_symbol_begin() const { - if (!DynSymRegion.Addr) + if (!DotDynSymSec) return nullptr; - if (DynSymRegion.EntSize != sizeof(Elf_Sym)) + if (DotDynSymSec->sh_entsize != sizeof(Elf_Sym)) report_fatal_error("Invalid symbol size"); - return reinterpret_cast(DynSymRegion.Addr); + return reinterpret_cast(base() + DotDynSymSec->sh_offset); } const Elf_Sym *dynamic_symbol_end() const { - if (!DynSymRegion.Addr) + if (!DotDynSymSec) return nullptr; - return reinterpret_cast( - ((const char *)DynSymRegion.Addr + DynSymRegion.Size)); + return reinterpret_cast(base() + DotDynSymSec->sh_offset + + DotDynSymSec->sh_size); } Elf_Sym_Range dynamic_symbols() const { @@ -438,7 +438,7 @@ void ELFFile::LoadVersionNeeds(const Elf_Shdr *sec) const { template void ELFFile::LoadVersionMap() const { // If there is no dynamic symtab or version table, there is nothing to do. - if (!DynSymRegion.Addr || !dot_gnu_version_sec) + if (!DotDynSymSec || !dot_gnu_version_sec) return; // Has the VersionMap already been loaded? @@ -625,21 +625,19 @@ ELFFile::ELFFile(StringRef Object, std::error_code &EC) DotStrtab = *SymtabOrErr; } break; case ELF::SHT_DYNSYM: { - if (DynSymRegion.Addr) { + if (DotDynSymSec) { // More than one .dynsym! EC = object_error::parse_failed; return; } - DynSymRegion.Addr = base() + Sec.sh_offset; - DynSymRegion.Size = Sec.sh_size; - DynSymRegion.EntSize = Sec.sh_entsize; - ErrorOr DynStrOrErr = getSection(Sec.sh_link); - if ((EC = DynStrOrErr.getError())) + DotDynSymSec = &Sec; + ErrorOr SectionOrErr = getSection(Sec.sh_link); + if ((EC = SectionOrErr.getError())) + return; + ErrorOr SymtabOrErr = getStringTable(*SectionOrErr); + if ((EC = SymtabOrErr.getError())) return; - const Elf_Shdr *DynStr = *DynStrOrErr; - DynStrRegion.Addr = base() + DynStr->sh_offset; - DynStrRegion.Size = DynStr->sh_size; - DynStrRegion.EntSize = DynStr->sh_entsize; + DynSymStrTab = *SymtabOrErr; break; } case ELF::SHT_DYNAMIC: @@ -879,9 +877,9 @@ ELFFile::getStringTable(const Elf_Shdr *Section) const { template const char *ELFFile::getDynamicString(uintX_t Offset) const { - if (!DynStrRegion.Addr || Offset >= DynStrRegion.Size) + if (!DotDynSymSec || Offset >= DynSymStrTab.size()) return nullptr; - return (const char *)DynStrRegion.Addr + Offset; + return (const char *)DynSymStrTab.begin() + Offset; } template @@ -925,7 +923,7 @@ ErrorOr ELFFile::getSymbolVersion(const Elf_Shdr *section, StrTab = *StrTabOrErr; } // Handle non-dynamic symbols. - if (section != DynSymRegion.Addr && section != nullptr) { + if (section != DotDynSymSec && section != nullptr) { // Non-dynamic symbols can have versions in their names // A name of the form 'foo@V1' indicates version 'V1', non-default. // A name of the form 'foo@@V2' indicates version 'V2', default version. @@ -956,8 +954,10 @@ ErrorOr ELFFile::getSymbolVersion(const Elf_Shdr *section, } // Determine the position in the symbol table of this entry. - size_t entry_index = ((const char *)symb - (const char *)DynSymRegion.Addr) / - DynSymRegion.EntSize; + size_t entry_index = + (reinterpret_cast(symb) - DotDynSymSec->sh_offset - + reinterpret_cast(base())) / + sizeof(Elf_Sym); // Get the corresponding version index entry const Elf_Versym *vs = getEntry(dot_gnu_version_sec, entry_index); @@ -992,7 +992,7 @@ ErrorOr ELFFile::getSymbolVersion(const Elf_Shdr *section, IsDefault = false; } - if (name_offset >= DynStrRegion.Size) + if (name_offset >= DynSymStrTab.size()) return object_error::parse_failed; return StringRef(getDynamicString(name_offset)); } -- 2.34.1