Ejemplo n.º 1
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.º 2
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.º 3
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) {}