Module Name: src Committed By: joerg Date: Sun Jun 4 01:24:58 UTC 2023
Modified Files: src/libexec/ld.elf_so: README.TLS map_object.c rtld.h tls.c src/libexec/ld.elf_so/arch/aarch64: mdreloc.c src/libexec/ld.elf_so/arch/alpha: alpha_reloc.c src/libexec/ld.elf_so/arch/arm: mdreloc.c src/libexec/ld.elf_so/arch/hppa: hppa_reloc.c src/libexec/ld.elf_so/arch/i386: mdreloc.c src/libexec/ld.elf_so/arch/m68k: mdreloc.c src/libexec/ld.elf_so/arch/mips: mips_reloc.c src/libexec/ld.elf_so/arch/or1k: mdreloc.c src/libexec/ld.elf_so/arch/powerpc: ppc_reloc.c src/libexec/ld.elf_so/arch/riscv: mdreloc.c src/libexec/ld.elf_so/arch/sh3: mdreloc.c src/libexec/ld.elf_so/arch/sparc: mdreloc.c src/libexec/ld.elf_so/arch/sparc64: mdreloc.c src/libexec/ld.elf_so/arch/x86_64: mdreloc.c src/tests/libexec/ld.elf_so: t_tls_extern.c Log Message: Fix interactions of initial-exec TLS model and dlopen (1) If an initial-exec relocation was used for a non-local symbol (i.e. the definition of the symbol is in a different DSO), the computation of the static TLS offset used the wrong DSO. This would effectively mean the wrong address was computed (PR toolchain/50277, PR pkg/57445). Fix this by forcing the computation of the correct DSO (the one defining the symbol). This code uses __UNCONST to avoid the vast interface changes for this special case. (2) If symbols from a DSO loaded via dlopen are used with both global-dynamic/local-dynamic and initial-exec relocations AND a initial-exec relocation was resolved first in a thread, a split brain situation could exist where the dynamic relocations would use one memory block (separate allocation) and the initial-exec relocations the static per-thread TLS space. (3) If the initial-exec relocation in (2) is seen after any thread has already used a GD/LD allocation, bail out. Since IE relocations are used only in the GOT, this will prevent the dlopen. This is a bit more aggressive than necessary, but a full blown reference counting doesn't seem to be justified. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/libexec/ld.elf_so/README.TLS cvs rdiff -u -r1.66 -r1.67 src/libexec/ld.elf_so/map_object.c cvs rdiff -u -r1.145 -r1.146 src/libexec/ld.elf_so/rtld.h cvs rdiff -u -r1.17 -r1.18 src/libexec/ld.elf_so/tls.c cvs rdiff -u -r1.17 -r1.18 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c cvs rdiff -u -r1.43 -r1.44 src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c cvs rdiff -u -r1.45 -r1.46 src/libexec/ld.elf_so/arch/arm/mdreloc.c cvs rdiff -u -r1.49 -r1.50 src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c cvs rdiff -u -r1.41 -r1.42 src/libexec/ld.elf_so/arch/i386/mdreloc.c cvs rdiff -u -r1.33 -r1.34 src/libexec/ld.elf_so/arch/m68k/mdreloc.c cvs rdiff -u -r1.74 -r1.75 src/libexec/ld.elf_so/arch/mips/mips_reloc.c cvs rdiff -u -r1.3 -r1.4 src/libexec/ld.elf_so/arch/or1k/mdreloc.c cvs rdiff -u -r1.62 -r1.63 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c cvs rdiff -u -r1.8 -r1.9 src/libexec/ld.elf_so/arch/riscv/mdreloc.c cvs rdiff -u -r1.35 -r1.36 src/libexec/ld.elf_so/arch/sh3/mdreloc.c cvs rdiff -u -r1.56 -r1.57 src/libexec/ld.elf_so/arch/sparc/mdreloc.c cvs rdiff -u -r1.69 -r1.70 src/libexec/ld.elf_so/arch/sparc64/mdreloc.c cvs rdiff -u -r1.47 -r1.48 src/libexec/ld.elf_so/arch/x86_64/mdreloc.c cvs rdiff -u -r1.11 -r1.12 src/tests/libexec/ld.elf_so/t_tls_extern.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/libexec/ld.elf_so/README.TLS diff -u src/libexec/ld.elf_so/README.TLS:1.5 src/libexec/ld.elf_so/README.TLS:1.6 --- src/libexec/ld.elf_so/README.TLS:1.5 Sat Dec 1 13:01:57 2018 +++ src/libexec/ld.elf_so/README.TLS Sun Jun 4 01:24:56 2023 @@ -43,9 +43,10 @@ This is normally def->st_value + rela->r (c) R_TYPE(TLS_TPOFF): Static TLS offset. The code has to check whether the static TLS offset for this module has been allocated -(defobj->tls_done) and otherwise call _rtld_tls_offset_allocate(). This +(defobj->tls_static) and otherwise call _rtld_tls_offset_allocate(). This may fail if no static space is available and the object has been pulled -in via dlopen(3). +in via dlopen(3). It can also fail if the TLS area has already been used +via a global-dynamic allocation. For TLS Variant I, this is typically: Index: src/libexec/ld.elf_so/map_object.c diff -u src/libexec/ld.elf_so/map_object.c:1.66 src/libexec/ld.elf_so/map_object.c:1.67 --- src/libexec/ld.elf_so/map_object.c:1.66 Wed May 31 18:44:39 2023 +++ src/libexec/ld.elf_so/map_object.c Sun Jun 4 01:24:56 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: map_object.c,v 1.66 2023/05/31 18:44:39 riastradh Exp $ */ +/* $NetBSD: map_object.c,v 1.67 2023/06/04 01:24:56 joerg Exp $ */ /* * Copyright 1996 John D. Polstra. @@ -34,7 +34,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: map_object.c,v 1.66 2023/05/31 18:44:39 riastradh Exp $"); +__RCSID("$NetBSD: map_object.c,v 1.67 2023/06/04 01:24:56 joerg Exp $"); #endif /* not lint */ #include <errno.h> @@ -490,7 +490,7 @@ _rtld_obj_free(Obj_Entry *obj) Name_Entry *entry; #if defined(__HAVE_TLS_VARIANT_I) || defined(__HAVE_TLS_VARIANT_II) - if (obj->tls_done) + if (obj->tls_static) _rtld_tls_offset_free(obj); #endif xfree(obj->path); Index: src/libexec/ld.elf_so/rtld.h diff -u src/libexec/ld.elf_so/rtld.h:1.145 src/libexec/ld.elf_so/rtld.h:1.146 --- src/libexec/ld.elf_so/rtld.h:1.145 Tue Apr 18 16:48:45 2023 +++ src/libexec/ld.elf_so/rtld.h Sun Jun 4 01:24:56 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: rtld.h,v 1.145 2023/04/18 16:48:45 christos Exp $ */ +/* $NetBSD: rtld.h,v 1.146 2023/06/04 01:24:56 joerg Exp $ */ /* * Copyright 1996 John D. Polstra. @@ -219,7 +219,9 @@ typedef struct Struct_Obj_Entry { phdr_loaded:1, /* Phdr is loaded and doesn't need to * be freed. */ #if defined(__HAVE_TLS_VARIANT_I) || defined(__HAVE_TLS_VARIANT_II) - tls_done:1, /* True if static TLS offset + tls_static:1, /* True if static TLS offset + * has been allocated */ + tls_dynamic:1, /* True if any non-static DTV entry * has been allocated */ #endif ref_nodel:1, /* Refcount increased to prevent dlclose */ @@ -483,7 +485,6 @@ _rtld_fetch_ventry(const Obj_Entry *obj, /* tls.c */ void *_rtld_tls_get_addr(void *, size_t, size_t); void _rtld_tls_initial_allocation(void); -void *_rtld_tls_module_allocate(size_t index); int _rtld_tls_offset_allocate(Obj_Entry *); void _rtld_tls_offset_free(Obj_Entry *); Index: src/libexec/ld.elf_so/tls.c diff -u src/libexec/ld.elf_so/tls.c:1.17 src/libexec/ld.elf_so/tls.c:1.18 --- src/libexec/ld.elf_so/tls.c:1.17 Thu Jun 1 08:20:10 2023 +++ src/libexec/ld.elf_so/tls.c Sun Jun 4 01:24:56 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: tls.c,v 1.17 2023/06/01 08:20:10 riastradh Exp $ */ +/* $NetBSD: tls.c,v 1.18 2023/06/04 01:24:56 joerg Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. * All rights reserved. @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: tls.c,v 1.17 2023/06/01 08:20:10 riastradh Exp $"); +__RCSID("$NetBSD: tls.c,v 1.18 2023/06/04 01:24:56 joerg Exp $"); #include <sys/param.h> #include <sys/ucontext.h> @@ -43,6 +43,7 @@ __RCSID("$NetBSD: tls.c,v 1.17 2023/06/0 #if defined(__HAVE_TLS_VARIANT_I) || defined(__HAVE_TLS_VARIANT_II) static struct tls_tcb *_rtld_tls_allocate_locked(void); +static void *_rtld_tls_module_allocate(struct tls_tcb *, size_t); #ifndef TLS_DTV_OFFSET #define TLS_DTV_OFFSET 0 @@ -84,7 +85,7 @@ _rtld_tls_get_addr(void *tls, size_t idx } if (__predict_false(dtv[idx] == NULL)) - dtv[idx] = _rtld_tls_module_allocate(idx); + dtv[idx] = _rtld_tls_module_allocate(tcb, idx); _rtld_exclusive_exit(&mask); @@ -136,7 +137,7 @@ _rtld_tls_allocate_locked(void) SET_DTV_GENERATION(tcb->tcb_dtv, _rtld_tls_dtv_generation); for (obj = _rtld_objlist; obj != NULL; obj = obj->next) { - if (obj->tls_done) { + if (obj->tls_static) { #ifdef __HAVE_TLS_VARIANT_I q = p + obj->tlsoffset; #else @@ -195,8 +196,8 @@ _rtld_tls_free(struct tls_tcb *tcb) _rtld_exclusive_exit(&mask); } -void * -_rtld_tls_module_allocate(size_t idx) +static void * +_rtld_tls_module_allocate(struct tls_tcb *tcb, size_t idx) { Obj_Entry *obj; uint8_t *p; @@ -209,11 +210,21 @@ _rtld_tls_module_allocate(size_t idx) _rtld_error("Module for TLS index %zu missing", idx); _rtld_die(); } + if (obj->tls_static) { +#ifdef __HAVE_TLS_VARIANT_I + p = (uint8_t *)tcb + obj->tlsoffset; +#else + p = (uint8_t *)tcb - obj->tlsoffset; +#endif + return p; + } p = xmalloc(obj->tlssize); memcpy(p, obj->tlsinit, obj->tlsinitsize); memset(p + obj->tlsinitsize, 0, obj->tlssize - obj->tlsinitsize); + obj->tls_dynamic = 1; + return p; } @@ -222,11 +233,14 @@ _rtld_tls_offset_allocate(Obj_Entry *obj { size_t offset, next_offset; - if (obj->tls_done) + if (obj->tls_dynamic) + return -1; + + if (obj->tls_static) return 0; if (obj->tlssize == 0) { obj->tlsoffset = 0; - obj->tls_done = 1; + obj->tls_static = 1; return 0; } @@ -265,7 +279,7 @@ _rtld_tls_offset_allocate(Obj_Entry *obj dbg(("%s: static tls offset 0x%zx size %zu\n", obj->path, obj->tlsoffset, obj->tlssize)); _rtld_tls_static_offset = next_offset; - obj->tls_done = 1; + obj->tls_static = 1; return 0; } @@ -277,7 +291,7 @@ _rtld_tls_offset_free(Obj_Entry *obj) /* * XXX See above. */ - obj->tls_done = 0; + obj->tls_static = 0; return; } Index: src/libexec/ld.elf_so/arch/aarch64/mdreloc.c diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.17 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.18 --- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.17 Sat Dec 3 09:10:40 2022 +++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Sun Jun 4 01:24:56 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.17 2022/12/03 09:10:40 skrll Exp $ */ +/* $NetBSD: mdreloc.c,v 1.18 2023/06/04 01:24:56 joerg Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -60,7 +60,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.17 2022/12/03 09:10:40 skrll Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.18 2023/06/04 01:24:56 joerg Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -157,7 +157,7 @@ _rtld_tlsdesc_fill(const Obj_Entry *obj, } offs += rela->r_addend; - if (defobj->tls_done) { + if (defobj->tls_static) { /* Variable is in initially allocated TLS segment */ where[0] = (Elf_Addr)_rtld_tlsdesc_static; where[1] = defobj->tlsoffset + offs + @@ -299,8 +299,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry break; case R_TLS_TYPE(TLS_TPREL): - if (!defobj->tls_done && - _rtld_tls_offset_allocate(obj)) + if (!defobj->tls_static && + _rtld_tls_offset_allocate(__UNCONST(defobj))) return -1; *where = (Elf_Addr)(def->st_value + defobj->tlsoffset + Index: src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c diff -u src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c:1.43 src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c:1.44 --- src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c:1.43 Thu Aug 10 19:03:26 2017 +++ src/libexec/ld.elf_so/arch/alpha/alpha_reloc.c Sun Jun 4 01:24:57 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: alpha_reloc.c,v 1.43 2017/08/10 19:03:26 joerg Exp $ */ +/* $NetBSD: alpha_reloc.c,v 1.44 2023/06/04 01:24:57 joerg Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -62,7 +62,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: alpha_reloc.c,v 1.43 2017/08/10 19:03:26 joerg Exp $"); +__RCSID("$NetBSD: alpha_reloc.c,v 1.44 2023/06/04 01:24:57 joerg Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -280,8 +280,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry break; case R_TYPE(TPREL64): - if (!defobj->tls_done && - _rtld_tls_offset_allocate(obj)) + if (!defobj->tls_static && + _rtld_tls_offset_allocate(__UNCONST(defobj))) return -1; tmp = (Elf64_Addr)(def->st_value + Index: src/libexec/ld.elf_so/arch/arm/mdreloc.c diff -u src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.45 src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.46 --- src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.45 Tue Jun 16 21:02:20 2020 +++ src/libexec/ld.elf_so/arch/arm/mdreloc.c Sun Jun 4 01:24:57 2023 @@ -1,8 +1,8 @@ -/* $NetBSD: mdreloc.c,v 1.45 2020/06/16 21:02:20 joerg Exp $ */ +/* $NetBSD: mdreloc.c,v 1.46 2023/06/04 01:24:57 joerg Exp $ */ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.45 2020/06/16 21:02:20 joerg Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.46 2023/06/04 01:24:57 joerg Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -228,8 +228,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry break; case R_TYPE(TLS_TPOFF32): - if (!defobj->tls_done && - _rtld_tls_offset_allocate(obj)) + if (!defobj->tls_static && + _rtld_tls_offset_allocate(__UNCONST(defobj))) return -1; if (__predict_true(RELOC_ALIGNED_P(where))) Index: src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c diff -u src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c:1.49 src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c:1.50 --- src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c:1.49 Mon May 30 17:06:34 2022 +++ src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c Sun Jun 4 01:24:57 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: hppa_reloc.c,v 1.49 2022/05/30 17:06:34 skrll Exp $ */ +/* $NetBSD: hppa_reloc.c,v 1.50 2023/06/04 01:24:57 joerg Exp $ */ /*- * Copyright (c) 2002, 2004 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: hppa_reloc.c,v 1.49 2022/05/30 17:06:34 skrll Exp $"); +__RCSID("$NetBSD: hppa_reloc.c,v 1.50 2023/06/04 01:24:57 joerg Exp $"); #endif /* not lint */ #include <stdlib.h> @@ -553,7 +553,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry break; case R_TYPE(TLS_TPREL32): - if (!defobj->tls_done && _rtld_tls_offset_allocate(obj)) + if (!defobj->tls_static && + _rtld_tls_offset_allocate(__UNCONST(defobj))) return -1; *where = (Elf_Addr)(defobj->tlsoffset + def->st_value + Index: src/libexec/ld.elf_so/arch/i386/mdreloc.c diff -u src/libexec/ld.elf_so/arch/i386/mdreloc.c:1.41 src/libexec/ld.elf_so/arch/i386/mdreloc.c:1.42 --- src/libexec/ld.elf_so/arch/i386/mdreloc.c:1.41 Tue Apr 3 21:10:27 2018 +++ src/libexec/ld.elf_so/arch/i386/mdreloc.c Sun Jun 4 01:24:57 2023 @@ -1,8 +1,8 @@ -/* $NetBSD: mdreloc.c,v 1.41 2018/04/03 21:10:27 joerg Exp $ */ +/* $NetBSD: mdreloc.c,v 1.42 2023/06/04 01:24:57 joerg Exp $ */ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.41 2018/04/03 21:10:27 joerg Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.42 2023/06/04 01:24:57 joerg Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -147,8 +147,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry break; case R_TYPE(TLS_TPOFF): - if (!defobj->tls_done && - _rtld_tls_offset_allocate(obj)) + if (!defobj->tls_static && + _rtld_tls_offset_allocate(__UNCONST(defobj))) return -1; *where += (Elf_Addr)(def->st_value - defobj->tlsoffset); @@ -159,8 +159,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry break; case R_TYPE(TLS_TPOFF32): - if (!defobj->tls_done && - _rtld_tls_offset_allocate(obj)) + if (!defobj->tls_static && + _rtld_tls_offset_allocate(__UNCONST(defobj))) return -1; *where += (Elf_Addr)(defobj->tlsoffset - def->st_value); Index: src/libexec/ld.elf_so/arch/m68k/mdreloc.c diff -u src/libexec/ld.elf_so/arch/m68k/mdreloc.c:1.33 src/libexec/ld.elf_so/arch/m68k/mdreloc.c:1.34 --- src/libexec/ld.elf_so/arch/m68k/mdreloc.c:1.33 Thu Aug 10 19:03:26 2017 +++ src/libexec/ld.elf_so/arch/m68k/mdreloc.c Sun Jun 4 01:24:57 2023 @@ -1,8 +1,8 @@ -/* $NetBSD: mdreloc.c,v 1.33 2017/08/10 19:03:26 joerg Exp $ */ +/* $NetBSD: mdreloc.c,v 1.34 2023/06/04 01:24:57 joerg Exp $ */ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.33 2017/08/10 19:03:26 joerg Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.34 2023/06/04 01:24:57 joerg Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -142,9 +142,6 @@ _rtld_relocate_nonplt_objects(Obj_Entry break; case R_TYPE(TLS_DTPREL32): - if (!defobj->tls_done && _rtld_tls_offset_allocate(obj)) - return -1; - *where = (Elf_Addr)(def->st_value + rela->r_addend - TLS_DTV_OFFSET); rdbg(("DTPREL32 %s in %s --> %p in %s", @@ -153,7 +150,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry break; case R_TYPE(TLS_TPREL32): - if (!defobj->tls_done && _rtld_tls_offset_allocate(obj)) + if (!defobj->tls_static && + _rtld_tls_offset_allocate(__UNCONST(defobj))) return -1; *where = (Elf_Addr)(def->st_value + rela->r_addend Index: src/libexec/ld.elf_so/arch/mips/mips_reloc.c diff -u src/libexec/ld.elf_so/arch/mips/mips_reloc.c:1.74 src/libexec/ld.elf_so/arch/mips/mips_reloc.c:1.75 --- src/libexec/ld.elf_so/arch/mips/mips_reloc.c:1.74 Sat Mar 6 20:11:08 2021 +++ src/libexec/ld.elf_so/arch/mips/mips_reloc.c Sun Jun 4 01:24:57 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: mips_reloc.c,v 1.74 2021/03/06 20:11:08 christos Exp $ */ +/* $NetBSD: mips_reloc.c,v 1.75 2023/06/04 01:24:57 joerg Exp $ */ /* * Copyright 1997 Michael L. Hitch <mhi...@montana.edu> @@ -30,7 +30,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: mips_reloc.c,v 1.74 2021/03/06 20:11:08 christos Exp $"); +__RCSID("$NetBSD: mips_reloc.c,v 1.75 2023/06/04 01:24:57 joerg Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -429,9 +429,6 @@ _rtld_relocate_nonplt_objects(Obj_Entry Elf_Addr old = load_ptr(where, ELFSIZE / 8); Elf_Addr val = old; - if (!defobj->tls_done && _rtld_tls_offset_allocate(obj)) - return -1; - val += (Elf_Addr)def->st_value - TLS_DTV_OFFSET; store_ptr(where, val, ELFSIZE / 8); @@ -450,7 +447,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry Elf_Addr old = load_ptr(where, ELFSIZE / 8); Elf_Addr val = old; - if (!defobj->tls_done && _rtld_tls_offset_allocate(obj)) + if (!defobj->tls_static && + _rtld_tls_offset_allocate(__UNCONST(defobj))) return -1; val += (Elf_Addr)(def->st_value + defobj->tlsoffset Index: src/libexec/ld.elf_so/arch/or1k/mdreloc.c diff -u src/libexec/ld.elf_so/arch/or1k/mdreloc.c:1.3 src/libexec/ld.elf_so/arch/or1k/mdreloc.c:1.4 --- src/libexec/ld.elf_so/arch/or1k/mdreloc.c:1.3 Thu Aug 10 19:03:26 2017 +++ src/libexec/ld.elf_so/arch/or1k/mdreloc.c Sun Jun 4 01:24:57 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.3 2017/08/10 19:03:26 joerg Exp $ */ +/* $NetBSD: mdreloc.c,v 1.4 2023/06/04 01:24:57 joerg Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.3 2017/08/10 19:03:26 joerg Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.4 2023/06/04 01:24:57 joerg Exp $"); #endif /* not lint */ #include <stdarg.h> @@ -171,9 +171,6 @@ _rtld_relocate_nonplt_objects(Obj_Entry break; case R_TYPE(TLS_DTPOFF): - if (!defobj->tls_done && _rtld_tls_offset_allocate(obj)) - return -1; - *where = (Elf_Addr)(def->st_value + rela->r_addend - TLS_DTV_OFFSET); rdbg(("DTPOFF %s in %s --> %p in %s", @@ -182,7 +179,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry break; case R_TYPE(TLS_TPOFF): - if (!defobj->tls_done && _rtld_tls_offset_allocate(obj)) + if (!defobj->tls_static && + _rtld_tls_offset_allocate(__UNCONST(defobj))) return -1; *where = (Elf_Addr)(def->st_value + rela->r_addend Index: src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c diff -u src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.62 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.63 --- src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.62 Wed Jul 6 17:35:20 2022 +++ src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c Sun Jun 4 01:24:57 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: ppc_reloc.c,v 1.62 2022/07/06 17:35:20 martin Exp $ */ +/* $NetBSD: ppc_reloc.c,v 1.63 2023/06/04 01:24:57 joerg Exp $ */ /*- * Copyright (C) 1998 Tsubai Masanari @@ -30,7 +30,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: ppc_reloc.c,v 1.62 2022/07/06 17:35:20 martin Exp $"); +__RCSID("$NetBSD: ppc_reloc.c,v 1.63 2023/06/04 01:24:57 joerg Exp $"); #endif /* not lint */ #include <stdarg.h> @@ -321,7 +321,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry break; case R_TYPE(TPREL): - if (!defobj->tls_done && _rtld_tls_offset_allocate(obj)) + if (!defobj->tls_static && + _rtld_tls_offset_allocate(__UNCONST(defobj))) return -1; *where = (Elf_Addr)(def->st_value + rela->r_addend Index: src/libexec/ld.elf_so/arch/riscv/mdreloc.c diff -u src/libexec/ld.elf_so/arch/riscv/mdreloc.c:1.8 src/libexec/ld.elf_so/arch/riscv/mdreloc.c:1.9 --- src/libexec/ld.elf_so/arch/riscv/mdreloc.c:1.8 Sun May 7 12:41:48 2023 +++ src/libexec/ld.elf_so/arch/riscv/mdreloc.c Sun Jun 4 01:24:58 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.8 2023/05/07 12:41:48 skrll Exp $ */ +/* $NetBSD: mdreloc.c,v 1.9 2023/06/04 01:24:58 joerg Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.8 2023/05/07 12:41:48 skrll Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.9 2023/06/04 01:24:58 joerg Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -203,8 +203,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry } case R_TYPESZ(TLS_TPREL): - if (!defobj->tls_done && - _rtld_tls_offset_allocate(obj)) + if (!defobj->tls_static && + _rtld_tls_offset_allocate(__UNCONST(defobj))) return -1; *where = (Elf_Addr)(def->st_value + defobj->tlsoffset + Index: src/libexec/ld.elf_so/arch/sh3/mdreloc.c diff -u src/libexec/ld.elf_so/arch/sh3/mdreloc.c:1.35 src/libexec/ld.elf_so/arch/sh3/mdreloc.c:1.36 --- src/libexec/ld.elf_so/arch/sh3/mdreloc.c:1.35 Thu Aug 10 19:03:26 2017 +++ src/libexec/ld.elf_so/arch/sh3/mdreloc.c Sun Jun 4 01:24:58 2023 @@ -1,8 +1,8 @@ -/* $NetBSD: mdreloc.c,v 1.35 2017/08/10 19:03:26 joerg Exp $ */ +/* $NetBSD: mdreloc.c,v 1.36 2023/06/04 01:24:58 joerg Exp $ */ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.35 2017/08/10 19:03:26 joerg Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.36 2023/06/04 01:24:58 joerg Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -173,8 +173,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry break; case R_TYPE(TLS_TPOFF32): - if (!defobj->tls_done && - _rtld_tls_offset_allocate(obj)) + if (!defobj->tls_static && + _rtld_tls_offset_allocate(__UNCONST(defobj))) return -1; *where = (Elf_Addr)def->st_value + Index: src/libexec/ld.elf_so/arch/sparc/mdreloc.c diff -u src/libexec/ld.elf_so/arch/sparc/mdreloc.c:1.56 src/libexec/ld.elf_so/arch/sparc/mdreloc.c:1.57 --- src/libexec/ld.elf_so/arch/sparc/mdreloc.c:1.56 Fri Jun 2 08:51:46 2023 +++ src/libexec/ld.elf_so/arch/sparc/mdreloc.c Sun Jun 4 01:24:58 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.56 2023/06/02 08:51:46 andvar Exp $ */ +/* $NetBSD: mdreloc.c,v 1.57 2023/06/04 01:24:58 joerg Exp $ */ /*- * Copyright (c) 1999, 2002 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.56 2023/06/02 08:51:46 andvar Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.57 2023/06/04 01:24:58 joerg Exp $"); #endif /* not lint */ #include <machine/elf_support.h> @@ -282,9 +282,9 @@ _rtld_relocate_nonplt_objects(Obj_Entry break; case R_TYPE(TLS_TPOFF32): - if (!defobj->tls_done && - _rtld_tls_offset_allocate(obj)) - return -1; + if (!defobj->tls_static && + _rtld_tls_offset_allocate(__UNCONST(defobj))) + return -1; *where = (Elf_Addr)(def->st_value - defobj->tlsoffset + rela->r_addend); Index: src/libexec/ld.elf_so/arch/sparc64/mdreloc.c diff -u src/libexec/ld.elf_so/arch/sparc64/mdreloc.c:1.69 src/libexec/ld.elf_so/arch/sparc64/mdreloc.c:1.70 --- src/libexec/ld.elf_so/arch/sparc64/mdreloc.c:1.69 Tue Apr 3 21:10:27 2018 +++ src/libexec/ld.elf_so/arch/sparc64/mdreloc.c Sun Jun 4 01:24:58 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.69 2018/04/03 21:10:27 joerg Exp $ */ +/* $NetBSD: mdreloc.c,v 1.70 2023/06/04 01:24:58 joerg Exp $ */ /*- * Copyright (c) 2000 Eduardo Horvath. @@ -32,7 +32,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.69 2018/04/03 21:10:27 joerg Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.70 2023/06/04 01:24:58 joerg Exp $"); #endif /* not lint */ #include <machine/elf_support.h> @@ -383,9 +383,9 @@ _rtld_relocate_nonplt_objects(Obj_Entry break; case R_TYPE(TLS_TPOFF64): - if (!defobj->tls_done && - _rtld_tls_offset_allocate(obj)) - return -1; + if (!defobj->tls_static && + _rtld_tls_offset_allocate(__UNCONST(defobj))) + return -1; *where = (Elf64_Addr)(def->st_value - defobj->tlsoffset + rela->r_addend); Index: src/libexec/ld.elf_so/arch/x86_64/mdreloc.c diff -u src/libexec/ld.elf_so/arch/x86_64/mdreloc.c:1.47 src/libexec/ld.elf_so/arch/x86_64/mdreloc.c:1.48 --- src/libexec/ld.elf_so/arch/x86_64/mdreloc.c:1.47 Tue Apr 3 21:10:27 2018 +++ src/libexec/ld.elf_so/arch/x86_64/mdreloc.c Sun Jun 4 01:24:58 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.47 2018/04/03 21:10:27 joerg Exp $ */ +/* $NetBSD: mdreloc.c,v 1.48 2023/06/04 01:24:58 joerg Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -68,7 +68,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.47 2018/04/03 21:10:27 joerg Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.48 2023/06/04 01:24:58 joerg Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -226,8 +226,8 @@ _rtld_relocate_nonplt_objects(Obj_Entry break; case R_TYPE(TPOFF64): - if (!defobj->tls_done && - _rtld_tls_offset_allocate(obj)) + if (!defobj->tls_static && + _rtld_tls_offset_allocate(__UNCONST(defobj))) return -1; *where64 = (Elf64_Addr)(def->st_value - Index: src/tests/libexec/ld.elf_so/t_tls_extern.c diff -u src/tests/libexec/ld.elf_so/t_tls_extern.c:1.11 src/tests/libexec/ld.elf_so/t_tls_extern.c:1.12 --- src/tests/libexec/ld.elf_so/t_tls_extern.c:1.11 Fri Jun 2 19:09:11 2023 +++ src/tests/libexec/ld.elf_so/t_tls_extern.c Sun Jun 4 01:24:58 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: t_tls_extern.c,v 1.11 2023/06/02 19:09:11 riastradh Exp $ */ +/* $NetBSD: t_tls_extern.c,v 1.12 2023/06/04 01:24:58 joerg Exp $ */ /*- * Copyright (c) 2023 The NetBSD Foundation, Inc. @@ -41,8 +41,7 @@ enum order { }; static void -tls_extern(const char *libdef, const char *libuse, enum order order, - bool xfail) +tls_extern(const char *libdef, const char *libuse, enum order order) { void *def, *use; int *(*fdef)(void), *(*fuse)(void); @@ -77,10 +76,6 @@ lazy: ATF_REQUIRE_DL(fdef = dlsym(def, break; } - if (xfail) { - atf_tc_expect_fail("PR toolchain/50277:" - " rtld relocation bug with thread local storage"); - } ATF_CHECK_EQ_MSG(pdef, puse, "%p in defining library != %p in using library", pdef, puse); @@ -94,8 +89,7 @@ ATF_TC_HEAD(dynamic_abusedef, tc) } ATF_TC_BODY(dynamic_abusedef, tc) { - tls_extern("libh_def_dynamic.so", "libh_abuse_dynamic.so", - USE_DEF, /*xfail*/true); + tls_extern("libh_def_dynamic.so", "libh_abuse_dynamic.so", USE_DEF); } ATF_TC(dynamic_abusedefnoload); @@ -107,7 +101,7 @@ ATF_TC_HEAD(dynamic_abusedefnoload, tc) ATF_TC_BODY(dynamic_abusedefnoload, tc) { tls_extern("libh_def_dynamic.so", "libh_abuse_dynamic.so", - USE_DEF_NOLOAD, /*xfail*/true); + USE_DEF_NOLOAD); } ATF_TC(dynamic_defabuse_eager); @@ -124,7 +118,6 @@ ATF_TC_BODY(dynamic_defabuse_eager, tc) ATF_REQUIRE_DL(def = dlopen("libh_def_dynamic.so", 0)); ATF_REQUIRE_DL(fdef = dlsym(def, "fdef")); (void)(*fdef)(); - atf_tc_expect_fail("rtld fails to detect dynamic-then-static abuse"); ATF_CHECK_EQ_MSG(NULL, dlopen("libh_abuse_dynamic.so", 0), "dlopen failed to detect static-then-dynamic abuse"); } @@ -138,7 +131,7 @@ ATF_TC_HEAD(dynamic_defabuse_lazy, tc) ATF_TC_BODY(dynamic_defabuse_lazy, tc) { tls_extern("libh_def_dynamic.so", "libh_abuse_dynamic.so", - DEF_USE_LAZY, /*xfail*/true); + DEF_USE_LAZY); } ATF_TC(dynamic_defuse_eager); @@ -150,7 +143,7 @@ ATF_TC_HEAD(dynamic_defuse_eager, tc) ATF_TC_BODY(dynamic_defuse_eager, tc) { tls_extern("libh_def_dynamic.so", "libh_use_dynamic.so", - DEF_USE_EAGER, /*xfail*/false); + DEF_USE_EAGER); } ATF_TC(dynamic_defuse_lazy); @@ -162,7 +155,7 @@ ATF_TC_HEAD(dynamic_defuse_lazy, tc) ATF_TC_BODY(dynamic_defuse_lazy, tc) { tls_extern("libh_def_dynamic.so", "libh_use_dynamic.so", - DEF_USE_LAZY, /*xfail*/false); + DEF_USE_LAZY); } ATF_TC(dynamic_usedef); @@ -174,7 +167,7 @@ ATF_TC_HEAD(dynamic_usedef, tc) ATF_TC_BODY(dynamic_usedef, tc) { tls_extern("libh_def_dynamic.so", "libh_use_dynamic.so", - USE_DEF, /*xfail*/false); + USE_DEF); } ATF_TC(dynamic_usedefnoload); @@ -186,7 +179,7 @@ ATF_TC_HEAD(dynamic_usedefnoload, tc) ATF_TC_BODY(dynamic_usedefnoload, tc) { tls_extern("libh_def_dynamic.so", "libh_use_dynamic.so", - USE_DEF_NOLOAD, /*xfail*/false); + USE_DEF_NOLOAD); } ATF_TC(static_abusedef); @@ -197,8 +190,7 @@ ATF_TC_HEAD(static_abusedef, tc) } ATF_TC_BODY(static_abusedef, tc) { - tls_extern("libh_def_static.so", "libh_abuse_static.so", - USE_DEF, /*xfail*/true); + tls_extern("libh_def_static.so", "libh_abuse_static.so", USE_DEF); } ATF_TC(static_abusedefnoload); @@ -210,7 +202,7 @@ ATF_TC_HEAD(static_abusedefnoload, tc) ATF_TC_BODY(static_abusedefnoload, tc) { tls_extern("libh_def_static.so", "libh_abuse_static.so", - USE_DEF_NOLOAD, /*xfail*/true); + USE_DEF_NOLOAD); } ATF_TC(static_defabuse_eager); @@ -222,7 +214,7 @@ ATF_TC_HEAD(static_defabuse_eager, tc) ATF_TC_BODY(static_defabuse_eager, tc) { tls_extern("libh_def_static.so", "libh_abuse_static.so", - DEF_USE_EAGER, /*xfail*/true); + DEF_USE_EAGER); } ATF_TC(static_defabuse_lazy); @@ -234,7 +226,7 @@ ATF_TC_HEAD(static_defabuse_lazy, tc) ATF_TC_BODY(static_defabuse_lazy, tc) { tls_extern("libh_def_static.so", "libh_abuse_static.so", - DEF_USE_LAZY, /*xfail*/true); + DEF_USE_LAZY); } ATF_TC(static_defuse_eager); @@ -246,7 +238,7 @@ ATF_TC_HEAD(static_defuse_eager, tc) ATF_TC_BODY(static_defuse_eager, tc) { tls_extern("libh_def_static.so", "libh_use_static.so", - DEF_USE_EAGER, /*xfail*/false); + DEF_USE_EAGER); } ATF_TC(static_defuse_lazy); @@ -258,7 +250,7 @@ ATF_TC_HEAD(static_defuse_lazy, tc) ATF_TC_BODY(static_defuse_lazy, tc) { tls_extern("libh_def_static.so", "libh_use_static.so", - DEF_USE_LAZY, /*xfail*/false); + DEF_USE_LAZY); } ATF_TC(static_usedef); @@ -270,7 +262,7 @@ ATF_TC_HEAD(static_usedef, tc) ATF_TC_BODY(static_usedef, tc) { tls_extern("libh_def_static.so", "libh_use_static.so", - USE_DEF, /*xfail*/true); + USE_DEF); } ATF_TC(static_usedefnoload); @@ -282,7 +274,7 @@ ATF_TC_HEAD(static_usedefnoload, tc) ATF_TC_BODY(static_usedefnoload, tc) { tls_extern("libh_def_static.so", "libh_use_static.so", - USE_DEF_NOLOAD, /*xfail*/true); + USE_DEF_NOLOAD); } ATF_TC(onlydef_dynamic_static_ctor); @@ -296,7 +288,6 @@ ATF_TC_BODY(onlydef_dynamic_static_ctor, ATF_REQUIRE_DL(dlopen("libh_onlydef.so", 0)); ATF_REQUIRE_DL(dlopen("libh_onlyctor_dynamic.so", 0)); - atf_tc_expect_fail("rtld fails to detect dynamic-then-static abuse"); ATF_CHECK_EQ_MSG(NULL, dlopen("libh_onlyuse_static.so", 0), "dlopen failed to detect dynamic-then-static abuse"); } @@ -315,7 +306,6 @@ ATF_TC_BODY(onlydef_dynamic_static_eager ATF_REQUIRE_DL(use_dynamic = dlopen("libh_onlyuse_dynamic.so", 0)); ATF_REQUIRE_DL(fdynamic = dlsym(use_dynamic, "fdynamic")); (void)(*fdynamic)(); - atf_tc_expect_fail("rtld fails to detect dynamic-then-static abuse"); ATF_CHECK_EQ_MSG(NULL, dlopen("libh_onlyuse_static.so", 0), "dlopen failed to detect dynamic-then-static abuse"); } @@ -338,8 +328,6 @@ ATF_TC_BODY(onlydef_dynamic_static_lazy, ATF_REQUIRE_DL(fstatic = dlsym(use_static, "fstatic")); pdynamic = (*fdynamic)(); pstatic = (*fstatic)(); - atf_tc_expect_fail("PR toolchain/50277:" - " rtld relocation bug with thread local storage"); ATF_CHECK_EQ_MSG(pdynamic, pstatic, "%p in dynamic tls user != %p in static tls user", pdynamic, pstatic); @@ -365,8 +353,6 @@ ATF_TC_BODY(onlydef_static_dynamic_eager ATF_REQUIRE_DL(use_dynamic = dlopen("libh_onlyuse_dynamic.so", 0)); ATF_REQUIRE_DL(fdynamic = dlsym(use_dynamic, "fdynamic")); pdynamic = (*fdynamic)(); - atf_tc_expect_fail("PR toolchain/50277:" - " rtld relocation bug with thread local storage"); ATF_CHECK_EQ_MSG(pstatic, pdynamic, "%p in static tls user != %p in dynamic tls user", pstatic, pdynamic); @@ -391,8 +377,6 @@ ATF_TC_BODY(onlydef_static_dynamic_lazy, ATF_REQUIRE_DL(fdynamic = dlsym(use_dynamic, "fdynamic")); pstatic = (*fstatic)(); pdynamic = (*fdynamic)(); - atf_tc_expect_fail("PR toolchain/50277:" - " rtld relocation bug with thread local storage"); ATF_CHECK_EQ_MSG(pstatic, pdynamic, "%p in static tls user != %p in dynamic tls user", pstatic, pdynamic);