bool ElfRelocations::ApplyRelRelocs(const ELF::Rel* rel, size_t rel_count, const ElfSymbols* symbols, SymbolResolver* resolver, Error* error) { RLOG("%s: rel=%p rel_count=%d\n", __FUNCTION__, rel, rel_count); if (!rel) return true; for (size_t rel_n = 0; rel_n < rel_count; rel++, rel_n++) { const ELF::Word rel_type = ELF_R_TYPE(rel->r_info); const ELF::Word rel_symbol = ELF_R_SYM(rel->r_info); ELF::Addr sym_addr = 0; ELF::Addr reloc = static_cast<ELF::Addr>(rel->r_offset + load_bias_); RLOG(" %d/%d reloc=%p offset=%p type=%d symbol=%d\n", rel_n + 1, rel_count, reloc, rel->r_offset, rel_type, rel_symbol); if (rel_type == 0) continue; bool resolved = false; // If this is a symbolic relocation, compute the symbol's address. if (__builtin_expect(rel_symbol != 0, 0)) { resolved = ResolveSymbol(rel_type, rel_symbol, symbols, resolver, reloc, &sym_addr, error); } if (!ApplyRelReloc(rel, sym_addr, resolved, error)) return false; } return true; }
bool ElfRelocations::ApplyRelRelocs(const ELF::Rel* rel, size_t rel_count, const ElfSymbols* symbols, SymbolResolver* resolver, Error* error) { RLOG("%s: rel=%p rel_count=%d\n", __FUNCTION__, rel, rel_count); if (!rel) return true; for (size_t rel_n = 0; rel_n < rel_count; rel++, rel_n++) { RLOG(" Relocation %d of %d:\n", rel_n + 1, rel_count); if (!ApplyRelReloc(rel, symbols, resolver, error)) return false; } return true; }