static void addSymbols(const std::vector<ELFYAML::Symbol> &Symbols, ELFState<ELFT> &State, std::vector<typename object::ELFFile<ELFT>::Elf_Sym> &Syms, unsigned SymbolBinding) { typedef typename object::ELFFile<ELFT>::Elf_Sym Elf_Sym; for (const auto &Sym : Symbols) { Elf_Sym Symbol; zero(Symbol); if (!Sym.Name.empty()) Symbol.st_name = State.getStringTable().addString(Sym.Name); Symbol.setBindingAndType(SymbolBinding, Sym.Type); if (!Sym.Section.empty()) { unsigned Index; if (State.getSN2I().lookupSection(Sym.Section, Index)) { errs() << "error: Unknown section referenced: '" << Sym.Section << "' by YAML symbol " << Sym.Name << ".\n"; exit(1); } Symbol.st_shndx = Index; } // else Symbol.st_shndex == SHN_UNDEF (== 0), since it was zero'd earlier. Symbol.st_value = Sym.Value; Symbol.st_size = Sym.Size; Syms.push_back(Symbol); } }
void ELFState<ELFT>::addSymbols(const std::vector<ELFYAML::Symbol> &Symbols, std::vector<Elf_Sym> &Syms, unsigned SymbolBinding, const StringTableBuilder &Strtab) { for (const auto &Sym : Symbols) { Elf_Sym Symbol; zero(Symbol); if (!Sym.Name.empty()) Symbol.st_name = Strtab.getOffset(Sym.Name); Symbol.setBindingAndType(SymbolBinding, Sym.Type); if (!Sym.Section.empty()) { unsigned Index; if (SN2I.lookup(Sym.Section, Index)) { WithColor::error() << "Unknown section referenced: '" << Sym.Section << "' by YAML symbol " << Sym.Name << ".\n"; exit(1); } Symbol.st_shndx = Index; } else if (Sym.Index) { Symbol.st_shndx = *Sym.Index; } // else Symbol.st_shndex == SHN_UNDEF (== 0), since it was zero'd earlier. Symbol.st_value = Sym.Value; Symbol.st_other = Sym.Other; Symbol.st_size = Sym.Size; Syms.push_back(Symbol); } }
void SymbolTable<ELFT>::addShared(SharedFile<ELFT> *F, StringRef Name, const Elf_Sym &Sym, const typename ELFT::Verdef *Verdef) { // DSO symbols do not affect visibility in the output, so we pass STV_DEFAULT // as the visibility, which will leave the visibility in the symbol table // unchanged. Symbol *S; bool WasInserted; std::tie(S, WasInserted) = insert(Name, Sym.getType(), STV_DEFAULT, /*CanOmitFromDynSym*/ true, /*IsUsedInRegularObj*/ false, F); // Make sure we preempt DSO symbols with default visibility. if (Sym.getVisibility() == STV_DEFAULT) S->ExportDynamic = true; if (WasInserted || isa<Undefined>(S->body())) { replaceBody<SharedSymbol<ELFT>>(S, F, Name, Sym, Verdef); if (!S->isWeak()) F->IsUsed = true; } }
void SymbolTable<ELFT>::addShared(SharedFile<ELFT> *F, StringRef Name, const Elf_Sym &Sym, const typename ELFT::Verdef *Verdef) { // DSO symbols do not affect visibility in the output, so we pass STV_DEFAULT // as the visibility, which will leave the visibility in the symbol table // unchanged. Symbol *S; bool WasInserted; std::tie(S, WasInserted) = insert(Name, Sym.getType(), STV_DEFAULT, /*CanOmitFromDynSym*/ true, F); // Make sure we preempt DSO symbols with default visibility. if (Sym.getVisibility() == STV_DEFAULT) { S->ExportDynamic = true; // Exporting preempting symbols takes precedence over linker scripts. if (S->VersionId == VER_NDX_LOCAL) S->VersionId = VER_NDX_GLOBAL; } if (WasInserted || isa<Undefined<ELFT>>(S->body())) { replaceBody<SharedSymbol<ELFT>>(S, F, Name, Sym, Verdef); if (!S->isWeak()) F->IsUsed = true; } }
int RelTab::addRel(string name, RT type, int off) { Elf_Sym *sym = symTab->getSymRef(name); if (sym != NULL) { Elf_Rel rel; if (sym->getDef() == false) sym->addFRef(off, type); if (sym->getBinding() == STB_GLOBAL) { rel = Elf_Rel(off, type, sym); endInsert(rel); return (-1)*INS_SIZE; } if (sym->getBinding() == STB_LOCAL) { if (sym->getSection() == NULL) rel = Elf_Rel(off, type, NULL); // dodati fref na mesto else { string sec = sym->getSection()->getName(); rel = Elf_Rel(off, type, symTab->getSymRef(sec)); } //rel = Elf_Rel(off, type, ); endInsert(rel); return (-1)*INS_SIZE + sym->getValue(); } // throw unknown binding? } else { sym = symTab->addUndSym(name, off); sym->addFRef(off, type); return 0; } }
UndefinedElf<ELFT>::UndefinedElf(const Elf_Sym &Sym) : SymbolBody(SymbolBody::UndefinedElfKind, Sym.st_name, Sym.st_other, Sym.getType()), Size(Sym.st_size) { assert(Sym.getBinding() == STB_LOCAL); }
UndefinedElf<ELFT>::UndefinedElf(StringRef N, const Elf_Sym &Sym) : SymbolBody(SymbolBody::UndefinedElfKind, N, Sym.getBinding(), Sym.st_other, Sym.getType()), Size(Sym.st_size) {}