diff --git a/llvm/include/llvm/Object/ELF.h b/llvm/include/llvm/Object/ELF.h --- a/llvm/include/llvm/Object/ELF.h +++ b/llvm/include/llvm/Object/ELF.h @@ -337,19 +337,17 @@ template inline Expected -getExtendedSymbolTableIndex(const typename ELFT::Sym &Sym, - const typename ELFT::Sym &FirstSym, +getExtendedSymbolTableIndex(const typename ELFT::Sym &Sym, unsigned SymIndex, ArrayRef ShndxTable) { assert(Sym.st_shndx == ELF::SHN_XINDEX); - unsigned Index = &Sym - &FirstSym; - if (Index >= ShndxTable.size()) + if (SymIndex >= ShndxTable.size()) return createError( - "extended symbol index (" + Twine(Index) + + "extended symbol index (" + Twine(SymIndex) + ") is past the end of the SHT_SYMTAB_SHNDX section of size " + Twine(ShndxTable.size())); // The size of the table was checked in getSHNDXTable. - return ShndxTable[Index]; + return ShndxTable[SymIndex]; } template @@ -359,7 +357,7 @@ uint32_t Index = Sym.st_shndx; if (Index == ELF::SHN_XINDEX) { Expected ErrorOrIndex = - getExtendedSymbolTableIndex(Sym, *Syms.begin(), ShndxTable); + getExtendedSymbolTableIndex(Sym, &Sym - Syms.begin(), ShndxTable); if (!ErrorOrIndex) return ErrorOrIndex.takeError(); return *ErrorOrIndex; diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -359,7 +359,7 @@ Optional StrTable, bool IsDynamic) const; Expected getSymbolSectionIndex(const Elf_Sym *Symbol, - const Elf_Sym *FirstSym) const; + unsigned SymIndex) const; Expected getSymbolSectionName(const Elf_Sym *Symbol, unsigned SectionIndex) const; std::string getStaticSymbolName(uint32_t Index) const; @@ -711,7 +711,7 @@ ELFDumperStyle->printSymtabMessage(SymtabSec, Entries, NonVisibilityBitsUsed); for (const auto &Sym : Syms) - ELFDumperStyle->printSymbol(&Sym, Syms.begin(), StrTable, IsDynamic, + ELFDumperStyle->printSymbol(&Sym, &Sym - Syms.begin(), StrTable, IsDynamic, NonVisibilityBitsUsed); } @@ -740,7 +740,7 @@ virtual void printDynamicRelocations() = 0; virtual void printSymtabMessage(const Elf_Shdr *Symtab, size_t Offset, bool NonVisibilityBitsUsed) {} - virtual void printSymbol(const Elf_Sym *Symbol, const Elf_Sym *FirstSym, + virtual void printSymbol(const Elf_Sym *Symbol, unsigned SymIndex, Optional StrTable, bool IsDynamic, bool NonVisibilityBitsUsed) = 0; virtual void printProgramHeaders(bool PrintProgramHeaders, @@ -891,7 +891,7 @@ OS.flush(); return OS; } - void printHashedSymbol(const Elf_Sym *FirstSym, uint32_t Sym, + void printHashedSymbol(const Elf_Sym *Sym, unsigned SymIndex, StringRef StrTable, uint32_t Bucket); void printReloc(const Relocation &R, unsigned RelIndex, const Elf_Shdr &Sec, const Elf_Shdr *SymTab) override; @@ -899,15 +899,14 @@ void printRelRelaReloc(const Relocation &R, const RelSymbol &RelSym); - void printSymbol(const Elf_Sym *Symbol, const Elf_Sym *First, + void printSymbol(const Elf_Sym *Symbol, unsigned SymIndex, Optional StrTable, bool IsDynamic, bool NonVisibilityBitsUsed) override; void printDynamicRelocHeader(unsigned Type, StringRef Name, const DynRegionInfo &Reg) override; void printDynamicReloc(const Relocation &R) override; - std::string getSymbolSectionNdx(const Elf_Sym *Symbol, - const Elf_Sym *FirstSym); + std::string getSymbolSectionNdx(const Elf_Sym *Symbol, unsigned SymIndex); void printProgramHeaders(); void printSectionMapping(); void printGNUVersionSectionProlog(const typename ELFT::Shdr *Sec, @@ -967,8 +966,8 @@ void printRelRelaReloc(const Relocation &R, StringRef SymbolName); void printSymbols(); void printDynamicSymbols(); - void printSymbolSection(const Elf_Sym *Symbol, const Elf_Sym *First); - void printSymbol(const Elf_Sym *Symbol, const Elf_Sym *First, + void printSymbolSection(const Elf_Sym *Symbol, unsigned SymIndex); + void printSymbol(const Elf_Sym *Symbol, unsigned SymIndex, Optional StrTable, bool IsDynamic, bool /*NonVisibilityBitsUsed*/) override; void printProgramHeaders(); @@ -1191,7 +1190,7 @@ Elf_Sym_Range Syms = unwrapOrError( ObjF->getFileName(), ObjF->getELFFile()->symbols(DotSymtabSec)); Expected SectionIndex = - getSymbolSectionIndex(Symbol, Syms.begin()); + getSymbolSectionIndex(Symbol, Symbol - Syms.begin()); if (!SectionIndex) { reportUniqueWarning(SectionIndex.takeError()); return ""; @@ -1224,10 +1223,10 @@ template Expected ELFDumper::getSymbolSectionIndex(const Elf_Sym *Symbol, - const Elf_Sym *FirstSym) const { + unsigned SymIndex) const { unsigned Ndx = Symbol->st_shndx; if (Ndx == SHN_XINDEX) - return object::getExtendedSymbolTableIndex(*Symbol, *FirstSym, + return object::getExtendedSymbolTableIndex(*Symbol, SymIndex, ShndxTable); if (Ndx != SHN_UNDEF && Ndx < SHN_LORESERVE) return Ndx; @@ -3925,7 +3924,7 @@ template std::string GNUStyle::getSymbolSectionNdx(const Elf_Sym *Symbol, - const Elf_Sym *FirstSym) { + unsigned SymIndex) { unsigned SectionIndex = Symbol->st_shndx; switch (SectionIndex) { case ELF::SHN_UNDEF: @@ -3936,7 +3935,7 @@ return "COM"; case ELF::SHN_XINDEX: { Expected IndexOrErr = object::getExtendedSymbolTableIndex( - *Symbol, *FirstSym, this->dumper()->getShndxTable()); + *Symbol, SymIndex, this->dumper()->getShndxTable()); if (!IndexOrErr) { assert(Symbol->st_shndx == SHN_XINDEX && "getExtendedSymbolTableIndex should only fail due to an invalid " @@ -3967,13 +3966,13 @@ } template -void GNUStyle::printSymbol(const Elf_Sym *Symbol, const Elf_Sym *FirstSym, +void GNUStyle::printSymbol(const Elf_Sym *Symbol, unsigned SymIndex, Optional StrTable, bool IsDynamic, bool NonVisibilityBitsUsed) { unsigned Bias = ELFT::Is64Bits ? 8 : 0; Field Fields[8] = {0, 8, 17 + Bias, 23 + Bias, 31 + Bias, 38 + Bias, 48 + Bias, 51 + Bias}; - Fields[0].Str = to_string(format_decimal(Symbol - FirstSym, 6)) + ":"; + Fields[0].Str = to_string(format_decimal(SymIndex, 6)) + ":"; Fields[1].Str = to_string( format_hex_no_prefix(Symbol->st_value, ELFT::Is64Bits ? 16 : 8)); Fields[2].Str = to_string(format_decimal(Symbol->st_size, 5)); @@ -3994,7 +3993,7 @@ " [st_other, 2)) + ">]"; Fields[6].Column += NonVisibilityBitsUsed ? 13 : 0; - Fields[6].Str = getSymbolSectionNdx(Symbol, FirstSym); + Fields[6].Str = getSymbolSectionNdx(Symbol, SymIndex); Fields[7].Str = this->dumper()->getFullSymbolName(Symbol, StrTable, IsDynamic); @@ -4004,15 +4003,14 @@ } template -void GNUStyle::printHashedSymbol(const Elf_Sym *FirstSym, uint32_t Sym, +void GNUStyle::printHashedSymbol(const Elf_Sym *Symbol, unsigned SymIndex, StringRef StrTable, uint32_t Bucket) { unsigned Bias = ELFT::Is64Bits ? 8 : 0; Field Fields[9] = {0, 6, 11, 20 + Bias, 25 + Bias, 34 + Bias, 41 + Bias, 49 + Bias, 53 + Bias}; - Fields[0].Str = to_string(format_decimal(Sym, 5)); + Fields[0].Str = to_string(format_decimal(SymIndex, 5)); Fields[1].Str = to_string(format_decimal(Bucket, 3)) + ":"; - const auto Symbol = FirstSym + Sym; Fields[2].Str = to_string( format_hex_no_prefix(Symbol->st_value, ELFT::Is64Bits ? 16 : 8)); Fields[3].Str = to_string(format_decimal(Symbol->st_size, 5)); @@ -4028,7 +4026,7 @@ printEnum(Symbol->getBinding(), makeArrayRef(ElfSymbolBindings)); Fields[6].Str = printEnum(Symbol->getVisibility(), makeArrayRef(ElfSymbolVisibilities)); - Fields[7].Str = getSymbolSectionNdx(Symbol, FirstSym); + Fields[7].Str = getSymbolSectionNdx(Symbol, SymIndex); Fields[8].Str = this->dumper()->getFullSymbolName(Symbol, StrTable, true); for (auto &Entry : Fields) @@ -4087,7 +4085,7 @@ break; } - printHashedSymbol(FirstSym, Ch, StringTable, Buc); + printHashedSymbol(FirstSym + Ch, Ch, StringTable, Buc); Visited[Ch] = true; } } @@ -4118,7 +4116,8 @@ uint32_t GnuHashable = Index - GnuHash.symndx; // Print whole chain while (true) { - printHashedSymbol(FirstSym, Index++, StringTable, Buc); + uint32_t SymIndex = Index++; + printHashedSymbol(FirstSym + SymIndex, SymIndex, StringTable, Buc); // Chain ends at symbol with stopper bit if ((GnuHash.values(DynSyms.size())[GnuHashable++] & 1) == 1) break; @@ -5854,7 +5853,8 @@ OS.PadToColumn(40 + 3 * Bias); OS << printEnum(Sym->getType(), makeArrayRef(ElfSymbolTypes)); OS.PadToColumn(48 + 3 * Bias); - OS << getSymbolSectionNdx(Sym, this->dumper()->dynamic_symbols().begin()); + OS << getSymbolSectionNdx( + Sym, Sym - this->dumper()->dynamic_symbols().begin()); OS.PadToColumn(52 + 3 * Bias); OS << SymName << "\n"; } @@ -5903,7 +5903,8 @@ OS.PadToColumn(29 + 3 * Bias); OS << printEnum(Sym->getType(), makeArrayRef(ElfSymbolTypes)); OS.PadToColumn(37 + 3 * Bias); - OS << getSymbolSectionNdx(Sym, this->dumper()->dynamic_symbols().begin()); + OS << getSymbolSectionNdx( + Sym, Sym - this->dumper()->dynamic_symbols().begin()); OS.PadToColumn(41 + 3 * Bias); OS << SymName << "\n"; } @@ -6146,17 +6147,15 @@ StringRef StrTable = unwrapOrError( this->FileName, this->Obj.getStringTableForSymtab(*Symtab)); - for (const Elf_Sym &Sym : - unwrapOrError(this->FileName, this->Obj.symbols(Symtab))) { + typename ELFT::SymRange Symbols = + unwrapOrError(this->FileName, this->Obj.symbols(Symtab)); + for (const Elf_Sym &Sym : Symbols) { const Elf_Shdr *SymSec = unwrapOrError(this->FileName, this->Obj.getSection( Sym, Symtab, this->dumper()->getShndxTable())); if (SymSec == &Sec) - printSymbol(&Sym, - unwrapOrError(this->FileName, this->Obj.symbols(Symtab)) - .begin(), - StrTable, false, false); + printSymbol(&Sym, &Sym - &Symbols[0], StrTable, false, false); } } } @@ -6173,7 +6172,7 @@ template void LLVMStyle::printSymbolSection(const Elf_Sym *Symbol, - const Elf_Sym *First) { + unsigned SymIndex) { auto GetSectionSpecialType = [&]() -> Optional { if (Symbol->isUndefined()) return StringRef("Undefined"); @@ -6196,7 +6195,7 @@ } Expected SectionIndex = - this->dumper()->getSymbolSectionIndex(Symbol, First); + this->dumper()->getSymbolSectionIndex(Symbol, SymIndex); if (!SectionIndex) { assert(Symbol->st_shndx == SHN_XINDEX && "getSymbolSectionIndex should only fail due to an invalid " @@ -6222,7 +6221,7 @@ } template -void LLVMStyle::printSymbol(const Elf_Sym *Symbol, const Elf_Sym *First, +void LLVMStyle::printSymbol(const Elf_Sym *Symbol, unsigned SymIndex, Optional StrTable, bool IsDynamic, bool /*NonVisibilityBitsUsed*/) { std::string FullSymbolName = @@ -6261,7 +6260,7 @@ } W.printFlags("Other", Symbol->st_other, makeArrayRef(SymOtherFlags), 0x3u); } - printSymbolSection(Symbol, First); + printSymbolSection(Symbol, SymIndex); } template @@ -6765,7 +6764,7 @@ const Elf_Sym *Sym = Parser.getGotSym(&E); W.printHex("Value", Sym->st_value); W.printEnum("Type", Sym->getType(), makeArrayRef(ElfSymbolTypes)); - printSymbolSection(Sym, this->dumper()->dynamic_symbols().begin()); + printSymbolSection(Sym, Sym - this->dumper()->dynamic_symbols().begin()); std::string SymName = this->dumper()->getFullSymbolName( Sym, this->dumper()->getDynamicStringTable(), true); @@ -6809,7 +6808,7 @@ const Elf_Sym *Sym = Parser.getPltSym(&E); W.printHex("Value", Sym->st_value); W.printEnum("Type", Sym->getType(), makeArrayRef(ElfSymbolTypes)); - printSymbolSection(Sym, this->dumper()->dynamic_symbols().begin()); + printSymbolSection(Sym, Sym - this->dumper()->dynamic_symbols().begin()); std::string SymName = this->dumper()->getFullSymbolName(Sym, Parser.getPltStrTable(), true);