diff options
| author | skrll <skrll@NetBSD.org> | 2022-06-21 06:52:17 +0000 |
|---|---|---|
| committer | skrll <skrll@NetBSD.org> | 2022-06-21 06:52:17 +0000 |
| commit | 6beeb80212cb30cf0cc992740708667ebc702ac4 (patch) | |
| tree | f480b13439eb084d5b7e18c178acc6480ca55b94 /libexec | |
| parent | 450579d114d1eb5790054856e53ec100364e0f7d (diff) | |
Support ifunc on aarch64. The tests pass at least.
Diffstat (limited to 'libexec')
| -rw-r--r-- | libexec/ld.elf_so/arch/aarch64/mdreloc.c | 20 | ||||
| -rw-r--r-- | libexec/ld.elf_so/rtld.h | 3 |
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__) || \ |
