error_or<int64_t> symbol_address(const ELFObjectFile<T> &obj, const SymbolRef &sym) { auto sym_elf = obj.getSymbol(sym.getRawDataRefImpl()); if (is_rel(obj) && !is_abs_symbol(*sym_elf)) { // abs symbols does not affected by relocations return success(int64_t(0)); } else { auto addr = prim::symbol_address(sym); if (!addr) return addr; auto base = base_address(obj); return success(prim::relative_address(base, *addr)); } }
void DyldELFObject<target_endianness, is64Bits>::updateSymbolAddress( const SymbolRef &SymRef, uint64_t Addr) { Elf_Sym *sym = const_cast<Elf_Sym*>( ELFObjectFile<target_endianness, is64Bits>:: getSymbol(SymRef.getRawDataRefImpl())); // This assumes the address passed in matches the target address bitness // The template-based type cast handles everything else. sym->st_value = static_cast<addr_type>(Addr); }
void symbol_entry(const ELFObjectFile<T> &obj, const SymbolRef &sym, ogre_doc &s) { auto sym_elf = obj.getSymbol(sym.getRawDataRefImpl()); if (is_abs_symbol(*sym_elf)) { return; } auto name = prim::symbol_name(sym); auto addr = symbol_address(obj, sym); auto off = symbol_file_offset(obj, sym); if (name && addr && off) { s.entry("symbol-entry") << *name << *addr << sym_elf->st_size << *off; if (sym_elf->getType() == ELF::STT_FUNC) s.entry("code-entry") << *name << *off << sym_elf->st_size ; } }
unsigned COFFObjectFile::getSymbolSectionID(SymbolRef Sym) const { COFFSymbolRef Symb = getCOFFSymbol(Sym.getRawDataRefImpl()); return Symb.getSectionNumber(); }
COFFSymbolRef COFFObjectFile::getCOFFSymbol(const SymbolRef &Symbol) const { return getCOFFSymbol(Symbol.getRawDataRefImpl()); }