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) {}