kldxref: add R_PPC64_ADDR64 handler

Implements R_PPC64_ADDR64 handler for kldxref, addressing
"kldxref: unhandled relocation type 38" when running
"kldxref /boot/kernel"

Reviewed by:	jhibbits
MFC after:	1 week
Sponsored by:	Instituto de Pesquisas Eldorado (eldorado.org.br)
Differential Revision:	https://reviews.freebsd.org/D33615
This commit is contained in:
Alfredo Dal'Ava Junior 2021-12-27 15:29:50 -03:00
parent 2c733b50c5
commit c3d9c63329

View File

@ -55,7 +55,7 @@ ef_reloc(struct elf_file *ef, const void *reldata, int reltype, Elf_Off relbase,
Elf_Off dataoff, size_t len, void *dest) Elf_Off dataoff, size_t len, void *dest)
{ {
Elf_Addr *where, addend; Elf_Addr *where, addend;
Elf_Size rtype; Elf_Size rtype, symidx;
const Elf_Rela *rela; const Elf_Rela *rela;
if (reltype != EF_RELOC_RELA) if (reltype != EF_RELOC_RELA)
@ -65,6 +65,7 @@ ef_reloc(struct elf_file *ef, const void *reldata, int reltype, Elf_Off relbase,
where = (Elf_Addr *) ((Elf_Off)dest - dataoff + rela->r_offset); where = (Elf_Addr *) ((Elf_Off)dest - dataoff + rela->r_offset);
addend = rela->r_addend; addend = rela->r_addend;
rtype = ELF_R_TYPE(rela->r_info); rtype = ELF_R_TYPE(rela->r_info);
symidx = ELF_R_SYM(rela->r_info);
if ((char *)where < (char *)dest || (char *)where >= (char *)dest + len) if ((char *)where < (char *)dest || (char *)where >= (char *)dest + len)
return (0); return (0);
@ -73,6 +74,9 @@ ef_reloc(struct elf_file *ef, const void *reldata, int reltype, Elf_Off relbase,
case R_PPC_RELATIVE: /* word32|doubleword64 B + A */ case R_PPC_RELATIVE: /* word32|doubleword64 B + A */
*where = relbase + addend; *where = relbase + addend;
break; break;
case R_PPC64_ADDR64: /* S + A */
*where = EF_SYMADDR(ef, symidx) + addend;
break;
default: default:
warnx("unhandled relocation type %" PRI_ELF_SIZE, rtype); warnx("unhandled relocation type %" PRI_ELF_SIZE, rtype);
} }