示例#1
0
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;
}