kldxref: add R_PPC_ADDR32 handler
Implements R_PPC_ADDR32 handler for kldxref, addressing "kldxref: unhandled relocation type 1" when running "kldxref /boot/kernel" on powerpc 32 bits. Reviewed by: luporl MFC after: 2 days Sponsored by: Instituto de Pesquisas Eldorado (eldorado.org.br) Differential Revision: https://reviews.freebsd.org/D33745
This commit is contained in:
parent
a30f71704e
commit
79f5d19890
@ -55,6 +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_Addr *where, addend;
|
||||
Elf32_Addr *where32;
|
||||
Elf_Size rtype, symidx;
|
||||
const Elf_Rela *rela;
|
||||
|
||||
@ -63,6 +64,7 @@ ef_reloc(struct elf_file *ef, const void *reldata, int reltype, Elf_Off relbase,
|
||||
|
||||
rela = (const Elf_Rela *)reldata;
|
||||
where = (Elf_Addr *) ((Elf_Off)dest - dataoff + rela->r_offset);
|
||||
where32 = (Elf32_Addr *) ((Elf_Off)dest - dataoff + rela->r_offset);
|
||||
addend = rela->r_addend;
|
||||
rtype = ELF_R_TYPE(rela->r_info);
|
||||
symidx = ELF_R_SYM(rela->r_info);
|
||||
@ -74,9 +76,14 @@ ef_reloc(struct elf_file *ef, const void *reldata, int reltype, Elf_Off relbase,
|
||||
case R_PPC_RELATIVE: /* word32|doubleword64 B + A */
|
||||
*where = relbase + addend;
|
||||
break;
|
||||
case R_PPC64_ADDR64: /* S + A */
|
||||
case R_PPC_ADDR32: /* word32 S + A */
|
||||
*where32 = EF_SYMADDR(ef, symidx) + addend;
|
||||
break;
|
||||
#ifdef __powerpc64__
|
||||
case R_PPC64_ADDR64: /* doubleword64 S + A */
|
||||
*where = EF_SYMADDR(ef, symidx) + addend;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
warnx("unhandled relocation type %" PRI_ELF_SIZE, rtype);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user