From nobody Mon Dec 15 17:00:26 2025 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 4dVRBz2Yvfz6L1pY for ; Mon, 15 Dec 2025 17:00:27 +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 "R12" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4dVRBy415tz3pmC for ; Mon, 15 Dec 2025 17:00:26 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1765818026; 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=X+Fjh74HDuuviWf/KzVGTbZIDJGHgg9xwMxOgSdDmXU=; b=HED0RuQRBMfPEkusJyPfHuYSQL0Q1uGx3+QjfeG+he+UpnKtKJOW29Okg1rudB/RAu3qkM YaRLRZCO1HiyM1JKBItJHDSFZYTeauaB138Bm5Pa1z0+1Ao8AGbqTdRNgpL5UI6ugqSClT niBqlL9IELV2haLmKf7bbH6W2wEHV3Ls8YvhVMBCd4lmJI4IkOsKtzWOFHo/MekFuWubYU kpmRnOYkv9XCV1IN7GFYa+Wf7ohbvRHKsfOnx24odm4mofrw2aI1HlzrOeNObSgiPHkcfG e4UcW0AA0PJvo9gLrEZQ75+sAfGlxmIFdQm9p1rb4IpfgxqgydPGtidx/R7M7g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1765818026; 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=X+Fjh74HDuuviWf/KzVGTbZIDJGHgg9xwMxOgSdDmXU=; b=C4h8sYR8JV8URC2wrxfVsfWCzOcRAx+KY5hGo+0akSzYg2H2edMBSpd0uTJBPbqajVOZJz xsf/jHd+kOhK5I7p2GwuCF26mS13A4/Hb9VSDl1KWhiTTC+zUA3DwdVkJpaYwcsuTt57g/ rvfMvwQzQqXYo5tDFOyBD/keRnoXVsPmx4gMQXq54de/EigUH0lv7oxtkcgyqxcnArYZVE 6iD6ZAfzpqLwdwDk1836XvfNHJeHKUPPMxpBSIB8jWx7Fvpr02VMGSLvfQlG24fFIaeT93 cfyTs5i76faE0AlJCST3QknHiBO6Y938Chk9ogfajnMzQuzIuW/gWFRivm7ieA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1765818026; a=rsa-sha256; cv=none; b=JjahEah8YaWm6Bs0wC13o9kH5aepL2zU5f61jNcThusz/11IM32sb6cSIDT4dB3JfY69dE vRb/hjHy+x5H7DRLbSV0JluUIAzqYfhikmPLMAPxmJu13IxLpGBX9r18wsYPK4k4QkYNMR NbncXra64vPD0VBaH9QYmu4z2v9Yai8nRjOkqsHNsK2ATifjK25cpUey/dwkhU726qt2vc 13ElqZzqwt60BYSA/nJsyAOrdGGs1i1YeaaPne94G9nYTka77KwET2iu3+f7Wnf0Rm8gNR el9YxTNb3K5vNn2/AcGehAdH1Q7gnYgI9ymqHfbOTKQSOdIoNYdZ5LLveyyTMw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4dVRBy3TwszClN for ; Mon, 15 Dec 2025 17:00:26 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id e4d6 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 15 Dec 2025 17:00:26 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Jessica Clarke Subject: git: 8e8ae9ac48cc - stable/14 - rtld-elf: Fix executable's TLS module index for direct exec 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: jrtc27 X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 8e8ae9ac48cc59615dd83d2b5fe1368036ff8808 Auto-Submitted: auto-generated Date: Mon, 15 Dec 2025 17:00:26 +0000 Message-Id: <69403eaa.e4d6.12a41f65@gitrepo.freebsd.org> The branch stable/14 has been updated by jrtc27: URL: https://cgit.FreeBSD.org/src/commit/?id=8e8ae9ac48cc59615dd83d2b5fe1368036ff8808 commit 8e8ae9ac48cc59615dd83d2b5fe1368036ff8808 Author: Jessica Clarke AuthorDate: 2025-05-06 22:14:51 +0000 Commit: Jessica Clarke CommitDate: 2025-12-15 16:58:44 +0000 rtld-elf: Fix executable's TLS module index for direct exec For direct exec mode we reuse map_object, but tls_max_index is initialised to 1. As a result, the executable ends up being assigned module 2 (and the generation is pointlessly incremented, unlike in digest_phdr for the normal case). For most architectures this is harmless, since TLS linker relaxation will optimise General Dynamic accesses to Initial Exec or Local Exec for executables, but on RISC-V this relaxation does not exist, yet the linker will initialise the tls_index in the GOT with module 1, and at run time the call to __tls_get_addr will fail with: ld-elf.so.1: Can't find module with TLS index 1 Fix this by making map_object use 1 for obj->tlsindex when it's loading the main executable, and don't bother to increment tls_dtv_generation either, matching digest_phdr (though that one is harmless). (Note this also applies to MIPS on stable/13) Reviewed by: kib Fixes: 0fc65b0ab82c ("Make ld-elf.so.1 directly executable.") MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D50186 (cherry picked from commit a08d92def20a41243d4afc97cf4a2124be5386b9) --- libexec/rtld-elf/map_object.c | 10 +++++++--- libexec/rtld-elf/rtld.c | 4 ++-- libexec/rtld-elf/rtld.h | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/libexec/rtld-elf/map_object.c b/libexec/rtld-elf/map_object.c index 06be8c02137e..d8583cb67e5a 100644 --- a/libexec/rtld-elf/map_object.c +++ b/libexec/rtld-elf/map_object.c @@ -60,7 +60,7 @@ phdr_in_zero_page(const Elf_Ehdr *hdr) * for the shared object. Returns NULL on failure. */ Obj_Entry * -map_object(int fd, const char *path, const struct stat *sb) +map_object(int fd, const char *path, const struct stat *sb, bool ismain) { Obj_Entry *obj; Elf_Ehdr *hdr; @@ -314,8 +314,12 @@ map_object(int fd, const char *path, const struct stat *sb) if (phinterp != NULL) obj->interp = (const char *)(obj->relocbase + phinterp->p_vaddr); if (phtls != NULL) { - tls_dtv_generation++; - obj->tlsindex = ++tls_max_index; + if (ismain) + obj->tlsindex = 1; + else { + tls_dtv_generation++; + obj->tlsindex = ++tls_max_index; + } obj->tlssize = phtls->p_memsz; obj->tlsalign = phtls->p_align; obj->tlspoffset = phtls->p_offset; diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c index 1a5cb0a6fce9..a7fdc153eca8 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -765,7 +765,7 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp) */ if (fd != -1) { /* Load the main program. */ dbg("loading main program"); - obj_main = map_object(fd, argv0, NULL); + obj_main = map_object(fd, argv0, NULL, true); close(fd); if (obj_main == NULL) rtld_die(); @@ -2897,7 +2897,7 @@ do_load_object(int fd, const char *name, char *path, struct stat *sbp, } dbg("loading \"%s\"", printable_path(path)); - obj = map_object(fd, printable_path(path), sbp); + obj = map_object(fd, printable_path(path), sbp, false); if (obj == NULL) return (NULL); diff --git a/libexec/rtld-elf/rtld.h b/libexec/rtld-elf/rtld.h index 527ecf9d84e7..b51bbb427a79 100644 --- a/libexec/rtld-elf/rtld.h +++ b/libexec/rtld-elf/rtld.h @@ -390,7 +390,7 @@ enum { void _rtld_error(const char *, ...) __printflike(1, 2) __exported; void rtld_die(void) __dead2; const char *rtld_strerror(int); -Obj_Entry *map_object(int, const char *, const struct stat *); +Obj_Entry *map_object(int, const char *, const struct stat *, bool); void *xcalloc(size_t, size_t); void *xmalloc(size_t); char *xstrdup(const char *);