From nobody Fri Apr 24 15:29:09 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4g2H1d3YW8z6bSGK for ; Fri, 24 Apr 2026 15:29:09 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4g2H1d0vZ0z3D6C for ; Fri, 24 Apr 2026 15:29:09 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777044549; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=w1Sd8nH6ZGI/TdR89eitKI/EOFITL0Pmf3j99tkEeng=; b=hIR1nV48MLkwBpEbjVEMDMZj0wlrA/BCe9ULhT/Bw9TUSzMeEFGQHq++DpdifQ6yzWWbwN bpZxlgv3Szj6f+PGJj1h+dd7GUoSizm5HYTYysLADiESQsOWAu4NN8J/GEm/KqBxIHq1Co LDdBsKe5O4YRFznMalZKsBh1fxbRkdfcQanxq7XgYyNk3JmbPIqPljF23jIokiKMFhw4sr p2AWZINPvNYlnrnR9LoGfHD4b5rXgFO9wvr+gI1koY8xwvq03zLqT7zijGZBRTIBDc37F7 itJws99uFUl7FT1ApNt2Ybyyu8KdYQPAdj4NPaaAcD40KMT91sJSdvdVnmljJg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1777044549; a=rsa-sha256; cv=none; b=qQKZc8NfbKu8zEKg6iWwslxZj04oDs3m5vocIBTLBAQAMZMrZhTJ8tc/wsWD0oGC1raLRc 8zsITfogHdkiqutd5yZcc8sBs0XowC05hAw5bMsz3uAYX1N8lpLORJS2jtRJ08EdCmQoQr O2M/DwXnMyySb6vd4jpMC0lqNRywXqFo8nnftFJvqKh5VJ0iM2ZQl6ZqsnbjvgmWL94CV9 FzvPxEMJX6k6ZqxxL6Ge4yB4s90le+G8PfQuTUZjjGwuQUD0UB7qjhj+3+R3xJrUW4gYFz PrFj9U8nZ7YGl0hJpWNhLlUzweoeKO7jQ5E/bhlQTELLU8nLAw4qZaEUWtwIxw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777044549; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=w1Sd8nH6ZGI/TdR89eitKI/EOFITL0Pmf3j99tkEeng=; b=LOmWhXdb7Rv81VumxxHTH3NJv9tYCOkrap2JiuQx8TyrDJuq0Ik+F40nLr8qhRMx5dem2Y o8opUI1mLptG2MtCanINkBMRz3J22YXuYKnEzrtVrwk/B9RYgNpnCU61wvPTSydD4QsRbt K2JTC0BAvh7LYeSQdAkQV5Ttl0IvsCfTT8stnEAKLfLIhyHqSKic5oVsKR7dGoaKSqaBEw P3ePQHiSLCvWEEyQRxzelkbm0rhd55KChRIBVvxBaWz6hHzuNOxOQlxHg1bjNa928AiWBn CxBA+Jfr9xlbQr6oM7uJQbfoRB5Ndf1NT7m+DHnhCrClTfs7rJo9gczqIQuWZw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4g2H1d0Vl3z17Bb for ; Fri, 24 Apr 2026 15:29:09 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 35fd2 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Fri, 24 Apr 2026 15:29:09 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: John Baldwin Subject: git: 3c01c7df9840 - stable/15 - rtld: Use uintptr_t instead of Elf_Addr for init/fini function pointers List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: 3c01c7df984019d3db1b7a1d5e4d61d8c366df28 Auto-Submitted: auto-generated Date: Fri, 24 Apr 2026 15:29:09 +0000 Message-Id: <69eb8c45.35fd2.28d9e136@gitrepo.freebsd.org> The branch stable/15 has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=3c01c7df984019d3db1b7a1d5e4d61d8c366df28 commit 3c01c7df984019d3db1b7a1d5e4d61d8c366df28 Author: John Baldwin AuthorDate: 2026-01-14 17:10:33 +0000 Commit: John Baldwin 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 */