From nobody Mon Dec 15 18:18:53 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 4dVSxV4sVsz6L7Tp for ; Mon, 15 Dec 2025 18:18:54 +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 4dVSxT6VXcz4LZb for ; Mon, 15 Dec 2025 18:18:53 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1765822733; 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=I8qSfllHdf/cP2vfdhGv+E7wiUqbycUX4mUGKaOymdw=; b=FvHEoePRsWBvY0qfTm1iQztJZfj0Eo7Bsb8OHZdRBtAh4TY5RE+q7n+snAMgRoX0kyxWnU OWOPuz9NMMOK83z0Bq1R1CPg7OTGfijQ+hvkAJ0yOc1W17GnlgMtZnlj8xbRiE++QVsM7Y IZGGvSWwS44SLUgeQsTZx0h3LALOFIIBOzBZgStNBp27diKRQJavL3Z/Hc3OtcBwezuFwo OifwD0nCavUraJyFOaHPhvPMfTfIk1vKWCMq8iCC2g1bo6OWN775bxlQxZVY9iyU4tVuHA JH7g2UdUCuDbRTzG6Orgw5S9FpyAZnSYY0NH71xLskqjNJNjgoHvvmzs/da0hA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1765822733; 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=I8qSfllHdf/cP2vfdhGv+E7wiUqbycUX4mUGKaOymdw=; b=Gov7pL/aj7IDVeasPVzB/PsDtDm6QWnjlQ5VGF3bRZ7uNh0x6tKTjRHIJqeEaHrJ3nIwgP Qf9X6Qo4InAvU2jEZo2hP71lBLRjDmBcDzYEyWsHVsjc50+KIcJFP2WIWfBp6t7SBHA1Nq 12pJCEU7v4in4fREZVydeEaOxW8agp3aGt6tUqZZy2lBTXOTajdqjFPJNB26ncdjGDnoZd RVWcGVULbTK73xZTW+10Cq/u06tNaHxrYXGzpAGOWtZxvDPY0TMuZBPCkJNsHTI+T0RbhP 46I9c+edBTOg1on1BDLD2xsu2RQ3i2eBHdvG5961q5N1NrnfDdkJHr11tYatfw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1765822733; a=rsa-sha256; cv=none; b=sMrDYtWiR0aNhuJxeScUEwWvUm+N7bdW1+GhpUW8gjjaqMlVefq5xQr2ECBMTlT2Z2JCfZ UfV24rYMZ4W6ac6AryCIgqGqss40aalvI049ZPRMK3A+xRbGVr1vgCdBelgPDxoi3Aaz5P kD1gpH6pC6VnjI47vHZ6s2hN+7s0VH++Qjfg3C7TUWxma7TetEx09/W50x56crJhUq+I2v /tNOrnzyGay1Lh04LwdvAQTSMti5nGxL2r5uIsoNUKOpHx1FAeJL8kNE2VqKAtVGOgSqX2 WIDYwz180upj9S+8Ripv8CejeSIoYAMl27efjwrA7irYZTNrjmpjffzG/WGEEw== 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 4dVSxT65tbzVct for ; Mon, 15 Dec 2025 18:18:53 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 24ebc by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 15 Dec 2025 18:18:53 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Jessica Clarke Subject: git: 6216ed808d1b - stable/13 - 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/13 X-Git-Reftype: branch X-Git-Commit: 6216ed808d1b0ec1921f49b5bba454f38d152a0c Auto-Submitted: auto-generated Date: Mon, 15 Dec 2025 18:18:53 +0000 Message-Id: <6940510d.24ebc.5fa078df@gitrepo.freebsd.org> The branch stable/13 has been updated by jrtc27: URL: https://cgit.FreeBSD.org/src/commit/?id=6216ed808d1b0ec1921f49b5bba454f38d152a0c commit 6216ed808d1b0ec1921f49b5bba454f38d152a0c Author: Jessica Clarke AuthorDate: 2025-05-06 22:14:51 +0000 Commit: Jessica Clarke CommitDate: 2025-12-15 17:56:36 +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 eaf96fb80925..830974d22f9e 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 980f5c89edb7..9725dcdd805f 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -777,7 +777,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(); @@ -2891,7 +2891,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 306c460f286d..54015b5122f7 100644 --- a/libexec/rtld-elf/rtld.h +++ b/libexec/rtld-elf/rtld.h @@ -368,7 +368,7 @@ typedef struct Struct_SymLook { 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 *);