summaryrefslogtreecommitdiff
path: root/libexec
diff options
context:
space:
mode:
authorskrll <skrll@NetBSD.org>2022-06-21 06:52:17 +0000
committerskrll <skrll@NetBSD.org>2022-06-21 06:52:17 +0000
commit6beeb80212cb30cf0cc992740708667ebc702ac4 (patch)
treef480b13439eb084d5b7e18c178acc6480ca55b94 /libexec
parent450579d114d1eb5790054856e53ec100364e0f7d (diff)
Support ifunc on aarch64. The tests pass at least.
Diffstat (limited to 'libexec')
-rw-r--r--libexec/ld.elf_so/arch/aarch64/mdreloc.c20
-rw-r--r--libexec/ld.elf_so/rtld.h3
2 files changed, 18 insertions, 5 deletions
diff --git a/libexec/ld.elf_so/arch/aarch64/mdreloc.c b/libexec/ld.elf_so/arch/aarch64/mdreloc.c
index 49e7571d044..7412695e191 100644
--- a/libexec/ld.elf_so/arch/aarch64/mdreloc.c
+++ b/libexec/ld.elf_so/arch/aarch64/mdreloc.c
@@ -1,4 +1,4 @@
-/* $NetBSD: mdreloc.c,v 1.15 2022/05/31 08:43:14 andvar Exp $ */
+/* $NetBSD: mdreloc.c,v 1.16 2022/06/21 06:52:17 skrll Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.15 2022/05/31 08:43:14 andvar Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.16 2022/06/21 06:52:17 skrll Exp $");
#endif /* not lint */
#include <sys/types.h>
@@ -248,6 +248,14 @@ _rtld_relocate_nonplt_objects(Obj_Entry *obj)
obj->path, (void *)tmp, where, defobj->path));
break;
+ case R_TYPE(IRELATIVE):
+ /* IFUNC relocations are handled in _rtld_call_ifunc */
+ if (obj->ifunc_remaining_nonplt == 0)
+ obj->ifunc_remaining_nonplt = obj->relalim - rela;
+ rdbg(("IRELATIVE in %s, %zx", obj->path,
+ obj->ifunc_remaining_nonplt));
+ /* FALLTHROUGH */
+
case R_TYPE(RELATIVE): /* word B + A */
*where = (Elf_Addr)(obj->relocbase + rela->r_addend);
rdbg(("RELATIVE in %s --> %p", obj->path,
@@ -330,8 +338,9 @@ _rtld_relocate_plt_lazy(Obj_Entry *obj)
for (const Elf_Rela *rela = obj->pltrela; rela < obj->pltrelalim; rela++) {
Elf_Addr *where = (Elf_Addr *)(obj->relocbase + rela->r_offset);
- assert((ELF_R_TYPE(rela->r_info) == R_TYPE(JUMP_SLOT)) ||
- (ELF_R_TYPE(rela->r_info) == R_TYPE(TLSDESC)));
+ assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JUMP_SLOT) ||
+ ELF_R_TYPE(rela->r_info) == R_TYPE(TLSDESC) ||
+ ELF_R_TYPE(rela->r_info) == R_TYPE(IRELATIVE));
switch (ELF_R_TYPE(rela->r_info)) {
case R_TYPE(JUMP_SLOT):
@@ -342,6 +351,9 @@ _rtld_relocate_plt_lazy(Obj_Entry *obj)
case R_TYPE(TLSDESC):
_rtld_tlsdesc_fill(obj, rela, where, SYMLOOK_IN_PLT);
break;
+ case R_TYPE(IRELATIVE):
+ obj->ifunc_remaining = obj->pltrelalim - rela;
+ break;
}
}
diff --git a/libexec/ld.elf_so/rtld.h b/libexec/ld.elf_so/rtld.h
index 3575b5c78a3..9fb1286eebc 100644
--- a/libexec/ld.elf_so/rtld.h
+++ b/libexec/ld.elf_so/rtld.h
@@ -1,4 +1,4 @@
-/* $NetBSD: rtld.h,v 1.143 2022/06/21 06:47:37 skrll Exp $ */
+/* $NetBSD: rtld.h,v 1.144 2022/06/21 06:52:17 skrll Exp $ */
/*
* Copyright 1996 John D. Polstra.
@@ -303,6 +303,7 @@ typedef struct Struct_Obj_Entry {
/* IRELATIVE relocations */
size_t ifunc_remaining;
#if \
+ defined(__aarch64__) || \
defined(__arm__) || \
defined(__i386__) || \
defined(__powerpc__) || \