aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin
diff options
context:
space:
mode:
authorAlfredo Dal'Ava Junior <alfredo@FreeBSD.org>2021-12-27 18:29:50 +0000
committerAlfredo Dal'Ava Junior <alfredo@FreeBSD.org>2021-12-27 18:29:50 +0000
commitc3d9c63329a8b70a0a3b139c7819ace13aab6716 (patch)
tree95de41af9a4ca17de73194da32597fcae1aa5898 /usr.sbin
parent2c733b50c5a99cbe4f6eef437e1e3efd720ba306 (diff)
downloadsrc-c3d9c63329a8b70a0a3b139c7819ace13aab6716.tar.gz
src-c3d9c63329a8b70a0a3b139c7819ace13aab6716.zip
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
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/kldxref/ef_powerpc.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/usr.sbin/kldxref/ef_powerpc.c b/usr.sbin/kldxref/ef_powerpc.c
index 4bb2792e0ecf..c50f518f892e 100644
--- a/usr.sbin/kldxref/ef_powerpc.c
+++ b/usr.sbin/kldxref/ef_powerpc.c
@@ -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_Addr *where, addend;
- Elf_Size rtype;
+ Elf_Size rtype, symidx;
const Elf_Rela *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);
addend = rela->r_addend;
rtype = ELF_R_TYPE(rela->r_info);
+ symidx = ELF_R_SYM(rela->r_info);
if ((char *)where < (char *)dest || (char *)where >= (char *)dest + len)
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 */
*where = relbase + addend;
break;
+ case R_PPC64_ADDR64: /* S + A */
+ *where = EF_SYMADDR(ef, symidx) + addend;
+ break;
default:
warnx("unhandled relocation type %" PRI_ELF_SIZE, rtype);
}