Ejemplo n.º 1
0
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);
  }
}
Ejemplo n.º 2
0
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);
  }
}
Ejemplo n.º 3
0
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;
  }
}
Ejemplo n.º 4
0
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;
  }
}
Ejemplo n.º 5
0
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;
	}
}
Ejemplo n.º 6
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);
}
Ejemplo n.º 7
0
UndefinedElf<ELFT>::UndefinedElf(StringRef N, const Elf_Sym &Sym)
    : SymbolBody(SymbolBody::UndefinedElfKind, N, Sym.getBinding(),
                 Sym.st_other, Sym.getType()),
      Size(Sym.st_size) {}