ErrorOr<uint32_t>
getExtendedSymbolTableIndex(const Elf_Sym *Sym, const Elf_Shdr *SymTab,
ArrayRef<Elf_Word> ShndxTable) const;
- ErrorOr<uint32_t>
- getExtendedSymbolTableIndex(const Elf_Sym *Sym, const Elf_Sym *FirstSym,
- ArrayRef<Elf_Word> ShndxTable) const;
const Elf_Ehdr *getHeader() const { return Header; }
ErrorOr<uint32_t> getSectionIndex(const Elf_Sym *Sym, const Elf_Shdr *SymTab,
ArrayRef<Elf_Word> ShndxTable) const;
}
template <class ELFT>
-ErrorOr<uint32_t> ELFFile<ELFT>::getExtendedSymbolTableIndex(
- const Elf_Sym *Sym, const Elf_Shdr *SymTab,
- ArrayRef<Elf_Word> ShndxTable) const {
- auto SymsOrErr = symbols(SymTab);
- if (std::error_code EC = SymsOrErr.getError())
- return EC;
- return getExtendedSymbolTableIndex(Sym, SymsOrErr->begin(), ShndxTable);
-}
-
-template <class ELFT>
-ErrorOr<uint32_t> ELFFile<ELFT>::getExtendedSymbolTableIndex(
- const Elf_Sym *Sym, const Elf_Sym *FirstSym,
- ArrayRef<Elf_Word> ShndxTable) const {
+inline ErrorOr<uint32_t>
+getExtendedSymbolTableIndex(const typename ELFT::Sym *Sym,
+ const typename ELFT::Sym *FirstSym,
+ ArrayRef<typename ELFT::Word> ShndxTable) {
assert(Sym->st_shndx == ELF::SHN_XINDEX);
unsigned Index = Sym - FirstSym;
if (Index >= ShndxTable.size())
return ShndxTable[Index];
}
+template <class ELFT>
+ErrorOr<uint32_t> ELFFile<ELFT>::getExtendedSymbolTableIndex(
+ const Elf_Sym *Sym, const Elf_Shdr *SymTab,
+ ArrayRef<Elf_Word> ShndxTable) const {
+ auto SymsOrErr = symbols(SymTab);
+ if (std::error_code EC = SymsOrErr.getError())
+ return EC;
+ return object::getExtendedSymbolTableIndex<ELFT>(Sym, SymsOrErr->begin(),
+ ShndxTable);
+}
+
template <class ELFT>
ErrorOr<uint32_t>
ELFFile<ELFT>::getSectionIndex(const Elf_Sym *Sym, const Elf_Shdr *SymTab,
return FullSymbolName;
}
-template <typename ELFO>
+template <typename ELFT>
static void
-getSectionNameIndex(const ELFO &Obj, const typename ELFO::Elf_Sym *Symbol,
- const typename ELFO::Elf_Sym *FirstSym,
- ArrayRef<typename ELFO::Elf_Word> ShndxTable,
+getSectionNameIndex(const ELFFile<ELFT> &Obj, const typename ELFT::Sym *Symbol,
+ const typename ELFT::Sym *FirstSym,
+ ArrayRef<typename ELFT::Word> ShndxTable,
StringRef &SectionName, unsigned &SectionIndex) {
SectionIndex = Symbol->st_shndx;
if (Symbol->isUndefined())
SectionName = "Reserved";
else {
if (SectionIndex == SHN_XINDEX)
- SectionIndex = unwrapOrError(
- Obj.getExtendedSymbolTableIndex(Symbol, FirstSym, ShndxTable));
- const typename ELFO::Elf_Shdr *Sec =
+ SectionIndex = unwrapOrError(object::getExtendedSymbolTableIndex<ELFT>(
+ Symbol, FirstSym, ShndxTable));
+ const typename ELFT::Shdr *Sec =
unwrapOrError(Obj.getSection(SectionIndex));
SectionName = unwrapOrError(Obj.getSectionName(Sec));
}
case ELF::SHN_COMMON:
return "COM";
case ELF::SHN_XINDEX:
- SectionIndex = unwrapOrError(Obj->getExtendedSymbolTableIndex(
+ SectionIndex = unwrapOrError(object::getExtendedSymbolTableIndex<ELFT>(
Symbol, FirstSym, this->dumper()->getShndxTable()));
default:
// Find if: