static void _dwarf_elf_apply_reloc(Dwarf_Debug dbg, void *buf, Elf_Data *rel_data, Elf_Data *symtab_data, int endian) { Dwarf_Unsigned type; GElf_Rela rela; GElf_Sym sym; size_t symndx; uint64_t offset; int size, j; j = 0; while (gelf_getrela(rel_data, j++, &rela) != NULL) { symndx = GELF_R_SYM(rela.r_info); type = GELF_R_TYPE(rela.r_info); if (gelf_getsym(symtab_data, symndx, &sym) == NULL) continue; offset = rela.r_offset; size = _dwarf_get_reloc_size(dbg, type); if (endian == ELFDATA2MSB) _dwarf_write_msb(buf, &offset, rela.r_addend, size); else _dwarf_write_lsb(buf, &offset, rela.r_addend, size); } }
static void _dwarf_elf_write_reloc(Dwarf_Debug dbg, Elf_Data *symtab_data, int endian, void *buf, uint64_t offset, GElf_Xword r_info, GElf_Sxword r_addend, int is_rel) { GElf_Sym sym; int size; if (gelf_getsym(symtab_data, GELF_R_SYM(r_info), &sym) == NULL) return; if ((size = _dwarf_get_reloc_size(dbg, GELF_R_TYPE(r_info))) == 0) return; /* Unknown or non-absolute relocation. */ if (is_rel) { uint64_t roffset = offset; if (endian == ELFDATA2MSB) r_addend = _dwarf_read_msb(buf, &roffset, size); else r_addend = _dwarf_read_lsb(buf, &roffset, size); } if (endian == ELFDATA2MSB) _dwarf_write_msb(buf, &offset, sym.st_value + r_addend, size); else _dwarf_write_lsb(buf, &offset, sym.st_value + r_addend, size); }