Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 24 Apr 2026 15:29:09 +0000
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 3c01c7df9840 - stable/15 - rtld: Use uintptr_t instead of Elf_Addr for init/fini function pointers
Message-ID:  <69eb8c45.35fd2.28d9e136@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch stable/15 has been updated by jhb:

URL: https://cgit.FreeBSD.org/src/commit/?id=3c01c7df984019d3db1b7a1d5e4d61d8c366df28

commit 3c01c7df984019d3db1b7a1d5e4d61d8c366df28
Author:     John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2026-01-14 17:10:33 +0000
Commit:     John Baldwin <jhb@FreeBSD.org>
CommitDate: 2026-04-24 15:26:38 +0000

    rtld: Use uintptr_t instead of Elf_Addr for init/fini function pointers
    
    This is a no-op on non-CHERI architectures, but is required for CHERI
    where Elf_Addr is only an address and not a complete pointer.
    
    While here, consistently use `uintptr_t *` for arrays of init/fini
    function pointers.
    
    Reviewed by:    imp, kib
    Effort:         CHERI upstreaming
    Obtained from:  CheriBSD
    Sponsored by:   AFRL, DARPA
    Differential Revision:  https://reviews.freebsd.org/D54711
    
    (cherry picked from commit e96ec1a1eb935aa2febcbf9629a52c85297a088e)
---
 libexec/rtld-elf/rtld.c | 42 ++++++++++++++++++++----------------------
 libexec/rtld-elf/rtld.h | 10 +++++-----
 2 files changed, 25 insertions(+), 27 deletions(-)

diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index b987ce4d2a9d..10b84246d4ce 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -987,9 +987,9 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp)
 		 * functions for binaries linked with old crt1 which calls
 		 * _init itself.
 		 */
-		obj_main->init = obj_main->fini = (Elf_Addr)NULL;
+		obj_main->init = obj_main->fini = 0;
 		obj_main->preinit_array = obj_main->init_array =
-		    obj_main->fini_array = (Elf_Addr)NULL;
+		    obj_main->fini_array = NULL;
 	}
 
 	if (direct_exec) {
@@ -1508,43 +1508,43 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath,
 			break;
 
 		case DT_INIT:
-			obj->init = (Elf_Addr)(obj->relocbase +
+			obj->init = (uintptr_t)(obj->relocbase +
 			    dynp->d_un.d_ptr);
 			break;
 
 		case DT_PREINIT_ARRAY:
-			obj->preinit_array = (Elf_Addr)(obj->relocbase +
+			obj->preinit_array = (uintptr_t *)(obj->relocbase +
 			    dynp->d_un.d_ptr);
 			break;
 
 		case DT_PREINIT_ARRAYSZ:
 			obj->preinit_array_num = dynp->d_un.d_val /
-			    sizeof(Elf_Addr);
+			    sizeof(uintptr_t);
 			break;
 
 		case DT_INIT_ARRAY:
-			obj->init_array = (Elf_Addr)(obj->relocbase +
+			obj->init_array = (uintptr_t *)(obj->relocbase +
 			    dynp->d_un.d_ptr);
 			break;
 
 		case DT_INIT_ARRAYSZ:
 			obj->init_array_num = dynp->d_un.d_val /
-			    sizeof(Elf_Addr);
+			    sizeof(uintptr_t);
 			break;
 
 		case DT_FINI:
-			obj->fini = (Elf_Addr)(obj->relocbase +
+			obj->fini = (uintptr_t)(obj->relocbase +
 			    dynp->d_un.d_ptr);
 			break;
 
 		case DT_FINI_ARRAY:
-			obj->fini_array = (Elf_Addr)(obj->relocbase +
+			obj->fini_array = (uintptr_t *)(obj->relocbase +
 			    dynp->d_un.d_ptr);
 			break;
 
 		case DT_FINI_ARRAYSZ:
 			obj->fini_array_num = dynp->d_un.d_val /
-			    sizeof(Elf_Addr);
+			    sizeof(uintptr_t);
 			break;
 
 		case DT_DEBUG:
@@ -2608,8 +2608,7 @@ initlist_for_loaded_obj(Obj_Entry *obj, Obj_Entry *tail, Objlist *list)
 	STAILQ_FOREACH(tmp, &iflist, link) {
 		Obj_Entry *tobj = tmp->obj;
 
-		if ((tobj->fini != (Elf_Addr)NULL ||
-		    tobj->fini_array != (Elf_Addr)NULL) &&
+		if ((tobj->fini != 0 || tobj->fini_array != NULL) &&
 		    !tobj->on_fini_list) {
 			objlist_push_tail(&list_fini, tobj);
 			tobj->on_fini_list = true;
@@ -2686,8 +2685,7 @@ initlist_add_objects(Obj_Entry *obj, Obj_Entry *tail, Objlist *list,
 		 * Add the object to the global fini list in the
 		 * reverse order.
 		 */
-		if ((obj->fini != (Elf_Addr)NULL ||
-		    obj->fini_array != (Elf_Addr)NULL) &&
+		if ((obj->fini != 0 || obj->fini_array != NULL) &&
 		    !obj->on_fini_list) {
 			objlist_push_head(&list_fini, obj);
 			obj->on_fini_list = true;
@@ -3092,10 +3090,10 @@ obj_from_addr(const void *addr)
 static void
 preinit_main(void)
 {
-	Elf_Addr *preinit_addr;
+	uintptr_t *preinit_addr;
 	int index;
 
-	preinit_addr = (Elf_Addr *)obj_main->preinit_array;
+	preinit_addr = obj_main->preinit_array;
 	if (preinit_addr == NULL)
 		return;
 
@@ -3122,7 +3120,7 @@ objlist_call_fini(Objlist *list, Obj_Entry *root, RtldLockState *lockstate)
 {
 	Objlist_Entry *elm;
 	struct dlerror_save *saved_msg;
-	Elf_Addr *fini_addr;
+	uintptr_t *fini_addr;
 	int index;
 
 	assert(root == NULL || root->refcount == 1);
@@ -3155,7 +3153,7 @@ objlist_call_fini(Objlist *list, Obj_Entry *root, RtldLockState *lockstate)
 			 * defined. When this happens, DT_FINI_ARRAY is
 			 * processed first.
 			 */
-			fini_addr = (Elf_Addr *)elm->obj->fini_array;
+			fini_addr = elm->obj->fini_array;
 			if (fini_addr != NULL && elm->obj->fini_array_num > 0) {
 				for (index = elm->obj->fini_array_num - 1;
 				    index >= 0; index--) {
@@ -3173,7 +3171,7 @@ objlist_call_fini(Objlist *list, Obj_Entry *root, RtldLockState *lockstate)
 					}
 				}
 			}
-			if (elm->obj->fini != (Elf_Addr)NULL) {
+			if (elm->obj->fini != 0) {
 				dbg("calling fini function for %s at %p",
 				    elm->obj->path, (void *)elm->obj->fini);
 				LD_UTRACE(UTRACE_FINI_CALL, elm->obj,
@@ -3209,7 +3207,7 @@ objlist_call_init(Objlist *list, RtldLockState *lockstate)
 	Objlist_Entry *elm;
 	Obj_Entry *obj;
 	struct dlerror_save *saved_msg;
-	Elf_Addr *init_addr;
+	uintptr_t *init_addr;
 	void (*reg)(void (*)(void));
 	int index;
 
@@ -3254,14 +3252,14 @@ objlist_call_init(Objlist *list, RtldLockState *lockstate)
 		 * It is legal to have both DT_INIT and DT_INIT_ARRAY defined.
 		 * When this happens, DT_INIT is processed first.
 		 */
-		if (elm->obj->init != (Elf_Addr)NULL) {
+		if (elm->obj->init != 0) {
 			dbg("calling init function for %s at %p",
 			    elm->obj->path, (void *)elm->obj->init);
 			LD_UTRACE(UTRACE_INIT_CALL, elm->obj,
 			    (void *)elm->obj->init, 0, 0, elm->obj->path);
 			call_init_pointer(elm->obj, elm->obj->init);
 		}
-		init_addr = (Elf_Addr *)elm->obj->init_array;
+		init_addr = elm->obj->init_array;
 		if (init_addr != NULL) {
 			for (index = 0; index < elm->obj->init_array_num;
 			    index++) {
diff --git a/libexec/rtld-elf/rtld.h b/libexec/rtld-elf/rtld.h
index 023e9af9a2a8..322d1ee94d6f 100644
--- a/libexec/rtld-elf/rtld.h
+++ b/libexec/rtld-elf/rtld.h
@@ -212,11 +212,11 @@ typedef struct Struct_Obj_Entry {
     Ver_Entry *vertab;		/* Versions required /defined by this object */
     int vernum;			/* Number of entries in vertab */
 
-    Elf_Addr init;		/* Initialization function to call */
-    Elf_Addr fini;		/* Termination function to call */
-    Elf_Addr preinit_array;	/* Pre-initialization array of functions */
-    Elf_Addr init_array;	/* Initialization array of functions */
-    Elf_Addr fini_array;	/* Termination array of functions */
+    uintptr_t init;		/* Initialization function to call */
+    uintptr_t fini;		/* Termination function to call */
+    uintptr_t *preinit_array;	/* Pre-initialization array of functions */
+    uintptr_t *init_array;	/* Initialization array of functions */
+    uintptr_t *fini_array;	/* Termination array of functions */
     int preinit_array_num;	/* Number of entries in preinit_array */
     int init_array_num; 	/* Number of entries in init_array */
     int fini_array_num; 	/* Number of entries in fini_array */


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69eb8c45.35fd2.28d9e136>