aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJessica Clarke <jrtc27@FreeBSD.org>2023-12-14 20:17:20 +0000
committerJessica Clarke <jrtc27@FreeBSD.org>2023-12-14 20:17:20 +0000
commitaaba1490ec4b17dea750b1e58dfded7aeb4e9816 (patch)
tree43e7e74da20744637b1cb4989a3a8916e2b572d5
parentae7925cafeee1136bd1761b2ce75614ee47b0039 (diff)
downloadsrc-aaba1490ec4b17dea750b1e58dfded7aeb4e9816.tar.gz
src-aaba1490ec4b17dea750b1e58dfded7aeb4e9816.zip
kldxref: Implement aarch64 R_AARCH64_AB64 relocation
Doing nothing seems to be sufficient but is strange, inconsistent with other architectures, and not necessary when it's easy to support properly.
-rw-r--r--usr.sbin/kldxref/ef_aarch64.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/usr.sbin/kldxref/ef_aarch64.c b/usr.sbin/kldxref/ef_aarch64.c
index f1e499e76ef1..4365a7ff1f66 100644
--- a/usr.sbin/kldxref/ef_aarch64.c
+++ b/usr.sbin/kldxref/ef_aarch64.c
@@ -43,8 +43,8 @@ ef_aarch64_reloc(struct elf_file *ef, const void *reldata, Elf_Type reltype,
GElf_Addr relbase, GElf_Addr dataoff, size_t len, void *dest)
{
char *where;
- Elf64_Addr addend;
- GElf_Size rtype;
+ GElf_Addr addr, addend;
+ GElf_Size rtype, symidx;
const GElf_Rela *rela;
if (reltype != ELF_T_RELA)
@@ -54,6 +54,7 @@ ef_aarch64_reloc(struct elf_file *ef, const void *reldata, Elf_Type reltype,
where = (char *)dest - dataoff + rela->r_offset;
addend = rela->r_addend;
rtype = GELF_R_TYPE(rela->r_info);
+ symidx = GELF_R_SYM(rela->r_info);
if (where < (char *)dest || where >= (char *)dest + len)
return (0);
@@ -63,6 +64,8 @@ ef_aarch64_reloc(struct elf_file *ef, const void *reldata, Elf_Type reltype,
le64enc(where, relbase + addend);
break;
case R_AARCH64_ABS64:
+ addr = EF_SYMADDR(ef, symidx) + addend;
+ le64enc(where, addr);
break;
default:
warnx("unhandled relocation type %d", (int)rtype);