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:
parent
2c733b50c5
commit
c3d9c63329
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user