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