Module Name:    src
Committed By:   skrll
Date:           Tue Jun 21 06:52:17 UTC 2022

Modified Files:
        src/lib/csu/common: crt0-common.c
        src/libexec/ld.elf_so: rtld.h
        src/libexec/ld.elf_so/arch/aarch64: mdreloc.c
        src/tests/lib/csu: h_ifunc_static.c t_ifunc_static.sh
        src/tests/libexec/ld.elf_so: t_ifunc.c

Log Message:
Support ifunc on aarch64. The tests pass at least.


To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.27 src/lib/csu/common/crt0-common.c
cvs rdiff -u -r1.143 -r1.144 src/libexec/ld.elf_so/rtld.h
cvs rdiff -u -r1.15 -r1.16 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c
cvs rdiff -u -r1.6 -r1.7 src/tests/lib/csu/h_ifunc_static.c
cvs rdiff -u -r1.2 -r1.3 src/tests/lib/csu/t_ifunc_static.sh
cvs rdiff -u -r1.11 -r1.12 src/tests/libexec/ld.elf_so/t_ifunc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/csu/common/crt0-common.c
diff -u src/lib/csu/common/crt0-common.c:1.26 src/lib/csu/common/crt0-common.c:1.27
--- src/lib/csu/common/crt0-common.c:1.26	Tue Jun 21 06:47:37 2022
+++ src/lib/csu/common/crt0-common.c	Tue Jun 21 06:52:17 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: crt0-common.c,v 1.26 2022/06/21 06:47:37 skrll Exp $ */
+/* $NetBSD: crt0-common.c,v 1.27 2022/06/21 06:52:17 skrll Exp $ */
 
 /*
  * Copyright (c) 1998 Christos Zoulas
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: crt0-common.c,v 1.26 2022/06/21 06:47:37 skrll Exp $");
+__RCSID("$NetBSD: crt0-common.c,v 1.27 2022/06/21 06:52:17 skrll Exp $");
 
 #include <sys/types.h>
 #include <sys/exec.h>
@@ -127,6 +127,7 @@ _finiarray(void)
 }
 
 #if \
+    defined(__aarch64__) || \
     defined(__powerpc__) || \
     defined(__sparc__) || \
     defined(__x86_64__)

Index: src/libexec/ld.elf_so/rtld.h
diff -u src/libexec/ld.elf_so/rtld.h:1.143 src/libexec/ld.elf_so/rtld.h:1.144
--- src/libexec/ld.elf_so/rtld.h:1.143	Tue Jun 21 06:47:37 2022
+++ src/libexec/ld.elf_so/rtld.h	Tue Jun 21 06:52:17 2022
@@ -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__) || \

Index: src/libexec/ld.elf_so/arch/aarch64/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.15 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.16
--- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.15	Tue May 31 08:43:14 2022
+++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c	Tue Jun 21 06:52:17 2022
@@ -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->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;
 		}
 	}
 

Index: src/tests/lib/csu/h_ifunc_static.c
diff -u src/tests/lib/csu/h_ifunc_static.c:1.6 src/tests/lib/csu/h_ifunc_static.c:1.7
--- src/tests/lib/csu/h_ifunc_static.c:1.6	Tue Jun 21 06:47:38 2022
+++ src/tests/lib/csu/h_ifunc_static.c	Tue Jun 21 06:52:17 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: h_ifunc_static.c,v 1.6 2022/06/21 06:47:38 skrll Exp $	*/
+/*	$NetBSD: h_ifunc_static.c,v 1.7 2022/06/21 06:52:17 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,6 +30,7 @@
  */
 
 #if \
+    defined(__aarch64__) || \
     defined(__arm__) || \
     defined(__i386__) || \
     defined(__powerpc__) || \

Index: src/tests/lib/csu/t_ifunc_static.sh
diff -u src/tests/lib/csu/t_ifunc_static.sh:1.2 src/tests/lib/csu/t_ifunc_static.sh:1.3
--- src/tests/lib/csu/t_ifunc_static.sh:1.2	Wed Jan 30 12:42:53 2019
+++ src/tests/lib/csu/t_ifunc_static.sh	Tue Jun 21 06:52:17 2022
@@ -1,4 +1,4 @@
-# $NetBSD: t_ifunc_static.sh,v 1.2 2019/01/30 12:42:53 martin Exp $
+# $NetBSD: t_ifunc_static.sh,v 1.3 2022/06/21 06:52:17 skrll Exp $
 #
 # Copyright (c) 2018 The NetBSD Foundation, Inc.
 # All rights reserved.
@@ -33,10 +33,10 @@ ifunc_static_head()
 ifunc_static_body()
 {
 	case `uname -p` in
-	i386|x86_64|powerpc|*sparc*|*arm*)
+	i386|x86_64|powerpc|*sparc*|*arm*|*aarch64*)
 		;;
 	*)
-		atf_skip "ifunc is supposed only on ARM, i386, PowerPC, SPARC and x86-64"
+		atf_skip "ifunc is supposed only on AARCH64, ARM, i386, PowerPC, SPARC and x86-64"
 		;;
 	esac
 

Index: src/tests/libexec/ld.elf_so/t_ifunc.c
diff -u src/tests/libexec/ld.elf_so/t_ifunc.c:1.11 src/tests/libexec/ld.elf_so/t_ifunc.c:1.12
--- src/tests/libexec/ld.elf_so/t_ifunc.c:1.11	Tue Jun 21 06:47:38 2022
+++ src/tests/libexec/ld.elf_so/t_ifunc.c	Tue Jun 21 06:52:17 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_ifunc.c,v 1.11 2022/06/21 06:47:38 skrll Exp $	*/
+/*	$NetBSD: t_ifunc.c,v 1.12 2022/06/21 06:52:17 skrll Exp $	*/
 
 /*
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -36,6 +36,7 @@
 #include "h_macros.h"
 
 #if \
+    defined(__aarch64__) || \
     defined(__arm__) || \
     defined(__i386__) || \
     defined(__sparc__) || \

Reply via email to