NetBSD Problem Report #59685

From www@netbsd.org  Thu Oct  2 13:59:21 2025
Return-Path: <www@netbsd.org>
Received: from mail.netbsd.org (mail.netbsd.org [199.233.217.200])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (2048 bits)
	 client-signature RSA-PSS (2048 bits))
	(Client CN "mail.NetBSD.org", Issuer "mail.NetBSD.org CA" (not verified))
	by mollari.NetBSD.org (Postfix) with ESMTPS id DD7661A9239
	for <gnats-bugs@gnats.NetBSD.org>; Thu,  2 Oct 2025 13:59:21 +0000 (UTC)
Message-Id: <20251002135920.DF8CA1A923C@mollari.NetBSD.org>
Date: Thu,  2 Oct 2025 13:59:20 +0000 (UTC)
From: campbell+netbsd@mumble.net
Reply-To: campbell+netbsd@mumble.net
To: gnats-bugs@NetBSD.org
Subject: libcrypto should not depend on libpthread
X-Send-Pr-Version: www-1.0

>Number:         59685
>Category:       lib
>Synopsis:       libcrypto should not depend on libpthread
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    lib-bug-people
>State:          needs-pullups
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Oct 02 14:00:00 +0000 2025
>Closed-Date:    
>Last-Modified:  Sun Oct 19 23:55:01 +0000 2025
>Originator:     Taylor R Campbell
>Release:        
>Organization:
The NetBSD Threadless Crypto, Inc.
>Environment:
>Description:
With the openssl 3.5 update, libcrypto sprpouted a mandatory dependency on libpthread.  This is almost certainly a mistake; it shouldn't bring in libpthread in any applications that don't use libpthread themselves, and instead use the empty libc stubs in that case.
>How-To-Repeat:
code inspection
>Fix:
yes, please

>Release-Note:

>Audit-Trail:
From: Christos Zoulas <christos@zoulas.com>
To: gnats-bugs@netbsd.org
Cc: lib-bug-people@netbsd.org, gnats-admin@netbsd.org,
 netbsd-bugs@netbsd.org
Subject: Re: lib/59685: libcrypto should not depend on libpthread
Date: Thu, 02 Oct 2025 11:39:28 -0400

 Problem is:

 [11:36am] 79>nm obj.amd64-x86_64/libcrypto.a | grep pthread_
                   U pthread_attr_destroy
                   U pthread_attr_init
                   U pthread_attr_setdetachstate
                   U pthread_create
                   U pthread_join

 That the new libcrypto needs pthread_create and we decided
 a long time ago not to provide a libc stub for pthread_create
 with the presumption that someone who calls pthread_create
 really needs threads, and can't use stubs.

 Best,

 christos

From: Taylor R Campbell <riastradh@NetBSD.org>
To: Christos Zoulas <christos@zoulas.com>
Cc: gnats-bugs@NetBSD.org, netbsd-bugs@NetBSD.org, joerg@NetBSD.org
Subject: Re: lib/59685: libcrypto should not depend on libpthread
Date: Sat, 4 Oct 2025 03:10:06 +0000

 This is a multi-part message in MIME format.
 --=_yZfuFEUR5sBHB86OQy7idKn1uESPEWyt

 > Date: Thu, 02 Oct 2025 11:39:28 -0400
 > From: Christos Zoulas <christos@zoulas.com>
 > 
 > Problem is:
 > 
 > [11:36am] 79>nm obj.amd64-x86_64/libcrypto.a | grep pthread_
 >                   U pthread_attr_destroy
 >                   U pthread_attr_init
 >                   U pthread_attr_setdetachstate
 >                   U pthread_create
 >                   U pthread_join
 > 
 > That the new libcrypto needs pthread_create and we decided
 > a long time ago not to provide a libc stub for pthread_create
 > with the presumption that someone who calls pthread_create
 > really needs threads, and can't use stubs.

 What decision was that?  Where was it written down?  What was the
 rationale?

 I can't find any record of rationale.  I can't think of a good reason
 why a library like libcrypto shouldn't be able to have a call to
 pthread_create that is dynamically gated on thread configuration, so
 that multithreaded applications linking against libpthread will work
 but single-threaded applications can still use it without linking
 against libpthread.  For libcrypto, as long as you don't call
 OSSL_set_max_threads, it won't ever try calling pthread_create or the
 others.

 The attached draft patch series implements that -- one patch to add
 the stubs to libc, one patch to undo all the makefile churn and stop
 linking everything and the kitchen sink against libpthread so
 single-threaded applications get their performance advantage back.

 We could add more stubs as needed (e.g., more pthread_attr_*
 functions) but these ones should suffice for now.

 --=_yZfuFEUR5sBHB86OQy7idKn1uESPEWyt
 Content-Type: text/plain; charset="ISO-8859-1"; name="pr59685-libcryptolibpthreadstubs"
 Content-Transfer-Encoding: quoted-printable
 Content-Disposition: attachment; filename="pr59685-libcryptolibpthreadstubs.patch"

 # HG changeset patch
 # User Taylor R Campbell <riastradh@NetBSD.org>
 # Date 1759546071 0
 #      Sat Oct 04 02:47:51 2025 +0000
 # Branch trunk
 # Node ID 66d81a37c965663ebb7a1a57b6049266768f26a4
 # Parent  a0306dcafaf26c32d79b45df1e2a5c7fbf8b84e1
 # EXP-Topic riastradh-pr59685-libcryptolibpthreadstubs
 libc: Expose some more pthread stubs.

 Provide macros to refer to these in pthread.h.  This allows libraries
 to use the functions without linking against libpthread for
 applications that don't need threads.  For example, with OpenSSL's
 libcrypto, as long as you don't try to raise OSSL_set_max_threads
 above 0, it won't ever try pthread_create.

 New pthread macros defined:

 pthread_attr_destroy		__libc_thr_attr_destroy
 pthread_attr_init		__libc_thr_attr_init
 pthread_attr_setdetachstate	__libc_thr_attr_setdetachstate
 pthread_create			__libc_thr_create
 pthread_detach			__libc_thr_detach
 pthread_join			__libc_thr_join

 New symbols defined by libc as weak aliases for stubs that always
 fail but can be overridden by libpthread:

 __libc_thr_attr_destroy
 __libc_thr_attr_init
 __libc_thr_attr_setdetachstate
 __libc_thr_detach
 __libc_thr_join

 Note that libc already defined __libc_thr_create.

 New internal stubs, not for overriding:

 __libc_thr_detach_stub
 __libc_thr_join_stub

 These were formerly called __libc_pthread_detach and
 __libc_pthread_join, respectively, and libc has defined weak aliases
 pthread_detach and pthread_join for them since 2013.  I retained all
 four of those symbols, but defined new ones in the __ namespace that
 match the pattern for other thread stubs to avoid raising questions
 about why the pattern seems to be broken.  I left a comment noting
 this fact too.

 New pthread strong aliases to override the libc symbols:

 __libc_thr_attr_destroy
 __libc_thr_attr_init
 __libc_thr_attr_setdetachstate
 __libc_thr_detach
 __libc_thr_join

 Note that pthread already defined a strong __libc_thr_create alias,
 so there is no need to add a new one.

 PR lib/59685: libcrypto should not depend on libpthread

 diff -r a0306dcafaf2 -r 66d81a37c965 lib/libc/include/reentrant.h
 --- a/lib/libc/include/reentrant.h	Sat May 17 00:34:43 2025 +0000
 +++ b/lib/libc/include/reentrant.h	Sat Oct 04 02:47:51 2025 +0000
 @@ -204,8 +204,6 @@ int	__libc_thr_once(once_t *, void (*)(v
  int	__libc_thr_sigsetmask(int, const sigset_t *, sigset_t *);
  thr_t	__libc_thr_self(void);
  int	__libc_thr_yield(void);
 -void	__libc_thr_create(thr_t *, const thrattr_t *,
 -	    void *(*)(void *), void *);
  void	__libc_thr_exit(void *) __attribute__((__noreturn__));
  int	*__libc_thr_errno(void);
  int	__libc_thr_setcancelstate(int, int *);
 @@ -267,6 +265,8 @@ thr_t	__libc_thr_self_stub(void);
  int	__libc_thr_yield_stub(void);
  int	__libc_thr_create_stub(thr_t *, const thrattr_t *,
  	    void *(*)(void *), void *);
 +int	__libc_thr_detach_stub(thr_t);
 +int	__libc_thr_join_stub(thr_t, void **);
  void	__libc_thr_exit_stub(void *) __dead;
  int	*__libc_thr_errno_stub(void);
  int	__libc_thr_setcancelstate_stub(int, int *);
 diff -r a0306dcafaf2 -r 66d81a37c965 lib/libc/thread-stub/thread-stub.c
 --- a/lib/libc/thread-stub/thread-stub.c	Sat May 17 00:34:43 2025 +0000
 +++ b/lib/libc/thread-stub/thread-stub.c	Sat Oct 04 02:47:51 2025 +0000
 @@ -43,8 +43,6 @@
 =20
  #define	__LIBC_THREAD_STUBS
 =20
 -#define pthread_join	__libc_pthread_join
 -#define pthread_detach	__libc_pthread_detach
  #include "namespace.h"
  #include "reentrant.h"
  #include "tsd.h"
 @@ -70,11 +68,33 @@ do {					\
  #define	CHECK_NOT_THREADED()	/* nothing */
  #endif
 =20
 -__weak_alias(pthread_join, __libc_pthread_join)
 -__weak_alias(pthread_detach, __libc_pthread_detach)
 +/*
 + * These aliases are probably not necessary but have been there
 + * historically, probably by mistake.
 + */
 +__weak_alias(pthread_join, __libc_thr_join)
 +__weak_alias(pthread_detach, __libc_thr_detach)
 +
 +/*
 + * These aliases appear to have been an accident -- nothing has ever
 + * exposed them in a .h file, and they have probably never been used.
 + */
 +__weak_alias(__libc_pthread_join, __libc_thr_join)
 +__weak_alias(__libc_pthread_detach, __libc_thr_detach)
 +
 +/*
 + * These aliases are exposed by pthread.h and overridden by libpthread.
 + * This way libraries can have calls to pthread_create/join/detach
 + * without linking against libpthread, but they will fail at runtime in
 + * applications not linked against libpthread.  (Libraries linked
 + * against libpthread themselves, of course, will work, and carry the
 + * dependency to the application.)
 + */
 +__weak_alias(__libc_thr_join, __libc_thr_join_stub)
 +__weak_alias(__libc_thr_detach, __libc_thr_detach_stub)
 =20
  int
 -pthread_join(pthread_t thread, void **valptr)
 +__libc_thr_join_stub(pthread_t thread, void **valptr)
  {
 =20
  	if (thread =3D=3D pthread_self())
 @@ -83,7 +103,7 @@ pthread_join(pthread_t thread, void **va
  }
 =20
  int
 -pthread_detach(pthread_t thread)
 +__libc_thr_detach_stub(pthread_t thread)
  {
 =20
  	if (thread =3D=3D pthread_self())
 @@ -94,6 +114,12 @@ pthread_detach(pthread_t thread)
  __weak_alias(pthread_setname_np, __libc_mutex_catchall_stub)
  __weak_alias(pthread_setaffinity_np, __libc_mutex_catchall_stub)
 =20
 +/* thread creation attributes */
 +
 +__weak_alias(__libc_thr_attr_init, __libc_mutex_catchall_stub)
 +__weak_alias(__libc_thr_attr_setdetachstate, __libc_mutex_catchall_stub)
 +__weak_alias(__libc_thr_attr_destroy, __libc_mutex_catchall_stub)
 +
  /* mutexes */
 =20
  int __libc_mutex_catchall_stub(mutex_t *);
 diff -r a0306dcafaf2 -r 66d81a37c965 lib/libpthread/pthread.c
 --- a/lib/libpthread/pthread.c	Sat May 17 00:34:43 2025 +0000
 +++ b/lib/libpthread/pthread.c	Sat Oct 04 02:47:51 2025 +0000
 @@ -142,6 +142,8 @@ int _sys___sigprocmask14(int, const sigs
 =20
  __strong_alias(__libc_thr_self,pthread_self)
  __strong_alias(__libc_thr_create,pthread_create)
 +__strong_alias(__libc_thr_detach,pthread_detach)
 +__strong_alias(__libc_thr_join,pthread_join)
  __strong_alias(__libc_thr_exit,pthread_exit)
  __strong_alias(__libc_thr_errno,pthread__errno)
  __strong_alias(__libc_thr_setcancelstate,pthread_setcancelstate)
 diff -r a0306dcafaf2 -r 66d81a37c965 lib/libpthread/pthread.h
 --- a/lib/libpthread/pthread.h	Sat May 17 00:34:43 2025 +0000
 +++ b/lib/libpthread/pthread.h	Sat Oct 04 02:47:51 2025 +0000
 @@ -303,17 +303,8 @@ int	pthread_cond_has_waiters_np(pthread_
   * program. This permits code, particularly libraries that do not
   * directly use threads but want to be thread-safe in the presence of
   * threaded callers, to use pthread mutexes and the like without
 - * unnecessairly including libpthread in their linkage.
 - *
 - * Left out of this list are functions that can't sensibly be trivial
 - * or no-op stubs in a single-threaded process (pthread_create,
 - * pthread_kill, pthread_detach), functions that normally block and
 - * wait for another thread to do something (pthread_join), and
 - * functions that don't make sense without the previous functions
 - * (pthread_attr_*). The pthread_cond_wait and pthread_cond_timedwait
 - * functions are useful in implementing certain protection mechanisms,
 - * though a non-buggy app shouldn't end up calling them in
 - * single-threaded mode.
 + * unnecessarily including libpthread in their linkage.  Such
 + * applications just don't get a working pthread_create.
   *
   * The rename is done as:
   * #define pthread_foo	__libc_foo
 @@ -331,6 +322,26 @@ int	pthread_cond_has_waiters_np(pthread_
 =20
  #ifndef __LIBPTHREAD_SOURCE__
  __BEGIN_DECLS
 +int	__libc_thr_create(pthread_t * __restrict,
 +	    const pthread_attr_t * __restrict, void *(*)(void *),
 +	    void * __restrict);
 +int	__libc_thr_detach(pthread_t);
 +int	__libc_thr_join(pthread_t, void **);
 +
 +int	__libc_thr_attr_init(pthread_attr_t *);
 +int	__libc_thr_attr_setdetachstate(pthread_attr_t *, int);
 +int	__libc_thr_attr_destroy(pthread_attr_t *);
 +__END_DECLS
 +
 +#define	pthread_create	__libc_thr_create
 +#define	pthread_detach	__libc_thr_detach
 +#define	pthread_join	__libc_thr_join
 +
 +#define	pthread_attr_init		__libc_thr_attr_init
 +#define	pthread_attr_setdetachstate	__libc_thr_attr_setdetachstate
 +#define	pthread_attr_destroy		__libc_thr_attr_destroy
 +
 +__BEGIN_DECLS
  int	__libc_mutex_init(pthread_mutex_t * __restrict, const pthread_mutexatt=
 r_t * __restrict);
  int	__libc_mutex_lock(pthread_mutex_t *);
  int	__libc_mutex_trylock(pthread_mutex_t *);
 diff -r a0306dcafaf2 -r 66d81a37c965 lib/libpthread/pthread_attr.c
 --- a/lib/libpthread/pthread_attr.c	Sat May 17 00:34:43 2025 +0000
 +++ b/lib/libpthread/pthread_attr.c	Sat Oct 04 02:47:51 2025 +0000
 @@ -48,6 +48,10 @@
  #include "pthread.h"
  #include "pthread_int.h"
 =20
 +__strong_alias(__libc_thr_attr_init, pthread_attr_init)
 +__strong_alias(__libc_thr_attr_setdetachstate, pthread_attr_setdetachstate)
 +__strong_alias(__libc_thr_attr_destroy, pthread_attr_destroy)
 +
  __weak_alias(pthread_attr_get_np, _pthread_attr_get_np)
 =20
  static struct pthread_attr_private *pthread__attr_init_private(
 diff -r a0306dcafaf2 -r 66d81a37c965 lib/libpthread/pthread_mi.expsym
 --- a/lib/libpthread/pthread_mi.expsym	Sat May 17 00:34:43 2025 +0000
 +++ b/lib/libpthread/pthread_mi.expsym	Sat Oct 04 02:47:51 2025 +0000
 @@ -23,13 +23,18 @@
  __libc_rwlock_trywrlock
  __libc_rwlock_unlock
  __libc_rwlock_wrlock
 +__libc_thr_attr_destroy
 +__libc_thr_attr_init
 +__libc_thr_attr_setdetachstate
  __libc_thr_create
  __libc_thr_curcpu
 +__libc_thr_detach
  __libc_thr_equal
  __libc_thr_errno
  __libc_thr_exit
  __libc_thr_getspecific
  __libc_thr_init
 +__libc_thr_join
  __libc_thr_keycreate
  __libc_thr_keydelete
  __libc_thr_once
 # HG changeset patch
 # User Taylor R Campbell <riastradh@NetBSD.org>
 # Date 1759545317 0
 #      Sat Oct 04 02:35:17 2025 +0000
 # Branch trunk
 # Node ID 9dd49a563f8e4bd990ee13de2e1780bff15d25cf
 # Parent  66d81a37c965663ebb7a1a57b6049266768f26a4
 # EXP-Topic riastradh-pr59685-libcryptolibpthreadstubs
 openssl: Stop dragging libpthread into every libcrypto user.

 Now that libc has the necessary stubs for libcrypto to have an
 optional call to pthread_create, it is not necessary to link all
 libcrypto users againts libpthread too.

 Applications that link against libcrypto but not libpthread can't use
 threaded OpenSSL functionality, of course -- OSSL_set_max_threads
 will always fail in such applications.

 This reverts all the makefile churn that I found for unnecessary
 libpthread linkage since the openssl 3.5 import.

 PR lib/59685: libcrypto should not depend on libpthread

 diff -r 66d81a37c965 -r 9dd49a563f8e crypto/external/apache2/openssl/bin/Ma=
 kefile
 --- a/crypto/external/apache2/openssl/bin/Makefile	Sat Oct 04 02:47:51 2025=
  +0000
 +++ b/crypto/external/apache2/openssl/bin/Makefile	Sat Oct 04 02:35:17 2025=
  +0000
 @@ -65,7 +65,6 @@ verify.c \
  version.c \
  x509.c \
 =20
 -CPPFLAGS+=3D -pthread
  CPPFLAGS+=3D -I${OPENSSLSRC} -I${.CURDIR}/../include
  CPPFLAGS+=3D -I${OPENSSLSRC}/include -I${OPENSSLSRC}/apps/include
 =20
 @@ -74,8 +73,8 @@ PROGDPLIBS+=3D    apps ${OPENSSLSRC}/../li
  PROGDPLIBS+=3D    ssl ${OPENSSLSRC}/../lib/libssl
  PROGDPLIBS+=3D    crypto ${OPENSSLSRC}/../lib/libcrypto
 =20
 -LDADD+=3D	-lcrypt -lpthread
 -DPADD+=3D	${LIBCRYPT} ${LIBPTHREAD}
 +LDADD+=3D	-lcrypt
 +DPADD+=3D	${LIBCRYPT}
 =20
  CRYPTODIST=3D	${NETBSDSRCDIR}/crypto
  .include "${NETBSDSRCDIR}/crypto/Makefile.openssl"
 diff -r 66d81a37c965 -r 9dd49a563f8e crypto/external/apache2/openssl/dist/c=
 rypto/thread/api.c
 --- a/crypto/external/apache2/openssl/dist/crypto/thread/api.c	Sat Oct 04 0=
 2:47:51 2025 +0000
 +++ b/crypto/external/apache2/openssl/dist/crypto/thread/api.c	Sat Oct 04 0=
 2:35:17 2025 +0000
 @@ -62,6 +62,15 @@ int OSSL_set_max_threads(OSSL_LIB_CTX *c
      tdata =3D OSSL_LIB_CTX_GET_THREADS(ctx);
      if (tdata =3D=3D NULL)
          return 0;
 +#ifdef __NetBSD__
 +    /*
 +     * Applications must link against libpthread in order to enable
 +     * openssl thread support.
 +     */
 +    extern int __isthreaded;	/* XXX */
 +    if (!__isthreaded)
 +        return 0;
 +#endif
 =20
      ossl_crypto_mutex_lock(tdata->lock);
      tdata->max_threads =3D max_threads;
 diff -r 66d81a37c965 -r 9dd49a563f8e crypto/external/apache2/openssl/lib/li=
 bcrypto/Makefile
 --- a/crypto/external/apache2/openssl/lib/libcrypto/Makefile	Sat Oct 04 02:=
 47:51 2025 +0000
 +++ b/crypto/external/apache2/openssl/lib/libcrypto/Makefile	Sat Oct 04 02:=
 35:17 2025 +0000
 @@ -25,7 +25,6 @@ USE_FIPS=3D	no
  .include <bsd.own.mk>
  .include <bsd.shlib.mk>
 =20
 -CPPFLAGS+=3D -pthread
  CPPFLAGS+=3D -Dlib${LIB} -I. -I${OPENSSLSRC}/crypto -I${OPENSSLSRC}
  CPPFLAGS+=3D -I${OPENSSLSRC}/include -I${OPENSSLSRC}/crypto/include
  CPPFLAGS+=3D -I${OPENSSLSRC}/crypto/asn1 -I${OPENSSLSRC}/crypto/evp
 @@ -51,7 +50,6 @@ CPPFLAGS+=3D -I${OPENSSLSRC}/providers/imp
 =20
  AFLAGS+=3D-DELF
  LIBDPLIBS+=3D crypt ${NETBSDSRCDIR}/lib/libcrypt
 -LIBDPLIBS+=3D pthread ${NETBSDSRCDIR}/lib/libpthread
 =20
  OS_VERSION!=3D ${HOST_SH} ${NETBSDSRCDIR}/sys/conf/osrelease.sh
 =20
 diff -r 66d81a37c965 -r 9dd49a563f8e crypto/external/bsd/heimdal/Makefile.i=
 nc
 --- a/crypto/external/bsd/heimdal/Makefile.inc	Sat Oct 04 02:47:51 2025 +00=
 00
 +++ b/crypto/external/bsd/heimdal/Makefile.inc	Sat Oct 04 02:35:17 2025 +00=
 00
 @@ -22,8 +22,8 @@ DPLIBROKEN=3D	roken ${HEIMBASE}/lib/librok
  DPLIBSL=3D	sl ${HEIMBASE}/lib/libsl
  DPLIBVERS=3D	vers ${HEIMBASE}/lib/libvers
  DPLIBWIND=3D	wind ${HEIMBASE}/lib/libwind
 -KRB5LDADD=3D	-lcrypto -lcrypt -lpthread
 -KRB5DPADD=3D	${LIBCRYPTO} ${LIBCRYPT} ${LIBPTHREAD}
 +KRB5LDADD=3D	-lcrypto -lcrypt
 +KRB5DPADD=3D	${LIBCRYPTO} ${LIBCRYPT}
  HDBLDADD=3D	-lsqlite3 -lm
  HDBDPADD=3D	${LIBSQLITE3} ${LIBM}
 =20
 diff -r 66d81a37c965 -r 9dd49a563f8e crypto/external/bsd/heimdal/bin/hxtool=
 /Makefile
 --- a/crypto/external/bsd/heimdal/bin/hxtool/Makefile	Sat Oct 04 02:47:51 2=
 025 +0000
 +++ b/crypto/external/bsd/heimdal/bin/hxtool/Makefile	Sat Oct 04 02:35:17 2=
 025 +0000
 @@ -20,5 +20,5 @@ COPTS.hxtool.c+=3D -Wno-error=3Ddeprecated-d
  .include <${HEIMBASE}/Makefile.rules.inc>
  .include <bsd.prog.mk>
 =20
 -LDADD+=3D -lcrypto -ledit -lterminfo -lpthread
 -DPADD+=3D ${LIBCRYPTO} ${LIBEDIT} ${LIBTERMINFO} ${LIBPTHREAD}
 +LDADD+=3D -lcrypto -ledit -lterminfo
 +DPADD+=3D ${LIBCRYPTO} ${LIBEDIT} ${LIBTERMINFO}
 diff -r 66d81a37c965 -r 9dd49a563f8e crypto/external/bsd/netpgp/bin/Makefil=
 e.inc
 --- a/crypto/external/bsd/netpgp/bin/Makefile.inc	Sat Oct 04 02:47:51 2025 =
 +0000
 +++ b/crypto/external/bsd/netpgp/bin/Makefile.inc	Sat Oct 04 02:35:17 2025 =
 +0000
 @@ -12,5 +12,5 @@ LIBMJDIR!=3D	cd ${.PARSEDIR}/../libmj && $
  LDADD+=3D		-L${LIBMJDIR} -lmj
  DPADD+=3D		${LIBMJDIR}/libmj.a
 =20
 -LDADD+=3D		-lcrypto -lz -lbz2 -lpthread
 -DPADD+=3D		${LIBCRYPTO} ${LIBZ} ${LIBBZ2} ${LIBPTHREAD}
 +LDADD+=3D		-lcrypto -lz -lbz2
 +DPADD+=3D		${LIBCRYPTO} ${LIBZ} ${LIBBZ2}
 diff -r 66d81a37c965 -r 9dd49a563f8e crypto/external/bsd/openssh/bin/Makefi=
 le.inc
 --- a/crypto/external/bsd/openssh/bin/Makefile.inc	Sat Oct 04 02:47:51 2025=
  +0000
 +++ b/crypto/external/bsd/openssh/bin/Makefile.inc	Sat Oct 04 02:35:17 2025=
  +0000
 @@ -8,7 +8,6 @@ PROGDPLIBS+=3D \
      ssh ${CRYPTOBSD}/openssh/lib \
      crypto ${CRYPTOBSD:H}/${EXTERNAL_OPENSSL_SUBDIR}/lib/libcrypto \
      crypt ${NETBSDSRCDIR}/lib/libcrypt \
 -    z ${NETBSDSRCDIR}/lib/libz \
 -    pthread ${NETBSDSRCDIR}/lib/libpthread
 +    z ${NETBSDSRCDIR}/lib/libz
 =20
  .include "${.PARSEDIR}/../Makefile.inc"
 diff -r 66d81a37c965 -r 9dd49a563f8e external/bsd/libfido2/bin/Makefile.inc
 --- a/external/bsd/libfido2/bin/Makefile.inc	Sat Oct 04 02:47:51 2025 +0000
 +++ b/external/bsd/libfido2/bin/Makefile.inc	Sat Oct 04 02:35:17 2025 +0000
 @@ -4,6 +4,5 @@
 =20
  .PATH: ${DIST}/tools ${DIST}/man ${DIST}/openbsd-compat
 =20
 -LDADD+=3D-lfido2 -lcbor -lusbhid -lcrypto -lz -lm -lpthread
 -DPADD+=3D${LIBFIDO2} ${LIBCBOR} ${LIBUSBHID} ${LIBCRYPTO} ${LIBZ} ${LIBM} \
 -    ${LIBPTHREAD}
 +LDADD+=3D-lfido2 -lcbor -lusbhid -lcrypto -lz -lm
 +DPADD+=3D${LIBFIDO2} ${LIBCBOR} ${LIBUSBHID} ${LIBCRYPTO} ${LIBZ} ${LIBM}
 diff -r 66d81a37c965 -r 9dd49a563f8e external/bsd/nsd/Makefile.inc
 --- a/external/bsd/nsd/Makefile.inc	Sat Oct 04 02:47:51 2025 +0000
 +++ b/external/bsd/nsd/Makefile.inc	Sat Oct 04 02:35:17 2025 +0000
 @@ -23,7 +23,6 @@ DPLIBS+=3D ssl ${NETBSDSRCDIR}/crypto/exte
  DPLIBS+=3D crypto ${NETBSDSRCDIR}/crypto/external/${EXTERNAL_OPENSSL_SUBDI=
 R}/lib/libcrypto
  DPLIBS+=3D crypt ${NETBSDSRCDIR}/lib/libcrypt
  DPLIBS+=3D util ${NETBSDSRCDIR}/lib/libutil
 -DPLIBS+=3D pthread ${NETBSDSRCDIR}/lib/libpthread
 =20
  __subst: .USE
  	${TOOL_SED} \
 diff -r 66d81a37c965 -r 9dd49a563f8e external/bsd/ntp/Makefile.inc
 --- a/external/bsd/ntp/Makefile.inc	Sat Oct 04 02:47:51 2025 +0000
 +++ b/external/bsd/ntp/Makefile.inc	Sat Oct 04 02:35:17 2025 +0000
 @@ -35,8 +35,8 @@ LIBPARSE!=3D	cd ${.CURDIR}/../../lib/libpa
  LDADD+=3D		-L${LIBNTP} -lntp -L${LIBOPTS} -lopts
  DPADD+=3D		${LIBNTP}/libntp.a ${LIBOPTS}/libopts.a
 =20
 -LDADD+=3D		-lcrypto -lcrypt -lpthread
 -DPADD+=3D		${LIBCRYPTO} ${LIBCRYPT} ${LIBPTHREAD}
 +LDADD+=3D		-lcrypto -lcrypt
 +DPADD+=3D		${LIBCRYPTO} ${LIBCRYPT}
 =20
  .if ${MKMDNS:Uno} !=3D "no"
  CPPFLAGS+=3D-DHAVE_DNSREGISTRATION=3D1
 diff -r 66d81a37c965 -r 9dd49a563f8e external/bsd/pam-u2f/bin/pamu2fcfg/Mak=
 efile
 --- a/external/bsd/pam-u2f/bin/pamu2fcfg/Makefile	Sat Oct 04 02:47:51 2025 =
 +0000
 +++ b/external/bsd/pam-u2f/bin/pamu2fcfg/Makefile	Sat Oct 04 02:35:17 2025 =
 +0000
 @@ -16,9 +16,8 @@ PROG=3Dpamu2fcfg
  SRCS=3Dpamu2fcfg.c cmdline.c b64.c readpassphrase.c explicit_bzero.c util.c
  COPTS.util.c +=3D -Wno-error=3Dstack-protector
 =20
 -LDADD+=3D-lpam -lfido2 -lcbor -lusbhid -lcrypto -lm -lpthread
 -DPADD+=3D${LIBPAM} ${LIBFIDO2} ${LIBCBOR} ${LIBUSBHID} ${LIBCRYPTO} ${LIBM=
 } \
 -    ${LIBPTHREAD}
 +LDADD+=3D-lpam -lfido2 -lcbor -lusbhid -lcrypto -lm
 +DPADD+=3D${LIBPAM} ${LIBFIDO2} ${LIBCBOR} ${LIBUSBHID} ${LIBCRYPTO} ${LIBM}
 =20
  pamu2fcfg.1:
  	asciidoc -b docbook45 -d manpage -o pamu2fcfg.1.xml ../../dist/man/pamu2f=
 cfg.1.txt
 diff -r 66d81a37c965 -r 9dd49a563f8e external/bsd/ppp/usr.sbin/pppd/Makefile
 --- a/external/bsd/ppp/usr.sbin/pppd/Makefile	Sat Oct 04 02:47:51 2025 +0000
 +++ b/external/bsd/ppp/usr.sbin/pppd/Makefile	Sat Oct 04 02:35:17 2025 +0000
 @@ -64,8 +64,6 @@ DPADD+=3D${LIBPAM} ${PAM_STATIC_DPADD}
 =20
  LDADD+=3D -lpcap -lcrypt -lssl -lcrypto -lutil -Wl,--export-dynamic
  DPADD+=3D ${LIBPCAP} ${LIBCRYPT} ${LIBSSL} ${LIBCRYPTO} ${LIBUTIL}
 -LDADD+=3D -lpthread
 -DPADD+=3D ${LIBPTHREAD}
 =20
  .for f in chap-md5 chap_ms eap
  COPTS.${f}.c+=3D	-Wno-pointer-sign
 diff -r 66d81a37c965 -r 9dd49a563f8e external/bsd/tcpdump/bin/Makefile
 --- a/external/bsd/tcpdump/bin/Makefile	Sat Oct 04 02:47:51 2025 +0000
 +++ b/external/bsd/tcpdump/bin/Makefile	Sat Oct 04 02:35:17 2025 +0000
 @@ -211,8 +211,8 @@ CPPFLAGS+=3D-DHAVE_OS_IPV6_SUPPORT=3D1
  .endif
 =20
  CPPFLAGS+=3D-DHAVE_LIBCRYPTO=3D1 -DHAVE_OPENSSL_EVP_H=20
 -LDADD+=3D	-lcrypto -lcrypt -lpthread
 -DPADD+=3D	${LIBCRYPTO} ${LIBCRYPT} ${LIBPTHREAD}
 +LDADD+=3D	-lcrypto -lcrypt
 +DPADD+=3D	${LIBCRYPTO} ${LIBCRYPT}
 =20
  CLEANFILES+=3D	version.c tcpdump.8
 =20
 diff -r 66d81a37c965 -r 9dd49a563f8e external/bsd/wpa/bin/hostapd/Makefile
 --- a/external/bsd/wpa/bin/hostapd/Makefile	Sat Oct 04 02:47:51 2025 +0000
 +++ b/external/bsd/wpa/bin/hostapd/Makefile	Sat Oct 04 02:35:17 2025 +0000
 @@ -251,8 +251,8 @@ ikev2.c \
  tncs.c
 =20
 =20
 -DPADD+=3D ${LIBSSL} ${LIBCRYPTO} ${LIBDES} ${LIBPTHREAD}
 -LDADD+=3D -lssl -lcrypto -ldes -lpthread
 +DPADD+=3D ${LIBSSL} ${LIBCRYPTO} ${LIBDES}
 +LDADD+=3D -lssl -lcrypto -ldes
  .else
  CPPFLAGS+=3D -DINTERNAL_AES -DINTERNAL_MD5 -DINTERNAL_SHA1 -DCONFIG_NO_PBK=
 DF2
  CPPFLAGS+=3D -DCONFIG_CRYPTO_INTERNAL
 diff -r 66d81a37c965 -r 9dd49a563f8e external/bsd/wpa/bin/wpa_passphrase/Ma=
 kefile
 --- a/external/bsd/wpa/bin/wpa_passphrase/Makefile	Sat Oct 04 02:47:51 2025=
  +0000
 +++ b/external/bsd/wpa/bin/wpa_passphrase/Makefile	Sat Oct 04 02:35:17 2025=
  +0000
 @@ -14,8 +14,8 @@ wpabuf.c
 =20
  .if !defined(NO_CRYPT) && !defined(NO_OPENSSL) && !defined(RELEASE_CRUNCH)
  SRCS+=3D crypto_openssl.c
 -DPADD+=3D ${LIBSSL} ${LIBCRYPTO} ${LIBDES} ${LIBPTHREAD}
 -LDADD+=3D -lssl -lcrypto -ldes -lpthread
 +DPADD+=3D ${LIBSSL} ${LIBCRYPTO} ${LIBDES}
 +LDADD+=3D -lssl -lcrypto -ldes
  .else
  CPPFLAGS+=3D -DINTERNAL_AES -DINTERNAL_MD5 -DINTERNAL_SHA1
  CPPFLAGS+=3D -DCONFIG_CRYPTO_INTERNAL
 diff -r 66d81a37c965 -r 9dd49a563f8e external/bsd/wpa/bin/wpa_supplicant/Ma=
 kefile
 --- a/external/bsd/wpa/bin/wpa_supplicant/Makefile	Sat Oct 04 02:47:51 2025=
  +0000
 +++ b/external/bsd/wpa/bin/wpa_supplicant/Makefile	Sat Oct 04 02:35:17 2025=
  +0000
 @@ -176,8 +176,8 @@ aes-omac1.c \
  #CPPFLAGS+=3D -DEAP_FAST
  #SRCS+=3D	eap_fast.c
 =20
 -DPADD+=3D ${LIBSSL} ${LIBCRYPTO} ${LIBDES} ${LIBPTHREAD}
 -LDADD+=3D -lssl -lcrypto -ldes -lpthread
 +DPADD+=3D ${LIBSSL} ${LIBCRYPTO} ${LIBDES}
 +LDADD+=3D -lssl -lcrypto -ldes
  .else
  CPPFLAGS+=3D -DINTERNAL_AES -DINTERNAL_MD5 -DINTERNAL_SHA1 -DCONFIG_NO_PBK=
 DF2
  SRCS+=3D tls_none.c sha1-internal.c md5-internal.c aes-xinternal.c rc4.c
 diff -r 66d81a37c965 -r 9dd49a563f8e games/factor/Makefile
 --- a/games/factor/Makefile	Sat Oct 04 02:47:51 2025 +0000
 +++ b/games/factor/Makefile	Sat Oct 04 02:35:17 2025 +0000
 @@ -10,8 +10,8 @@ SRCS=3D	factor.c pr_tbl.c
  CPPFLAGS+=3D-I${PRIMES}
 =20
  CPPFLAGS+=3D-DHAVE_OPENSSL
 -LDADD+=3D	-lcrypto -lcrypt -lpthread
 -DPADD+=3D	${LIBCRYPTO} ${LIBCRYPT} ${LIBPTHREAD}
 +LDADD+=3D	-lcrypto -lcrypt
 +DPADD+=3D	${LIBCRYPTO} ${LIBCRYPT}
 =20
  COPTS.factor.c+=3D -Wno-error=3Ddeprecated-declarations
 =20
 diff -r 66d81a37c965 -r 9dd49a563f8e libexec/httpd/Makefile
 --- a/libexec/httpd/Makefile	Sat Oct 04 02:47:51 2025 +0000
 +++ b/libexec/httpd/Makefile	Sat Oct 04 02:35:17 2025 +0000
 @@ -52,8 +52,8 @@ CPPFLAGS+=3D	-DHAVE_NBUTIL_H
  LDADD+=3D		-lnbutil
  .endif
 =20
 -LDADD+=3D	-lssl -lcrypto -lpthread
 -DPADD+=3D	${LIBSSL} ${LIBCRYPTO} ${LIBPTHREAD}
 +LDADD+=3D	-lssl -lcrypto
 +DPADD+=3D	${LIBSSL} ${LIBCRYPTO}
 =20
  #
  # Build release things.
 diff -r 66d81a37c965 -r 9dd49a563f8e share/mk/bsd.prog.mk
 --- a/share/mk/bsd.prog.mk	Sat Oct 04 02:47:51 2025 +0000
 +++ b/share/mk/bsd.prog.mk	Sat Oct 04 02:35:17 2025 +0000
 @@ -205,19 +205,19 @@ LIB${_lib:tu}=3D	${DESTDIR}/usr/lib/lib${_
  LIBKRB5_LDADD+=3D -lkrb5 -lcom_err \
  	-lhx509 -lcrypto -lasn1 \
  	-lwind -lheimbase -lcom_err -lroken \
 -	-lcrypt -lutil -lpthread
 +	-lcrypt -lutil
  LIBKRB5_DPADD+=3D ${LIBKRB5} ${LIBCOM_ERR} \
  	${LIBHX509} ${LIBCRYPTO} ${LIBASN1} \
  	${LIBWIND} ${LIBHEIMBASE} ${LIBCOM_ERR} ${LIBROKEN} \
 -	${LIBCRYPT} ${LIBUTIL} ${LIBPTHREAD}
 +	${LIBCRYPT} ${LIBUTIL}
  LIBGSSAPI_LDADD+=3D -lgssapi -lheimntlm ${LIBKRB5_LDADD}
  LIBGSSAPI_DPADD+=3D ${LIBGSSAPI} ${LIBHEIMNTLM} ${LIBKRB5_DPADD}
  .endif
 =20
  .if (${MKLDAP} !=3D "no")
 -LIBLDAP_LDADD+=3D -lldap -llber ${LIBGSSAPI_LDADD} -lssl -lcrypto -lpthread
 +LIBLDAP_LDADD+=3D -lldap -llber ${LIBGSSAPI_LDADD} -lssl -lcrypto
  LIBLDAP_DPADD+=3D ${LIBLDAP} ${LIBLBER} ${LIBGSSAPI_DPADD} ${LIBSSL} \
 -    ${LIBCRYPTO} ${LIBPTHREAD}
 +    ${LIBCRYPTO}
  .endif
 =20
  # PAM applications, if linked statically, need more libraries
 @@ -226,10 +226,10 @@ PAM_STATIC_LDADD+=3D -lssh
  PAM_STATIC_DPADD+=3D ${LIBSSH}
  .if (${MKKERBEROS} !=3D "no")
  PAM_STATIC_LDADD+=3D -lkafs -lkrb5 -lhx509 -lwind -lasn1 \
 -	-lroken -lcom_err -lheimbase -lcrypto -lsqlite3 -lpthread -lm
 +	-lroken -lcom_err -lheimbase -lcrypto -lsqlite3 -lm
  PAM_STATIC_DPADD+=3D ${LIBKAFS} ${LIBKRB5} ${LIBHX509} ${LIBWIND} ${LIBASN=
 1} \
  	${LIBROKEN} ${LIBCOM_ERR} ${LIBHEIMBASE} ${LIBCRYPTO} ${LIBSQLITE3} \
 -	${LIBPTHREAD} ${LIBM}
 +	${LIBM}
  .endif
  .if (${MKSKEY} !=3D "no")
  PAM_STATIC_LDADD+=3D -lskey
 diff -r 66d81a37c965 -r 9dd49a563f8e tests/crypto/libcrypto/Makefile
 --- a/tests/crypto/libcrypto/Makefile	Sat Oct 04 02:47:51 2025 +0000
 +++ b/tests/crypto/libcrypto/Makefile	Sat Oct 04 02:35:17 2025 +0000
 @@ -19,8 +19,8 @@ SUBDIR +=3D lhash sha x509v3
  TESTSDIR=3D	${TESTSBASE}/crypto/libcrypto
 =20
  TESTS_C+=3D		t_sha512trunc
 -DPADD.t_sha512trunc+=3D	${LIBCRYPTO} ${LIBPTHREAD}
 -LDADD.t_sha512trunc+=3D	-lcrypto -lpthread
 +DPADD.t_sha512trunc+=3D	${LIBCRYPTO}
 +LDADD.t_sha512trunc+=3D	-lcrypto
 =20
  .if ${HAVE_OPENSSL} =3D=3D 10
  TESTS_SH=3D	t_certs
 diff -r 66d81a37c965 -r 9dd49a563f8e tests/crypto/libcrypto/Makefile.inc
 --- a/tests/crypto/libcrypto/Makefile.inc	Sat Oct 04 02:47:51 2025 +0000
 +++ b/tests/crypto/libcrypto/Makefile.inc	Sat Oct 04 02:35:17 2025 +0000
 @@ -32,8 +32,8 @@ PROGDPLIBS+=3D	cryptotest ${OPENSSLSRC}/..
  .if ${HELPER_NAME} !=3D "threadstest"
  PROGDPLIBS+=3D	crypto ${OPENSSLSRC}/../lib/libcrypto
  .endif
 -DPADD_AFTER+=3D		${LIBCRYPT} ${LIBPTHREAD}
 -LDADD_AFTER+=3D		-lcrypt -lpthread
 +DPADD+=3D		${LIBCRYPT}
 +LDADD+=3D		-lcrypt
 =20
 =20
  .include <bsd.test.mk>
 diff -r 66d81a37c965 -r 9dd49a563f8e tests/crypto/libcrypto/dh/Makefile
 --- a/tests/crypto/libcrypto/dh/Makefile	Sat Oct 04 02:47:51 2025 +0000
 +++ b/tests/crypto/libcrypto/dh/Makefile	Sat Oct 04 02:35:17 2025 +0000
 @@ -3,7 +3,5 @@
  PROGDPLIBSSTATIC=3Dyes
  HELPER_NAME=3D	dhtest
  HELPER_DIR=3D	dh
 -DPADD+=3D ${LIBPTHREAD}
 -LDADD+=3D -lpthread
 =20
  .include <bsd.init.mk>
 diff -r 66d81a37c965 -r 9dd49a563f8e tests/lib/libc/hash/Makefile
 --- a/tests/lib/libc/hash/Makefile	Sat Oct 04 02:47:51 2025 +0000
 +++ b/tests/lib/libc/hash/Makefile	Sat Oct 04 02:35:17 2025 +0000
 @@ -6,8 +6,8 @@ TESTSDIR=3D	${TESTSBASE}/lib/libc/hash
 =20
  TESTS_C+=3D	t_sha2
  TESTS_C+=3D	t_hmac
 -LDADD.t_hmac+=3D	-lcrypto -lpthread
 -DDADD.t_hmac+=3D	${LIBCRYPTO} ${LIBPTHREAD}
 +LDADD.t_hmac+=3D	-lcrypto
 +DDADD.t_hmac+=3D	${LIBCRYPTO}
 =20
  TESTS_SH+=3D	t_hash
 =20
 diff -r 66d81a37c965 -r 9dd49a563f8e usr.bin/dc/Makefile
 --- a/usr.bin/dc/Makefile	Sat Oct 04 02:47:51 2025 +0000
 +++ b/usr.bin/dc/Makefile	Sat Oct 04 02:35:17 2025 +0000
 @@ -6,8 +6,8 @@ PROG=3D	dc
  SRCS=3D	main.c dc.c bcode.c inout.c mem.c stack.c
 =20
  WARNS=3D6
 -LDADD=3D	-lcrypto -lpthread
 -DPADD=3D	${LIBCRYPTO} ${LIBPTHREAD}
 +LDADD=3D	-lcrypto
 +DPADD=3D	${LIBCRYPTO}
 =20
  SUBDIR.roff+=3DUSD.doc
 =20
 diff -r 66d81a37c965 -r 9dd49a563f8e usr.bin/ftp/Makefile
 --- a/usr.bin/ftp/Makefile	Sat Oct 04 02:47:51 2025 +0000
 +++ b/usr.bin/ftp/Makefile	Sat Oct 04 02:35:17 2025 +0000
 @@ -20,8 +20,8 @@ CPPFLAGS+=3D-DNO_EDITCOMPLETE -DNO_ABOUT -
  LDADD+=3D	-ledit -lterminfo
  DPADD+=3D	${LIBEDIT} ${LIBTERMINFO}
  CPPFLAGS+=3D -DWITH_SSL
 -LDADD+=3D -lssl -lcrypto -lpthread
 -DPADD+=3D ${LIBSSL} ${LIBCRYPTO} ${LIBPTHREAD}
 +LDADD+=3D -lssl -lcrypto
 +DPADD+=3D ${LIBSSL} ${LIBCRYPTO}
  .endif
 =20
  .if (!defined(SMALLPROG) || defined(SMALLPROG_INET6)) && (${USE_INET6} !=
 =3D "no")
 diff -r 66d81a37c965 -r 9dd49a563f8e usr.bin/moduli/Makefile.inc
 --- a/usr.bin/moduli/Makefile.inc	Sat Oct 04 02:47:51 2025 +0000
 +++ b/usr.bin/moduli/Makefile.inc	Sat Oct 04 02:35:17 2025 +0000
 @@ -2,8 +2,8 @@
 =20
  .include <bsd.own.mk>
 =20
 -DPADD+=3D ${LIBCRYPTO} ${LIBPTHREAD}
 -LDADD+=3D -lcrypto -lpthread
 +DPADD+=3D ${LIBCRYPTO}
 +LDADD+=3D -lcrypto
 =20
  .if exists(${.CURDIR}/../../Makefile.inc)
  .include "${.CURDIR}/../../Makefile.inc"
 diff -r 66d81a37c965 -r 9dd49a563f8e usr.bin/nbsvtool/Makefile
 --- a/usr.bin/nbsvtool/Makefile	Sat Oct 04 02:47:51 2025 +0000
 +++ b/usr.bin/nbsvtool/Makefile	Sat Oct 04 02:35:17 2025 +0000
 @@ -1,8 +1,8 @@
  # $NetBSD: Makefile,v 1.4 2025/07/19 15:56:31 christos Exp $
 =20
  PROG=3D	nbsvtool
 -LDADD+=3D	-lcrypto -lpthread
 -DPADD+=3D	${LIBCRYPTO} ${LIBPTHREAD}
 +LDADD+=3D	-lcrypto
 +DPADD+=3D	${LIBCRYPTO}
  CPPFLAGS+=3D-DOPENSSL_API_COMPAT=3D0x10100000L
 =20
  .include <bsd.prog.mk>
 diff -r 66d81a37c965 -r 9dd49a563f8e usr.sbin/plainrsa-gen/Makefile
 --- a/usr.sbin/plainrsa-gen/Makefile	Sat Oct 04 02:47:51 2025 +0000
 +++ b/usr.sbin/plainrsa-gen/Makefile	Sat Oct 04 02:35:17 2025 +0000
 @@ -9,8 +9,8 @@ SRCS+=3D	plainrsa-gen.c
  MAN=3D	plainrsa-gen.8
 =20
  CPPFLAGS+=3D-DNOUSE_PRIVSEP
 -LDADD+=3D -lcrypto -lipsec -lpthread
 -DPADD+=3D ${LIBCRYPTO} ${LIBIPSEC} ${LIBPTHREAD}
 +LDADD+=3D -lcrypto -lipsec
 +DPADD+=3D ${LIBCRYPTO} ${LIBIPSEC}
 =20
  .include "${.CURDIR}/../racoon/Makefile.racoon"
 =20
 diff -r 66d81a37c965 -r 9dd49a563f8e usr.sbin/syslogd/Makefile
 --- a/usr.sbin/syslogd/Makefile	Sat Oct 04 02:47:51 2025 +0000
 +++ b/usr.sbin/syslogd/Makefile	Sat Oct 04 02:35:17 2025 +0000
 @@ -28,8 +28,8 @@ CPPFLAGS+=3D-DOPENSSL_API_COMPAT=3D0x1010000
  LDADD+=3D	-lwrap -lblocklist=20
  DPADD+=3D	${LIBWRAP} ${LIBBLOCKLIST}=20
 =20
 -LDADD+=3D	-lssl -lcrypto -lpthread
 -DPADD+=3D ${LIBSSL} ${LIBCRYPTO} ${LIBPTHREAD}
 +LDADD+=3D	-lssl -lcrypto
 +DPADD+=3D ${LIBSSL} ${LIBCRYPTO}
 =20
  # Overflow that appears impossible
  COPTS.syslogd.c+=3D        ${CC_WNO_FORMAT_TRUNCATION} ${CC_WNO_STRINGOP_T=
 RUNCATION}

 --=_yZfuFEUR5sBHB86OQy7idKn1uESPEWyt--

From: Taylor R Campbell <riastradh@NetBSD.org>
To: Christos Zoulas <christos@zoulas.com>
Cc: gnats-bugs@NetBSD.org, netbsd-bugs@NetBSD.org, joerg@NetBSD.org
Subject: Re: lib/59685: libcrypto should not depend on libpthread
Date: Sat, 4 Oct 2025 14:42:40 +0000

 This is a multi-part message in MIME format.
 --=_aD0stfJJ+WVg8+9bTfy4bTTT5i9m1xYu

 > Date: Sat, 4 Oct 2025 03:10:06 +0000
 > From: Taylor R Campbell <riastradh@NetBSD.org>
 > 
 > I can't find any record of rationale.  I can't think of a good reason
 > why a library like libcrypto shouldn't be able to have a call to
 > pthread_create that is dynamically gated on thread configuration, so
 > that multithreaded applications linking against libpthread will work
 > but single-threaded applications can still use it without linking
 > against libpthread. [...]

 Here's a good reason: it is useful to detect the mistake of #including
 <pthread.h> and calling pthread_create without linking against
 libpthread, and it is useful to detect it at link-time rather than
 only at run-time.

 So, we could let libraries opt into having a pthread_create stub in
 non-threaded applications by defining a feature macro, say
 _NETBSD_PTHREAD_CREATE_WEAK:

 	/* library.c */
 	#define _NETBSD_PTHREAD_CREATE_WEAK

 	#include <pthread.h>

 	... if (max_threads > 0) error = pthread_create(...) ...

 Defining _NETBSD_PTHREAD_CREATE_WEAK will make pthread.h expose a
 macro

 	#define	pthread_create	__libc_thr_create

 so pthread_create expands to a symbol __libc_thr_create which is
 defined in libc to always fail.  libc already defines this symbol
 weakly[*]; libpthread already overrides it with a strong alias to the
 real pthread_create.

 Applications which _don't_ opt into _NETBSD_PTHREAD_CREATE_WEAK will
 fail to link if you forget to link against libpthread, due to missing
 pthread_create symbol -- this preserves the link-time error detection.


 The attached patch series implements this, and adds some automatic
 tests for:
 (a) link-time pthread error detection,
 (b) using a library with weak pthread_create in a non-threaded test
     program (pthread_create fails gracefully), and
 (c) using a library with weak pthread_create in a threaded test
     program (pthread_create works).
 The patch series also makes libc's __libc_thr_create stub fail
 gracefully, rather than raise SIGABRT, in non-threaded applications,
 like all the other stubs.

 Net change to libc symbols:
 +__libc_thr_attr_destroy
 +__libc_thr_attr_init
 +__libc_thr_attr_setdetachstate
 +__libc_thr_detach
 +__libc_thr_join
 +__libc_thr_detach_stub (for consistency with other stubs)
 +__libc_thr_join_stub (for consistency with other stubs)

 Net change to libpthread symbols:
 +__libc_thr_attr_destroy
 +__libc_thr_attr_init
 +__libc_thr_attr_setdetachstate
 +__libc_thr_detach
 +__libc_thr_join

 Net change to pthread.h declarations:

 +__libc_thr_attr_destroy
 +__libc_thr_attr_init
 +__libc_thr_attr_setdetachstate
 +__libc_thr_detach
 +__libc_thr_join

 Net change to pthread.h macros, if you don't define
 _NETBSD_PTHREAD_CREATE_WEAK:

 +#define pthread_attr_destroy __libc_thr_attr_destroy
 +#define pthread_attr_init __libc_thr_attr_init
 +#define pthread_attr_setdetachstate __libc_thr_attr_setdetachstate
 +#define pthread_detach __libc_thr_detach
 +#define pthread_join __libc_thr_join

 Additional change to pthread.h macros if you do define it:

 +#define pthread_create __libc_thr_create


 [*] Currently __libc_thr_create raises SIGABRT uncondiitonally, but I
     don't see any reason why it shouldn't just fail with EOPNOTSUPP or
     ENOSYS or whatever in non-threaded applications, and currently
     there are no applications which can even call __libc_thr_create
     without reaching into libc internals.

 --=_aD0stfJJ+WVg8+9bTfy4bTTT5i9m1xYu
 Content-Type: text/plain; charset="ISO-8859-1"; name="pr59685-libcryptolibpthreadstubs-v2"
 Content-Transfer-Encoding: quoted-printable
 Content-Disposition: attachment; filename="pr59685-libcryptolibpthreadstubs-v2.patch"

 # HG changeset patch
 # User Taylor R Campbell <riastradh@NetBSD.org>
 # Date 1759546071 0
 #      Sat Oct 04 02:47:51 2025 +0000
 # Branch trunk
 # Node ID 5702b7021d2976bdb1bc35f51e4f97a4a319aaef
 # Parent  a0306dcafaf26c32d79b45df1e2a5c7fbf8b84e1
 # EXP-Topic riastradh-pr59685-libcryptolibpthreadstubs
 libc: Expose some more pthread stubs.

 Additionally, provide the option for pthread.h to expose
 pthread_create so that libc can provide a weak stub for it, if you
 define _NETBSD_PTHREAD_CREATE_WEAK.

 This allows libraries to use the functions without linking against
 libpthread for applications that don't need threads.  For example,
 with OpenSSL's libcrypto, as long as you don't try to raise
 OSSL_set_max_threads above 0, it won't ever try pthread_create.

 New pthread.h macros defined:

 pthread_attr_destroy		__libc_thr_attr_destroy
 pthread_attr_init		__libc_thr_attr_init
 pthread_attr_setdetachstate	__libc_thr_attr_setdetachstate
 pthread_detach			__libc_thr_detach
 pthread_join			__libc_thr_join

 New pthread.h macros defined if _NETBSD_PTHREAD_CREATE_WEAK is
 defined first:

 pthread_create			__libc_thr_create

 New symbols defined by libc as weak aliases for stubs that always
 fail but can be overridden by libpthread:

 __libc_thr_attr_destroy
 __libc_thr_attr_init
 __libc_thr_attr_setdetachstate
 __libc_thr_detach
 __libc_thr_join

 Note that libc already defined __libc_thr_create.

 New internal stubs, not for overriding:

 __libc_thr_detach_stub
 __libc_thr_join_stub

 These were formerly called __libc_pthread_detach and
 __libc_pthread_join, respectively, and libc has defined weak aliases
 pthread_detach and pthread_join for them since 2013.  I retained all
 four of those symbols, but defined new ones in the __ namespace that
 match the pattern for other thread stubs to avoid raising questions
 about why the pattern seems to be broken.  I left a comment noting
 this fact too.

 New pthread strong aliases to override the libc symbols:

 __libc_thr_attr_destroy
 __libc_thr_attr_init
 __libc_thr_attr_setdetachstate
 __libc_thr_detach
 __libc_thr_join

 Note that pthread already defined a strong __libc_thr_create alias
 for the real pthread_create, so there is no need to add a new one.

 PR lib/59685: libcrypto should not depend on libpthread

 diff -r a0306dcafaf2 -r 5702b7021d29 lib/libc/include/reentrant.h
 --- a/lib/libc/include/reentrant.h	Sat May 17 00:34:43 2025 +0000
 +++ b/lib/libc/include/reentrant.h	Sat Oct 04 02:47:51 2025 +0000
 @@ -204,8 +204,6 @@ int	__libc_thr_once(once_t *, void (*)(v
  int	__libc_thr_sigsetmask(int, const sigset_t *, sigset_t *);
  thr_t	__libc_thr_self(void);
  int	__libc_thr_yield(void);
 -void	__libc_thr_create(thr_t *, const thrattr_t *,
 -	    void *(*)(void *), void *);
  void	__libc_thr_exit(void *) __attribute__((__noreturn__));
  int	*__libc_thr_errno(void);
  int	__libc_thr_setcancelstate(int, int *);
 @@ -267,6 +265,8 @@ thr_t	__libc_thr_self_stub(void);
  int	__libc_thr_yield_stub(void);
  int	__libc_thr_create_stub(thr_t *, const thrattr_t *,
  	    void *(*)(void *), void *);
 +int	__libc_thr_detach_stub(thr_t);
 +int	__libc_thr_join_stub(thr_t, void **);
  void	__libc_thr_exit_stub(void *) __dead;
  int	*__libc_thr_errno_stub(void);
  int	__libc_thr_setcancelstate_stub(int, int *);
 diff -r a0306dcafaf2 -r 5702b7021d29 lib/libc/thread-stub/thread-stub.c
 --- a/lib/libc/thread-stub/thread-stub.c	Sat May 17 00:34:43 2025 +0000
 +++ b/lib/libc/thread-stub/thread-stub.c	Sat Oct 04 02:47:51 2025 +0000
 @@ -43,8 +43,6 @@
 =20
  #define	__LIBC_THREAD_STUBS
 =20
 -#define pthread_join	__libc_pthread_join
 -#define pthread_detach	__libc_pthread_detach
  #include "namespace.h"
  #include "reentrant.h"
  #include "tsd.h"
 @@ -70,11 +68,33 @@ do {					\
  #define	CHECK_NOT_THREADED()	/* nothing */
  #endif
 =20
 -__weak_alias(pthread_join, __libc_pthread_join)
 -__weak_alias(pthread_detach, __libc_pthread_detach)
 +/*
 + * These aliases are probably not necessary but have been there
 + * historically, probably by mistake.
 + */
 +__weak_alias(pthread_join, __libc_thr_join)
 +__weak_alias(pthread_detach, __libc_thr_detach)
 +
 +/*
 + * These aliases appear to have been an accident -- nothing has ever
 + * exposed them in a .h file, and they have probably never been used.
 + */
 +__strong_alias(__libc_pthread_join, __libc_thr_join)
 +__strong_alias(__libc_pthread_detach, __libc_thr_detach)
 +
 +/*
 + * These aliases are exposed by pthread.h and overridden by libpthread.
 + * This way libraries can have calls to pthread_create/join/detach
 + * without linking against libpthread, but they will fail at runtime in
 + * applications not linked against libpthread.  (Libraries linked
 + * against libpthread themselves, of course, will work, and carry the
 + * dependency to the application.)
 + */
 +__weak_alias(__libc_thr_join, __libc_thr_join_stub)
 +__weak_alias(__libc_thr_detach, __libc_thr_detach_stub)
 =20
  int
 -pthread_join(pthread_t thread, void **valptr)
 +__libc_thr_join_stub(pthread_t thread, void **valptr)
  {
 =20
  	if (thread =3D=3D pthread_self())
 @@ -83,7 +103,7 @@ pthread_join(pthread_t thread, void **va
  }
 =20
  int
 -pthread_detach(pthread_t thread)
 +__libc_thr_detach_stub(pthread_t thread)
  {
 =20
  	if (thread =3D=3D pthread_self())
 @@ -94,6 +114,12 @@ pthread_detach(pthread_t thread)
  __weak_alias(pthread_setname_np, __libc_mutex_catchall_stub)
  __weak_alias(pthread_setaffinity_np, __libc_mutex_catchall_stub)
 =20
 +/* thread creation attributes */
 +
 +__weak_alias(__libc_thr_attr_init, __libc_mutex_catchall_stub)
 +__weak_alias(__libc_thr_attr_setdetachstate, __libc_mutex_catchall_stub)
 +__weak_alias(__libc_thr_attr_destroy, __libc_mutex_catchall_stub)
 +
  /* mutexes */
 =20
  int __libc_mutex_catchall_stub(mutex_t *);
 @@ -419,9 +445,9 @@ int
  	/* LINTED deliberate lack of effect */
  	(void)a;
 =20
 -	DIE();
 +	CHECK_NOT_THREADED();
 =20
 -	return (EOPNOTSUPP);
 +	return EOPNOTSUPP;
  }
 =20
  __dead void
 diff -r a0306dcafaf2 -r 5702b7021d29 lib/libpthread/pthread.c
 --- a/lib/libpthread/pthread.c	Sat May 17 00:34:43 2025 +0000
 +++ b/lib/libpthread/pthread.c	Sat Oct 04 02:47:51 2025 +0000
 @@ -142,6 +142,8 @@ int _sys___sigprocmask14(int, const sigs
 =20
  __strong_alias(__libc_thr_self,pthread_self)
  __strong_alias(__libc_thr_create,pthread_create)
 +__strong_alias(__libc_thr_detach,pthread_detach)
 +__strong_alias(__libc_thr_join,pthread_join)
  __strong_alias(__libc_thr_exit,pthread_exit)
  __strong_alias(__libc_thr_errno,pthread__errno)
  __strong_alias(__libc_thr_setcancelstate,pthread_setcancelstate)
 diff -r a0306dcafaf2 -r 5702b7021d29 lib/libpthread/pthread.h
 --- a/lib/libpthread/pthread.h	Sat May 17 00:34:43 2025 +0000
 +++ b/lib/libpthread/pthread.h	Sat Oct 04 02:47:51 2025 +0000
 @@ -303,17 +303,21 @@ int	pthread_cond_has_waiters_np(pthread_
   * program. This permits code, particularly libraries that do not
   * directly use threads but want to be thread-safe in the presence of
   * threaded callers, to use pthread mutexes and the like without
 - * unnecessairly including libpthread in their linkage.
 + * unnecessarily including libpthread in their linkage.
   *
 - * Left out of this list are functions that can't sensibly be trivial
 - * or no-op stubs in a single-threaded process (pthread_create,
 - * pthread_kill, pthread_detach), functions that normally block and
 - * wait for another thread to do something (pthread_join), and
 - * functions that don't make sense without the previous functions
 - * (pthread_attr_*). The pthread_cond_wait and pthread_cond_timedwait
 - * functions are useful in implementing certain protection mechanisms,
 - * though a non-buggy app shouldn't end up calling them in
 - * single-threaded mode.
 + * A common mistake is to include pthread.h but not link against
 + * libpthread in applications that create threads.  Since threading
 + * adds substantial overhead to basic libc functionality like stdio, we
 + * don't want to make libpthread default, but we do want to catch this
 + * mistake.  We catch it by not defining pthread_create in libc or
 + * renaming it to a stub that is defined in libc by default.
 + *
 + * However, some libraries (like openssl libcrypto) will _optionally_
 + * create threads in threaded applications.  These libraries can
 + * request the stub by defining _PTHREAD_CREATE_WEAK, so they can be
 + * used by threaded applications -- which need to link against
 + * libpthread themselves to avoid runtime errors -- and non-threaded
 + * applications which don't link against libpthread at all.
   *
   * The rename is done as:
   * #define pthread_foo	__libc_foo
 @@ -331,6 +335,38 @@ int	pthread_cond_has_waiters_np(pthread_
 =20
  #ifndef __LIBPTHREAD_SOURCE__
  __BEGIN_DECLS
 +int	__libc_thr_create(pthread_t * __restrict,
 +	    const pthread_attr_t * __restrict, void *(*)(void *),
 +	    void * __restrict);
 +int	__libc_thr_detach(pthread_t);
 +int	__libc_thr_join(pthread_t, void **);
 +
 +int	__libc_thr_attr_init(pthread_attr_t *);
 +int	__libc_thr_attr_setdetachstate(pthread_attr_t *, int);
 +int	__libc_thr_attr_destroy(pthread_attr_t *);
 +__END_DECLS
 +
 +/*
 + * If _NETBSD_PTHREAD_CREATE_WEAK is defined, make pthread_create
 + * expand to a symbol which is defined as a weak alias by libc, so
 + * libraries can opt into using it for threaded applications without
 + * requiring non-threaded applications to be linked against libpthread.
 + * Otherwise, if you include pthread.h _without_ defining
 + * _NETBSD_PTHREAD_CREATE_WEAK and try to call pthread_create without
 + * linking against libpthread, the linker will detect this as an error.
 + */
 +#ifdef _NETBSD_PTHREAD_CREATE_WEAK
 +#define	pthread_create	__libc_thr_create
 +#endif
 +
 +#define	pthread_detach	__libc_thr_detach
 +#define	pthread_join	__libc_thr_join
 +
 +#define	pthread_attr_init		__libc_thr_attr_init
 +#define	pthread_attr_setdetachstate	__libc_thr_attr_setdetachstate
 +#define	pthread_attr_destroy		__libc_thr_attr_destroy
 +
 +__BEGIN_DECLS
  int	__libc_mutex_init(pthread_mutex_t * __restrict, const pthread_mutexatt=
 r_t * __restrict);
  int	__libc_mutex_lock(pthread_mutex_t *);
  int	__libc_mutex_trylock(pthread_mutex_t *);
 diff -r a0306dcafaf2 -r 5702b7021d29 lib/libpthread/pthread_attr.c
 --- a/lib/libpthread/pthread_attr.c	Sat May 17 00:34:43 2025 +0000
 +++ b/lib/libpthread/pthread_attr.c	Sat Oct 04 02:47:51 2025 +0000
 @@ -48,6 +48,10 @@
  #include "pthread.h"
  #include "pthread_int.h"
 =20
 +__strong_alias(__libc_thr_attr_init, pthread_attr_init)
 +__strong_alias(__libc_thr_attr_setdetachstate, pthread_attr_setdetachstate)
 +__strong_alias(__libc_thr_attr_destroy, pthread_attr_destroy)
 +
  __weak_alias(pthread_attr_get_np, _pthread_attr_get_np)
 =20
  static struct pthread_attr_private *pthread__attr_init_private(
 diff -r a0306dcafaf2 -r 5702b7021d29 lib/libpthread/pthread_mi.expsym
 --- a/lib/libpthread/pthread_mi.expsym	Sat May 17 00:34:43 2025 +0000
 +++ b/lib/libpthread/pthread_mi.expsym	Sat Oct 04 02:47:51 2025 +0000
 @@ -23,13 +23,18 @@
  __libc_rwlock_trywrlock
  __libc_rwlock_unlock
  __libc_rwlock_wrlock
 +__libc_thr_attr_destroy
 +__libc_thr_attr_init
 +__libc_thr_attr_setdetachstate
  __libc_thr_create
  __libc_thr_curcpu
 +__libc_thr_detach
  __libc_thr_equal
  __libc_thr_errno
  __libc_thr_exit
  __libc_thr_getspecific
  __libc_thr_init
 +__libc_thr_join
  __libc_thr_keycreate
  __libc_thr_keydelete
  __libc_thr_once
 # HG changeset patch
 # User Taylor R Campbell <riastradh@NetBSD.org>
 # Date 1759582282 0
 #      Sat Oct 04 12:51:22 2025 +0000
 # Branch trunk
 # Node ID 35a38791da7ae3485d2b7df8e8513dc232aadf26
 # Parent  5702b7021d2976bdb1bc35f51e4f97a4a319aaef
 # EXP-Topic riastradh-pr59685-libcryptolibpthreadstubs
 libpthread: Test pthread_create link errors without -(l)pthread.

 Prompted by:

 PR lib/59685: libcrypto should not depend on libpthread

 diff -r 5702b7021d29 -r 35a38791da7a distrib/sets/lists/tests/mi
 --- a/distrib/sets/lists/tests/mi	Sat Oct 04 02:47:51 2025 +0000
 +++ b/distrib/sets/lists/tests/mi	Sat Oct 04 12:51:22 2025 +0000
 @@ -4928,6 +4928,7 @@
  ./usr/tests/usr.bin/cc/t_msan_shadow			tests-usr.bin-tests	compattestfile,=
 atf
  ./usr/tests/usr.bin/cc/t_msan_stack			tests-usr.bin-tests	compattestfile,a=
 tf
  ./usr/tests/usr.bin/cc/t_msan_unpoison			tests-usr.bin-tests	compattestfil=
 e,atf
 +./usr/tests/usr.bin/cc/t_pthread_abuse			tests-usr.bin-tests	compattestfil=
 e,atf
  ./usr/tests/usr.bin/cc/t_tsan_data_race			tests-usr.bin-tests	compattestfi=
 le,atf
  ./usr/tests/usr.bin/cc/t_tsan_heap_use_after_free	tests-usr.bin-tests	comp=
 attestfile,atf
  ./usr/tests/usr.bin/cc/t_tsan_lock_order_inversion	tests-usr.bin-tests	com=
 pattestfile,atf
 diff -r 5702b7021d29 -r 35a38791da7a tests/usr.bin/cc/Makefile
 --- a/tests/usr.bin/cc/Makefile	Sat Oct 04 02:47:51 2025 +0000
 +++ b/tests/usr.bin/cc/Makefile	Sat Oct 04 12:51:22 2025 +0000
 @@ -26,6 +26,7 @@ TESTS_SH+=3D	$(UBSAN_TESTS)
  TESTS_SH+=3D	t_ctype_abuse
  TESTS_SH+=3D	t_hello
  TESTS_SH+=3D	t_libgomp
 +TESTS_SH+=3D	t_pthread_abuse
 =20
  TESTS_SH+=3D	t_fuzzer_oom
  TESTS_SH+=3D	t_fuzzer_simple
 diff -r 5702b7021d29 -r 35a38791da7a tests/usr.bin/cc/t_pthread_abuse.sh
 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
 +++ b/tests/usr.bin/cc/t_pthread_abuse.sh	Sat Oct 04 12:51:22 2025 +0000
 @@ -0,0 +1,79 @@
 +#	$NetBSD$
 +#
 +# Copyright (c) 2025 The NetBSD Foundation, Inc.
 +# All rights reserved.
 +#
 +# Redistribution and use in source and binary forms, with or without
 +# modification, are permitted provided that the following conditions
 +# are met:
 +# 1. Redistributions of source code must retain the above copyright
 +#    notice, this list of conditions and the following disclaimer.
 +# 2. Redistributions in binary form must reproduce the above copyright
 +#    notice, this list of conditions and the following disclaimer in the
 +#    documentation and/or other materials provided with the distribution.
 +#
 +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 +# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMI=
 TED
 +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICUL=
 AR
 +# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF T=
 HE
 +# POSSIBILITY OF SUCH DAMAGE.
 +#
 +
 +pthread_abuse_head()
 +{
 +
 +	atf_set "descr" \
 +	    "Test that pthread_create calls without -lpthread fail to link"
 +	atf_set "require.progs" "cc"
 +}
 +pthread_abuse_body()
 +{
 +
 +	cat >test.c <<'EOF'
 +#include <err.h>
 +#include <pthread.h>
 +#include <stdlib.h>
 +
 +static void *
 +start(void *cookie)
 +{
 +	return cookie;
 +}
 +
 +int
 +main(void)
 +{
 +	int cookie =3D 123;
 +	pthread_t t;
 +	void *result;
 +	int error;
 +
 +	error =3D pthread_create(&t, NULL, &start, &cookie);
 +	if (error)
 +		errc(EXIT_FAILURE, error, "pthread_create");
 +	error =3D pthread_join(t, &result);
 +	if (error)
 +		errc(EXIT_FAILURE, error, "pthread_join");
 +	return (result =3D=3D &cookie ? 0 : EXIT_FAILURE);
 +}
 +EOF
 +	atf_check -s not-exit:0 \
 +	    -e match:'undefined reference to.*pthread_create' \
 +	    cc -o test test.c
 +	atf_check cc -o test test.c -lpthread
 +	atf_check ./test
 +	atf_check cc -o test test.c -pthread
 +	atf_check ./test
 +}
 +
 +atf_init_test_cases()
 +{
 +
 +	atf_add_test_case pthread_abuse
 +}
 # HG changeset patch
 # User Taylor R Campbell <riastradh@NetBSD.org>
 # Date 1759585108 0
 #      Sat Oct 04 13:38:28 2025 +0000
 # Branch trunk
 # Node ID 482501fe3793ece2812ad62746d01f89c513873d
 # Parent  35a38791da7ae3485d2b7df8e8513dc232aadf26
 # EXP-Topic riastradh-pr59685-libcryptolibpthreadstubs
 libpthread: Test pthread stubs in threaded vs non-threaded programs.

 PR lib/59685: libcrypto should not depend on libpthread

 diff -r 35a38791da7a -r 482501fe3793 distrib/sets/lists/debug/mi
 --- a/distrib/sets/lists/debug/mi	Sat Oct 04 12:51:22 2025 +0000
 +++ b/distrib/sets/lists/debug/mi	Sat Oct 04 13:38:28 2025 +0000
 @@ -2426,6 +2426,8 @@
  ./usr/libdata/debug/usr/tests/lib/libpthread/t_thrd.debug		tests-lib-tests=
 		debug,atf,compattestfile
  ./usr/libdata/debug/usr/tests/lib/libpthread/t_timedmutex.debug		tests-lib=
 -tests		debug,atf,compattestfile
  ./usr/libdata/debug/usr/tests/lib/libpthread/t_tss.debug		tests-lib-tests	=
 	debug,atf,compattestfile
 +./usr/libdata/debug/usr/tests/lib/libpthread/weak/t_pthread_weak_nothread.=
 debug		tests-lib-tests		debug,atf,compattestfile
 +./usr/libdata/debug/usr/tests/lib/libpthread/weak/t_pthread_weak_threaded.=
 debug		tests-lib-tests		debug,atf,compattestfile
  ./usr/libdata/debug/usr/tests/lib/libpthread_dbg/t_dummy.debug		tests-obso=
 lete		obsolete
  ./usr/libdata/debug/usr/tests/lib/libpthread_dbg/t_threads.debug	tests-obs=
 olete		obsolete
  ./usr/libdata/debug/usr/tests/lib/librefuse/t_refuse_opt.debug		tests-lib-=
 debug		debug,atf,compattestfile
 diff -r 35a38791da7a -r 482501fe3793 distrib/sets/lists/debug/shl.mi
 --- a/distrib/sets/lists/debug/shl.mi	Sat Oct 04 12:51:22 2025 +0000
 +++ b/distrib/sets/lists/debug/shl.mi	Sat Oct 04 13:38:28 2025 +0000
 @@ -373,6 +373,7 @@
  ./usr/libdata/debug/usr/tests/lib/libc/tls/libh_tls_dynamic.so.1.debug	tes=
 ts-lib-debug		debug,compattestfile,atf
  ./usr/libdata/debug/usr/tests/lib/libc/tls/t_tls_dlopen.debug		tests-lib-d=
 ebug		debug,compattestfile,atf
  ./usr/libdata/debug/usr/tests/lib/libc/tls/t_tls_dynamic.debug		tests-lib-=
 debug		debug,compattestfile,atf
 +./usr/libdata/debug/usr/tests/lib/libpthread/weak/libh_pthread_weak.so.1.d=
 ebug		tests-lib-debug		debug,compattestfile,atf
  ./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_helper_symver_dso0/libh_=
 helper_symver_dso.so.1.debug	tests-libexec-debug	debug,compattestfile,atf
  ./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_helper_symver_dso1/libh_=
 helper_symver_dso.so.1.debug	tests-libexec-debug	debug,compattestfile,atf
  ./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_helper_symver_dso2/libh_=
 helper_symver_dso.so.1.debug	tests-libexec-debug	debug,compattestfile,atf
 diff -r 35a38791da7a -r 482501fe3793 distrib/sets/lists/tests/mi
 --- a/distrib/sets/lists/tests/mi	Sat Oct 04 12:51:22 2025 +0000
 +++ b/distrib/sets/lists/tests/mi	Sat Oct 04 13:38:28 2025 +0000
 @@ -144,6 +144,7 @@
  ./usr/libdata/debug/usr/tests/lib/libprop		tests-lib-debug		compattestfile=
 ,atf
  ./usr/libdata/debug/usr/tests/lib/libpthread		tests-lib-debug		compattestf=
 ile,atf
  ./usr/libdata/debug/usr/tests/lib/libpthread/dlopen	tests-lib-debug		compa=
 ttestfile,atf
 +./usr/libdata/debug/usr/tests/lib/libpthread/weak	tests-lib-debug		compatt=
 estfile,atf
  ./usr/libdata/debug/usr/tests/lib/libpthread_dbg	tests-obsolete		obsolete
  ./usr/libdata/debug/usr/tests/lib/librefuse		tests-lib-debug		compattestfi=
 le,atf
  ./usr/libdata/debug/usr/tests/lib/librt			tests-lib-debug		compattestfile,=
 atf
 @@ -4201,6 +4202,11 @@
  ./usr/tests/lib/libpthread/t_thread_local_dtor		tests-lib-tests		compattes=
 tfile,atf
  ./usr/tests/lib/libpthread/t_timedmutex			tests-lib-tests		compattestfile,=
 atf
  ./usr/tests/lib/libpthread/t_tss			tests-lib-tests		compattestfile,atf
 +./usr/tests/lib/libpthread/weak				tests-lib-tests		compattestfile,atf
 +./usr/tests/lib/libpthread/weak/Atffile			tests-lib-tests		compattestfile,=
 atf
 +./usr/tests/lib/libpthread/weak/Kyuafile		tests-lib-tests		compattestfile,=
 atf,kyua
 +./usr/tests/lib/libpthread/weak/t_pthread_weak_nothread	tests-lib-tests		c=
 ompattestfile,atf
 +./usr/tests/lib/libpthread/weak/t_pthread_weak_threaded	tests-lib-tests		c=
 ompattestfile,atf
  ./usr/tests/lib/libpthread_dbg				tests-obsolete		obsolete
  ./usr/tests/lib/libpthread_dbg/Atffile			tests-obsolete		obsolete
  ./usr/tests/lib/libpthread_dbg/Kyuafile			tests-obsolete		obsolete
 diff -r 35a38791da7a -r 482501fe3793 distrib/sets/lists/tests/shl.mi
 --- a/distrib/sets/lists/tests/shl.mi	Sat Oct 04 12:51:22 2025 +0000
 +++ b/distrib/sets/lists/tests/shl.mi	Sat Oct 04 13:38:28 2025 +0000
 @@ -10,6 +10,8 @@
  ./usr/tests/lib/libc/tls/libh_tls_dynamic.so.1	tests-lib-tests		compattest=
 file,atf
  ./usr/tests/lib/libc/tls/t_tls_dlopen		tests-lib-tests		compattestfile,atf
  ./usr/tests/lib/libc/tls/t_tls_dynamic		tests-lib-tests		compattestfile,atf
 +./usr/tests/lib/libpthread/weak/libh_pthread_weak.so	tests-lib-tests		comp=
 attestfile,atf
 +./usr/tests/lib/libpthread/weak/libh_pthread_weak.so.1	tests-lib-tests		co=
 mpattestfile,atf
  ./usr/tests/libexec/ld.elf_so/h_helper_symver_dso0/libh_helper_symver_dso.=
 so	tests-libexec-tests	compattestfile,atf
  ./usr/tests/libexec/ld.elf_so/h_helper_symver_dso0/libh_helper_symver_dso.=
 so.1	tests-libexec-tests	compattestfile,atf
  ./usr/tests/libexec/ld.elf_so/h_helper_symver_dso1/libh_helper_symver_dso.=
 so	tests-libexec-tests	compattestfile,atf
 diff -r 35a38791da7a -r 482501fe3793 etc/mtree/NetBSD.dist.tests
 --- a/etc/mtree/NetBSD.dist.tests	Sat Oct 04 12:51:22 2025 +0000
 +++ b/etc/mtree/NetBSD.dist.tests	Sat Oct 04 13:38:28 2025 +0000
 @@ -126,6 +126,7 @@
  ./usr/libdata/debug/usr/tests/lib/libprop
  ./usr/libdata/debug/usr/tests/lib/libpthread
  ./usr/libdata/debug/usr/tests/lib/libpthread/dlopen
 +./usr/libdata/debug/usr/tests/lib/libpthread/weak
  ./usr/libdata/debug/usr/tests/lib/librefuse
  ./usr/libdata/debug/usr/tests/lib/librt
  ./usr/libdata/debug/usr/tests/lib/librumpclient
 @@ -341,6 +342,7 @@
  ./usr/tests/lib/libprop
  ./usr/tests/lib/libpthread
  ./usr/tests/lib/libpthread/dlopen
 +./usr/tests/lib/libpthread/weak
  ./usr/tests/lib/librefuse
  ./usr/tests/lib/librt
  ./usr/tests/lib/librumpclient
 diff -r 35a38791da7a -r 482501fe3793 tests/lib/libpthread/Makefile
 --- a/tests/lib/libpthread/Makefile	Sat Oct 04 12:51:22 2025 +0000
 +++ b/tests/lib/libpthread/Makefile	Sat Oct 04 13:38:28 2025 +0000
 @@ -69,5 +69,6 @@ FILESDIR=3D	${TESTSDIR}
  FILES=3D		d_mach
 =20
  SUBDIR=3D		dlopen
 +SUBDIR=3D		weak
 =20
  .include <bsd.test.mk>
 diff -r 35a38791da7a -r 482501fe3793 tests/lib/libpthread/weak/Makefile
 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
 +++ b/tests/lib/libpthread/weak/Makefile	Sat Oct 04 13:38:28 2025 +0000
 @@ -0,0 +1,8 @@
 +#	$NetBSD$
 +#
 +
 +SUBDIR+=3D	lib
 +SUBDIR+=3D	.WAIT
 +SUBDIR+=3D	test
 +
 +.include <bsd.subdir.mk>
 diff -r 35a38791da7a -r 482501fe3793 tests/lib/libpthread/weak/Makefile.inc
 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
 +++ b/tests/lib/libpthread/weak/Makefile.inc	Sat Oct 04 13:38:28 2025 +0000
 @@ -0,0 +1,1 @@
 +.include "${.PARSEDIR}/../../Makefile.inc"
 diff -r 35a38791da7a -r 482501fe3793 tests/lib/libpthread/weak/lib/Makefile
 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
 +++ b/tests/lib/libpthread/weak/lib/Makefile	Sat Oct 04 13:38:28 2025 +0000
 @@ -0,0 +1,20 @@
 +#	$NetBSD$
 +#
 +
 +MKPROFILE=3D	no		# XXX hack -- should be NOPROFILE
 +NOLINT=3D		# defined
 +NOMAN=3D		# defined
 +NOSTATICLIB=3D	# defined
 +
 +LIB=3D		h_pthread_weak
 +SRCS+=3D		h_pthread_weak.c
 +
 +LDADD+=3D		-latf-c
 +
 +LIBDIR=3D		${TESTSBASE}/lib/libpthread/weak
 +SHLIBDIR=3D	${TESTSBASE}/lib/libpthread/weak
 +SHLIB_MAJOR=3D	1
 +
 +LIBISCXX=3D	yes
 +
 +.include <bsd.lib.mk>
 diff -r 35a38791da7a -r 482501fe3793 tests/lib/libpthread/weak/lib/h_pthrea=
 d_weak.c
 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
 +++ b/tests/lib/libpthread/weak/lib/h_pthread_weak.c	Sat Oct 04 13:38:28 20=
 25 +0000
 @@ -0,0 +1,83 @@
 +/*	$NetBSD$	*/
 +
 +/*-
 + * Copyright (c) 2025 The NetBSD Foundation, Inc.
 + * All rights reserved.
 + *
 + * Redistribution and use in source and binary forms, with or without
 + * modification, are permitted provided that the following conditions
 + * are met:
 + * 1. Redistributions of source code must retain the above copyright
 + *    notice, this list of conditions and the following disclaimer.
 + * 2. Redistributions in binary form must reproduce the above copyright
 + *    notice, this list of conditions and the following disclaimer in the
 + *    documentation and/or other materials provided with the distribution.
 + *
 + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTO=
 RS
 + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIM=
 ITED
 + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICU=
 LAR
 + * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTO=
 RS
 + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF =
 THE
 + * POSSIBILITY OF SUCH DAMAGE.
 + */
 +
 +#include <sys/cdefs.h>
 +__RCSID("$NetBSD$");
 +
 +#define	_PTHREAD_CREATE_WEAK
 +
 +#include "h_pthread_weak.h"
 +
 +#include <atf-c.h>
 +#include <pthread.h>
 +
 +#include "h_macros.h"
 +
 +static void *
 +start(void *cookie)
 +{
 +	return cookie;
 +}
 +
 +void
 +test_mutex(void)
 +{
 +	pthread_mutex_t mtx;
 +
 +	RZ(pthread_mutex_init(&mtx, NULL));
 +	RZ(pthread_mutex_lock(&mtx));
 +	RZ(pthread_mutex_unlock(&mtx));
 +	RZ(pthread_mutex_destroy(&mtx));
 +}
 +
 +void
 +test_thread_creation(void)
 +{
 +	int cookie =3D 123;
 +	pthread_attr_t attr;
 +	pthread_t t;
 +	void *result;
 +
 +	RZ(pthread_attr_init(&attr));
 +	RZ(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE));
 +	RZ(pthread_create(&t, NULL, &start, &cookie));
 +	RZ(pthread_attr_destroy(&attr));
 +	RZ(pthread_join(t, &result));
 +	ATF_CHECK_EQ(result, &cookie);
 +}
 +
 +void
 +test_thread_creation_failure(void)
 +{
 +	int cookie =3D 123;
 +	pthread_t t;
 +	int error;
 +
 +	error =3D pthread_create(&t, NULL, &start, &cookie);
 +	ATF_CHECK_MSG(error !=3D 0, "pthread_create unexpectedly succeeded");
 +}
 diff -r 35a38791da7a -r 482501fe3793 tests/lib/libpthread/weak/lib/h_pthrea=
 d_weak.h
 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
 +++ b/tests/lib/libpthread/weak/lib/h_pthread_weak.h	Sat Oct 04 13:38:28 20=
 25 +0000
 @@ -0,0 +1,36 @@
 +/*	$NetBSD$	*/
 +
 +/*-
 + * Copyright (c) 2025 The NetBSD Foundation, Inc.
 + * All rights reserved.
 + *
 + * Redistribution and use in source and binary forms, with or without
 + * modification, are permitted provided that the following conditions
 + * are met:
 + * 1. Redistributions of source code must retain the above copyright
 + *    notice, this list of conditions and the following disclaimer.
 + * 2. Redistributions in binary form must reproduce the above copyright
 + *    notice, this list of conditions and the following disclaimer in the
 + *    documentation and/or other materials provided with the distribution.
 + *
 + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTO=
 RS
 + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIM=
 ITED
 + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICU=
 LAR
 + * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTO=
 RS
 + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF =
 THE
 + * POSSIBILITY OF SUCH DAMAGE.
 + */
 +
 +#ifndef	H_PTHREAD_WEAK_H
 +#define	H_PTHREAD_WEAK_H
 +
 +void test_mutex(void);
 +void test_thread_creation(void);
 +void test_thread_creation_failure(void);
 +
 +#endif	/* H_PTHREAD_WEAK_H */
 diff -r 35a38791da7a -r 482501fe3793 tests/lib/libpthread/weak/test/Makefile
 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
 +++ b/tests/lib/libpthread/weak/test/Makefile	Sat Oct 04 13:38:28 2025 +0000
 @@ -0,0 +1,23 @@
 +#	$NetBSD$
 +#
 +
 +TESTSDIR=3D	${TESTSBASE}/lib/libpthread/weak
 +
 +TESTS_C+=3D	t_pthread_weak_nothread
 +TESTS_C+=3D	t_pthread_weak_threaded
 +
 +CPPFLAGS+=3D	-I${.CURDIR}/../lib
 +
 +.include <bsd.own.mk>		# PRINTOBJDIR
 +
 +.if !defined(H_PTHREAD_WEAK_OBJDIR)
 +H_PTHREAD_WEAK_OBJDIR!=3D	cd ../lib && ${PRINTOBJDIR}
 +.MAKEOVERRIDES+=3D	H_PTHREAD_WEAK_OBJDIR
 +.endif
 +
 +LDADD+=3D		-L${H_PTHREAD_WEAK_OBJDIR}
 +LDADD+=3D		-Wl,-rpath,${TESTSBASE}/lib/libpthread/weak
 +LDADD+=3D		-lh_pthread_weak
 +LDADD.t_pthread_weak_threaded+=3D	-lpthread
 +
 +.include <bsd.test.mk>
 diff -r 35a38791da7a -r 482501fe3793 tests/lib/libpthread/weak/test/t_pthre=
 ad_weak_nothread.c
 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
 +++ b/tests/lib/libpthread/weak/test/t_pthread_weak_nothread.c	Sat Oct 04 1=
 3:38:28 2025 +0000
 @@ -0,0 +1,65 @@
 +/*	$NetBSD$	*/
 +
 +/*-
 + * Copyright (c) 2025 The NetBSD Foundation, Inc.
 + * All rights reserved.
 + *
 + * Redistribution and use in source and binary forms, with or without
 + * modification, are permitted provided that the following conditions
 + * are met:
 + * 1. Redistributions of source code must retain the above copyright
 + *    notice, this list of conditions and the following disclaimer.
 + * 2. Redistributions in binary form must reproduce the above copyright
 + *    notice, this list of conditions and the following disclaimer in the
 + *    documentation and/or other materials provided with the distribution.
 + *
 + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTO=
 RS
 + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIM=
 ITED
 + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICU=
 LAR
 + * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTO=
 RS
 + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF =
 THE
 + * POSSIBILITY OF SUCH DAMAGE.
 + */
 +
 +#include <sys/cdefs.h>
 +__RCSID("$NetBSD$");
 +
 +#include <atf-c.h>
 +
 +#include "h_pthread_weak.h"
 +
 +ATF_TC(mutex);
 +ATF_TC_HEAD(mutex, tc)
 +{
 +	atf_tc_set_md_var(tc, "descr",
 +	    "Test mutex usage in library with _PTHREAD_CREATE_WEAK");
 +}
 +ATF_TC_BODY(mutex, tc)
 +{
 +	test_mutex();
 +}
 +
 +ATF_TC(thread_creation_failure);
 +ATF_TC_HEAD(thread_creation_failure, tc)
 +{
 +	atf_tc_set_md_var(tc, "descr",
 +	    "Test pthread_create via library fails in no-thread application");
 +}
 +ATF_TC_BODY(thread_creation_failure, tc)
 +{
 +	test_thread_creation_failure();
 +}
 +
 +ATF_TP_ADD_TCS(tp)
 +{
 +	ATF_TP_ADD_TC(tp, mutex);
 +	ATF_TP_ADD_TC(tp, thread_creation_failure);
 +
 +	return atf_no_error();
 +}
 +
 diff -r 35a38791da7a -r 482501fe3793 tests/lib/libpthread/weak/test/t_pthre=
 ad_weak_threaded.c
 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
 +++ b/tests/lib/libpthread/weak/test/t_pthread_weak_threaded.c	Sat Oct 04 1=
 3:38:28 2025 +0000
 @@ -0,0 +1,65 @@
 +/*	$NetBSD$	*/
 +
 +/*-
 + * Copyright (c) 2025 The NetBSD Foundation, Inc.
 + * All rights reserved.
 + *
 + * Redistribution and use in source and binary forms, with or without
 + * modification, are permitted provided that the following conditions
 + * are met:
 + * 1. Redistributions of source code must retain the above copyright
 + *    notice, this list of conditions and the following disclaimer.
 + * 2. Redistributions in binary form must reproduce the above copyright
 + *    notice, this list of conditions and the following disclaimer in the
 + *    documentation and/or other materials provided with the distribution.
 + *
 + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTO=
 RS
 + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIM=
 ITED
 + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICU=
 LAR
 + * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTO=
 RS
 + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF =
 THE
 + * POSSIBILITY OF SUCH DAMAGE.
 + */
 +
 +#include <sys/cdefs.h>
 +__RCSID("$NetBSD$");
 +
 +#include <atf-c.h>
 +
 +#include "h_pthread_weak.h"
 +
 +ATF_TC(mutex);
 +ATF_TC_HEAD(mutex, tc)
 +{
 +	atf_tc_set_md_var(tc, "descr",
 +	    "Test mutex usage in library with _PTHREAD_CREATE_WEAK");
 +}
 +ATF_TC_BODY(mutex, tc)
 +{
 +	test_mutex();
 +}
 +
 +ATF_TC(thread_creation);
 +ATF_TC_HEAD(thread_creation, tc)
 +{
 +	atf_tc_set_md_var(tc, "descr",
 +	    "Test pthread_create via library in threaded application");
 +}
 +ATF_TC_BODY(thread_creation, tc)
 +{
 +	test_thread_creation();
 +}
 +
 +ATF_TP_ADD_TCS(tp)
 +{
 +	ATF_TP_ADD_TC(tp, mutex);
 +	ATF_TP_ADD_TC(tp, thread_creation);
 +
 +	return atf_no_error();
 +}
 +
 # HG changeset patch
 # User Taylor R Campbell <riastradh@NetBSD.org>
 # Date 1759587558 0
 #      Sat Oct 04 14:19:18 2025 +0000
 # Branch trunk
 # Node ID 14dfe4989904762502528845ad2a5d8836941afd
 # Parent  482501fe3793ece2812ad62746d01f89c513873d
 # EXP-Topic riastradh-pr59685-libcryptolibpthreadstubs
 openssl: Stop dragging libpthread into every libcrypto user.

 With the new _NETBSD_PTHREAD_CREATE_WEAK, libcrypto can have a call
 to pthread_create without linking against libpthread, so it is not
 necessary to link all libcrypto users against libpthread too.

 Applications that link against libcrypto but not libpthread can't use
 threaded OpenSSL functionality, of course -- OSSL_set_max_threads
 will always fail in such applications.

 This reverts all the makefile churn that I found for unnecessary
 libpthread linkage since the openssl 3.5 import.

 PR lib/59685: libcrypto should not depend on libpthread

 diff -r 482501fe3793 -r 14dfe4989904 crypto/external/apache2/openssl/bin/Ma=
 kefile
 --- a/crypto/external/apache2/openssl/bin/Makefile	Sat Oct 04 13:38:28 2025=
  +0000
 +++ b/crypto/external/apache2/openssl/bin/Makefile	Sat Oct 04 14:19:18 2025=
  +0000
 @@ -65,7 +65,6 @@ verify.c \
  version.c \
  x509.c \
 =20
 -CPPFLAGS+=3D -pthread
  CPPFLAGS+=3D -I${OPENSSLSRC} -I${.CURDIR}/../include
  CPPFLAGS+=3D -I${OPENSSLSRC}/include -I${OPENSSLSRC}/apps/include
 =20
 @@ -74,8 +73,8 @@ PROGDPLIBS+=3D    apps ${OPENSSLSRC}/../li
  PROGDPLIBS+=3D    ssl ${OPENSSLSRC}/../lib/libssl
  PROGDPLIBS+=3D    crypto ${OPENSSLSRC}/../lib/libcrypto
 =20
 -LDADD+=3D	-lcrypt -lpthread
 -DPADD+=3D	${LIBCRYPT} ${LIBPTHREAD}
 +LDADD+=3D	-lcrypt
 +DPADD+=3D	${LIBCRYPT}
 =20
  CRYPTODIST=3D	${NETBSDSRCDIR}/crypto
  .include "${NETBSDSRCDIR}/crypto/Makefile.openssl"
 diff -r 482501fe3793 -r 14dfe4989904 crypto/external/apache2/openssl/dist/c=
 rypto/thread/api.c
 --- a/crypto/external/apache2/openssl/dist/crypto/thread/api.c	Sat Oct 04 1=
 3:38:28 2025 +0000
 +++ b/crypto/external/apache2/openssl/dist/crypto/thread/api.c	Sat Oct 04 1=
 4:19:18 2025 +0000
 @@ -62,6 +62,15 @@ int OSSL_set_max_threads(OSSL_LIB_CTX *c
      tdata =3D OSSL_LIB_CTX_GET_THREADS(ctx);
      if (tdata =3D=3D NULL)
          return 0;
 +#ifdef __NetBSD__
 +    /*
 +     * Applications must link against libpthread in order to enable
 +     * openssl thread support.
 +     */
 +    extern int __isthreaded;	/* XXX */
 +    if (!__isthreaded)
 +        return 0;
 +#endif
 =20
      ossl_crypto_mutex_lock(tdata->lock);
      tdata->max_threads =3D max_threads;
 diff -r 482501fe3793 -r 14dfe4989904 crypto/external/apache2/openssl/lib/li=
 bcrypto/Makefile
 --- a/crypto/external/apache2/openssl/lib/libcrypto/Makefile	Sat Oct 04 13:=
 38:28 2025 +0000
 +++ b/crypto/external/apache2/openssl/lib/libcrypto/Makefile	Sat Oct 04 14:=
 19:18 2025 +0000
 @@ -25,7 +25,6 @@ USE_FIPS=3D	no
  .include <bsd.own.mk>
  .include <bsd.shlib.mk>
 =20
 -CPPFLAGS+=3D -pthread
  CPPFLAGS+=3D -Dlib${LIB} -I. -I${OPENSSLSRC}/crypto -I${OPENSSLSRC}
  CPPFLAGS+=3D -I${OPENSSLSRC}/include -I${OPENSSLSRC}/crypto/include
  CPPFLAGS+=3D -I${OPENSSLSRC}/crypto/asn1 -I${OPENSSLSRC}/crypto/evp
 @@ -51,7 +50,6 @@ CPPFLAGS+=3D -I${OPENSSLSRC}/providers/imp
 =20
  AFLAGS+=3D-DELF
  LIBDPLIBS+=3D crypt ${NETBSDSRCDIR}/lib/libcrypt
 -LIBDPLIBS+=3D pthread ${NETBSDSRCDIR}/lib/libpthread
 =20
  OS_VERSION!=3D ${HOST_SH} ${NETBSDSRCDIR}/sys/conf/osrelease.sh
 =20
 diff -r 482501fe3793 -r 14dfe4989904 crypto/external/apache2/openssl/lib/li=
 bcrypto/thread.inc
 --- a/crypto/external/apache2/openssl/lib/libcrypto/thread.inc	Sat Oct 04 1=
 3:38:28 2025 +0000
 +++ b/crypto/external/apache2/openssl/lib/libcrypto/thread.inc	Sat Oct 04 1=
 4:19:18 2025 +0000
 @@ -16,3 +16,5 @@ SRCS +=3D ${THREAD_SRCS}
  CPPFLAGS.${cryptosrc} +=3D -I${OPENSSLSRC}/crypto/thread
  CPPFLAGS.${cryptosrc} +=3D -I${OPENSSLSRC}/crypto/thread/arch ${THREADCPPF=
 LAGS}
  .endfor
 +
 +CPPFLAGS.thread_posix.c+=3D	-D_NETBSD_PTHREAD_CREATE_WEAK
 diff -r 482501fe3793 -r 14dfe4989904 crypto/external/apache2/openssl/lib/li=
 bssl/thread.inc
 --- a/crypto/external/apache2/openssl/lib/libssl/thread.inc	Sat Oct 04 13:3=
 8:28 2025 +0000
 +++ b/crypto/external/apache2/openssl/lib/libssl/thread.inc	Sat Oct 04 14:1=
 9:18 2025 +0000
 @@ -11,3 +11,5 @@ SRCS +=3D ${THREAD_SRCS}
  CPPFLAGS.${cryptosrc} +=3D -I${OPENSSLSRC}/crypto/thread
  CPPFLAGS.${cryptosrc} +=3D -I${OPENSSLSRC}/crypto/thread/arch ${THREADCPPF=
 LAGS}
  .endfor
 +
 +CPPFLAGS.thread_posix.c+=3D	-D_NETBSD_PTHREAD_CREATE_WEAK
 diff -r 482501fe3793 -r 14dfe4989904 crypto/external/bsd/heimdal/Makefile.i=
 nc
 --- a/crypto/external/bsd/heimdal/Makefile.inc	Sat Oct 04 13:38:28 2025 +00=
 00
 +++ b/crypto/external/bsd/heimdal/Makefile.inc	Sat Oct 04 14:19:18 2025 +00=
 00
 @@ -22,8 +22,8 @@ DPLIBROKEN=3D	roken ${HEIMBASE}/lib/librok
  DPLIBSL=3D	sl ${HEIMBASE}/lib/libsl
  DPLIBVERS=3D	vers ${HEIMBASE}/lib/libvers
  DPLIBWIND=3D	wind ${HEIMBASE}/lib/libwind
 -KRB5LDADD=3D	-lcrypto -lcrypt -lpthread
 -KRB5DPADD=3D	${LIBCRYPTO} ${LIBCRYPT} ${LIBPTHREAD}
 +KRB5LDADD=3D	-lcrypto -lcrypt
 +KRB5DPADD=3D	${LIBCRYPTO} ${LIBCRYPT}
  HDBLDADD=3D	-lsqlite3 -lm
  HDBDPADD=3D	${LIBSQLITE3} ${LIBM}
 =20
 diff -r 482501fe3793 -r 14dfe4989904 crypto/external/bsd/heimdal/bin/hxtool=
 /Makefile
 --- a/crypto/external/bsd/heimdal/bin/hxtool/Makefile	Sat Oct 04 13:38:28 2=
 025 +0000
 +++ b/crypto/external/bsd/heimdal/bin/hxtool/Makefile	Sat Oct 04 14:19:18 2=
 025 +0000
 @@ -20,5 +20,5 @@ COPTS.hxtool.c+=3D -Wno-error=3Ddeprecated-d
  .include <${HEIMBASE}/Makefile.rules.inc>
  .include <bsd.prog.mk>
 =20
 -LDADD+=3D -lcrypto -ledit -lterminfo -lpthread
 -DPADD+=3D ${LIBCRYPTO} ${LIBEDIT} ${LIBTERMINFO} ${LIBPTHREAD}
 +LDADD+=3D -lcrypto -ledit -lterminfo
 +DPADD+=3D ${LIBCRYPTO} ${LIBEDIT} ${LIBTERMINFO}
 diff -r 482501fe3793 -r 14dfe4989904 crypto/external/bsd/netpgp/bin/Makefil=
 e.inc
 --- a/crypto/external/bsd/netpgp/bin/Makefile.inc	Sat Oct 04 13:38:28 2025 =
 +0000
 +++ b/crypto/external/bsd/netpgp/bin/Makefile.inc	Sat Oct 04 14:19:18 2025 =
 +0000
 @@ -12,5 +12,5 @@ LIBMJDIR!=3D	cd ${.PARSEDIR}/../libmj && $
  LDADD+=3D		-L${LIBMJDIR} -lmj
  DPADD+=3D		${LIBMJDIR}/libmj.a
 =20
 -LDADD+=3D		-lcrypto -lz -lbz2 -lpthread
 -DPADD+=3D		${LIBCRYPTO} ${LIBZ} ${LIBBZ2} ${LIBPTHREAD}
 +LDADD+=3D		-lcrypto -lz -lbz2
 +DPADD+=3D		${LIBCRYPTO} ${LIBZ} ${LIBBZ2}
 diff -r 482501fe3793 -r 14dfe4989904 crypto/external/bsd/openssh/bin/Makefi=
 le.inc
 --- a/crypto/external/bsd/openssh/bin/Makefile.inc	Sat Oct 04 13:38:28 2025=
  +0000
 +++ b/crypto/external/bsd/openssh/bin/Makefile.inc	Sat Oct 04 14:19:18 2025=
  +0000
 @@ -8,7 +8,6 @@ PROGDPLIBS+=3D \
      ssh ${CRYPTOBSD}/openssh/lib \
      crypto ${CRYPTOBSD:H}/${EXTERNAL_OPENSSL_SUBDIR}/lib/libcrypto \
      crypt ${NETBSDSRCDIR}/lib/libcrypt \
 -    z ${NETBSDSRCDIR}/lib/libz \
 -    pthread ${NETBSDSRCDIR}/lib/libpthread
 +    z ${NETBSDSRCDIR}/lib/libz
 =20
  .include "${.PARSEDIR}/../Makefile.inc"
 diff -r 482501fe3793 -r 14dfe4989904 external/bsd/libfido2/bin/Makefile.inc
 --- a/external/bsd/libfido2/bin/Makefile.inc	Sat Oct 04 13:38:28 2025 +0000
 +++ b/external/bsd/libfido2/bin/Makefile.inc	Sat Oct 04 14:19:18 2025 +0000
 @@ -4,6 +4,5 @@
 =20
  .PATH: ${DIST}/tools ${DIST}/man ${DIST}/openbsd-compat
 =20
 -LDADD+=3D-lfido2 -lcbor -lusbhid -lcrypto -lz -lm -lpthread
 -DPADD+=3D${LIBFIDO2} ${LIBCBOR} ${LIBUSBHID} ${LIBCRYPTO} ${LIBZ} ${LIBM} \
 -    ${LIBPTHREAD}
 +LDADD+=3D-lfido2 -lcbor -lusbhid -lcrypto -lz -lm
 +DPADD+=3D${LIBFIDO2} ${LIBCBOR} ${LIBUSBHID} ${LIBCRYPTO} ${LIBZ} ${LIBM}
 diff -r 482501fe3793 -r 14dfe4989904 external/bsd/nsd/Makefile.inc
 --- a/external/bsd/nsd/Makefile.inc	Sat Oct 04 13:38:28 2025 +0000
 +++ b/external/bsd/nsd/Makefile.inc	Sat Oct 04 14:19:18 2025 +0000
 @@ -23,7 +23,6 @@ DPLIBS+=3D ssl ${NETBSDSRCDIR}/crypto/exte
  DPLIBS+=3D crypto ${NETBSDSRCDIR}/crypto/external/${EXTERNAL_OPENSSL_SUBDI=
 R}/lib/libcrypto
  DPLIBS+=3D crypt ${NETBSDSRCDIR}/lib/libcrypt
  DPLIBS+=3D util ${NETBSDSRCDIR}/lib/libutil
 -DPLIBS+=3D pthread ${NETBSDSRCDIR}/lib/libpthread
 =20
  __subst: .USE
  	${TOOL_SED} \
 diff -r 482501fe3793 -r 14dfe4989904 external/bsd/ntp/Makefile.inc
 --- a/external/bsd/ntp/Makefile.inc	Sat Oct 04 13:38:28 2025 +0000
 +++ b/external/bsd/ntp/Makefile.inc	Sat Oct 04 14:19:18 2025 +0000
 @@ -35,8 +35,8 @@ LIBPARSE!=3D	cd ${.CURDIR}/../../lib/libpa
  LDADD+=3D		-L${LIBNTP} -lntp -L${LIBOPTS} -lopts
  DPADD+=3D		${LIBNTP}/libntp.a ${LIBOPTS}/libopts.a
 =20
 -LDADD+=3D		-lcrypto -lcrypt -lpthread
 -DPADD+=3D		${LIBCRYPTO} ${LIBCRYPT} ${LIBPTHREAD}
 +LDADD+=3D		-lcrypto -lcrypt
 +DPADD+=3D		${LIBCRYPTO} ${LIBCRYPT}
 =20
  .if ${MKMDNS:Uno} !=3D "no"
  CPPFLAGS+=3D-DHAVE_DNSREGISTRATION=3D1
 diff -r 482501fe3793 -r 14dfe4989904 external/bsd/pam-u2f/bin/pamu2fcfg/Mak=
 efile
 --- a/external/bsd/pam-u2f/bin/pamu2fcfg/Makefile	Sat Oct 04 13:38:28 2025 =
 +0000
 +++ b/external/bsd/pam-u2f/bin/pamu2fcfg/Makefile	Sat Oct 04 14:19:18 2025 =
 +0000
 @@ -16,9 +16,8 @@ PROG=3Dpamu2fcfg
  SRCS=3Dpamu2fcfg.c cmdline.c b64.c readpassphrase.c explicit_bzero.c util.c
  COPTS.util.c +=3D -Wno-error=3Dstack-protector
 =20
 -LDADD+=3D-lpam -lfido2 -lcbor -lusbhid -lcrypto -lm -lpthread
 -DPADD+=3D${LIBPAM} ${LIBFIDO2} ${LIBCBOR} ${LIBUSBHID} ${LIBCRYPTO} ${LIBM=
 } \
 -    ${LIBPTHREAD}
 +LDADD+=3D-lpam -lfido2 -lcbor -lusbhid -lcrypto -lm
 +DPADD+=3D${LIBPAM} ${LIBFIDO2} ${LIBCBOR} ${LIBUSBHID} ${LIBCRYPTO} ${LIBM}
 =20
  pamu2fcfg.1:
  	asciidoc -b docbook45 -d manpage -o pamu2fcfg.1.xml ../../dist/man/pamu2f=
 cfg.1.txt
 diff -r 482501fe3793 -r 14dfe4989904 external/bsd/ppp/usr.sbin/pppd/Makefile
 --- a/external/bsd/ppp/usr.sbin/pppd/Makefile	Sat Oct 04 13:38:28 2025 +0000
 +++ b/external/bsd/ppp/usr.sbin/pppd/Makefile	Sat Oct 04 14:19:18 2025 +0000
 @@ -64,8 +64,6 @@ DPADD+=3D${LIBPAM} ${PAM_STATIC_DPADD}
 =20
  LDADD+=3D -lpcap -lcrypt -lssl -lcrypto -lutil -Wl,--export-dynamic
  DPADD+=3D ${LIBPCAP} ${LIBCRYPT} ${LIBSSL} ${LIBCRYPTO} ${LIBUTIL}
 -LDADD+=3D -lpthread
 -DPADD+=3D ${LIBPTHREAD}
 =20
  .for f in chap-md5 chap_ms eap
  COPTS.${f}.c+=3D	-Wno-pointer-sign
 diff -r 482501fe3793 -r 14dfe4989904 external/bsd/tcpdump/bin/Makefile
 --- a/external/bsd/tcpdump/bin/Makefile	Sat Oct 04 13:38:28 2025 +0000
 +++ b/external/bsd/tcpdump/bin/Makefile	Sat Oct 04 14:19:18 2025 +0000
 @@ -211,8 +211,8 @@ CPPFLAGS+=3D-DHAVE_OS_IPV6_SUPPORT=3D1
  .endif
 =20
  CPPFLAGS+=3D-DHAVE_LIBCRYPTO=3D1 -DHAVE_OPENSSL_EVP_H=20
 -LDADD+=3D	-lcrypto -lcrypt -lpthread
 -DPADD+=3D	${LIBCRYPTO} ${LIBCRYPT} ${LIBPTHREAD}
 +LDADD+=3D	-lcrypto -lcrypt
 +DPADD+=3D	${LIBCRYPTO} ${LIBCRYPT}
 =20
  CLEANFILES+=3D	version.c tcpdump.8
 =20
 diff -r 482501fe3793 -r 14dfe4989904 external/bsd/wpa/bin/hostapd/Makefile
 --- a/external/bsd/wpa/bin/hostapd/Makefile	Sat Oct 04 13:38:28 2025 +0000
 +++ b/external/bsd/wpa/bin/hostapd/Makefile	Sat Oct 04 14:19:18 2025 +0000
 @@ -251,8 +251,8 @@ ikev2.c \
  tncs.c
 =20
 =20
 -DPADD+=3D ${LIBSSL} ${LIBCRYPTO} ${LIBDES} ${LIBPTHREAD}
 -LDADD+=3D -lssl -lcrypto -ldes -lpthread
 +DPADD+=3D ${LIBSSL} ${LIBCRYPTO} ${LIBDES}
 +LDADD+=3D -lssl -lcrypto -ldes
  .else
  CPPFLAGS+=3D -DINTERNAL_AES -DINTERNAL_MD5 -DINTERNAL_SHA1 -DCONFIG_NO_PBK=
 DF2
  CPPFLAGS+=3D -DCONFIG_CRYPTO_INTERNAL
 diff -r 482501fe3793 -r 14dfe4989904 external/bsd/wpa/bin/wpa_passphrase/Ma=
 kefile
 --- a/external/bsd/wpa/bin/wpa_passphrase/Makefile	Sat Oct 04 13:38:28 2025=
  +0000
 +++ b/external/bsd/wpa/bin/wpa_passphrase/Makefile	Sat Oct 04 14:19:18 2025=
  +0000
 @@ -14,8 +14,8 @@ wpabuf.c
 =20
  .if !defined(NO_CRYPT) && !defined(NO_OPENSSL) && !defined(RELEASE_CRUNCH)
  SRCS+=3D crypto_openssl.c
 -DPADD+=3D ${LIBSSL} ${LIBCRYPTO} ${LIBDES} ${LIBPTHREAD}
 -LDADD+=3D -lssl -lcrypto -ldes -lpthread
 +DPADD+=3D ${LIBSSL} ${LIBCRYPTO} ${LIBDES}
 +LDADD+=3D -lssl -lcrypto -ldes
  .else
  CPPFLAGS+=3D -DINTERNAL_AES -DINTERNAL_MD5 -DINTERNAL_SHA1
  CPPFLAGS+=3D -DCONFIG_CRYPTO_INTERNAL
 diff -r 482501fe3793 -r 14dfe4989904 external/bsd/wpa/bin/wpa_supplicant/Ma=
 kefile
 --- a/external/bsd/wpa/bin/wpa_supplicant/Makefile	Sat Oct 04 13:38:28 2025=
  +0000
 +++ b/external/bsd/wpa/bin/wpa_supplicant/Makefile	Sat Oct 04 14:19:18 2025=
  +0000
 @@ -176,8 +176,8 @@ aes-omac1.c \
  #CPPFLAGS+=3D -DEAP_FAST
  #SRCS+=3D	eap_fast.c
 =20
 -DPADD+=3D ${LIBSSL} ${LIBCRYPTO} ${LIBDES} ${LIBPTHREAD}
 -LDADD+=3D -lssl -lcrypto -ldes -lpthread
 +DPADD+=3D ${LIBSSL} ${LIBCRYPTO} ${LIBDES}
 +LDADD+=3D -lssl -lcrypto -ldes
  .else
  CPPFLAGS+=3D -DINTERNAL_AES -DINTERNAL_MD5 -DINTERNAL_SHA1 -DCONFIG_NO_PBK=
 DF2
  SRCS+=3D tls_none.c sha1-internal.c md5-internal.c aes-xinternal.c rc4.c
 diff -r 482501fe3793 -r 14dfe4989904 games/factor/Makefile
 --- a/games/factor/Makefile	Sat Oct 04 13:38:28 2025 +0000
 +++ b/games/factor/Makefile	Sat Oct 04 14:19:18 2025 +0000
 @@ -10,8 +10,8 @@ SRCS=3D	factor.c pr_tbl.c
  CPPFLAGS+=3D-I${PRIMES}
 =20
  CPPFLAGS+=3D-DHAVE_OPENSSL
 -LDADD+=3D	-lcrypto -lcrypt -lpthread
 -DPADD+=3D	${LIBCRYPTO} ${LIBCRYPT} ${LIBPTHREAD}
 +LDADD+=3D	-lcrypto -lcrypt
 +DPADD+=3D	${LIBCRYPTO} ${LIBCRYPT}
 =20
  COPTS.factor.c+=3D -Wno-error=3Ddeprecated-declarations
 =20
 diff -r 482501fe3793 -r 14dfe4989904 libexec/httpd/Makefile
 --- a/libexec/httpd/Makefile	Sat Oct 04 13:38:28 2025 +0000
 +++ b/libexec/httpd/Makefile	Sat Oct 04 14:19:18 2025 +0000
 @@ -52,8 +52,8 @@ CPPFLAGS+=3D	-DHAVE_NBUTIL_H
  LDADD+=3D		-lnbutil
  .endif
 =20
 -LDADD+=3D	-lssl -lcrypto -lpthread
 -DPADD+=3D	${LIBSSL} ${LIBCRYPTO} ${LIBPTHREAD}
 +LDADD+=3D	-lssl -lcrypto
 +DPADD+=3D	${LIBSSL} ${LIBCRYPTO}
 =20
  #
  # Build release things.
 diff -r 482501fe3793 -r 14dfe4989904 share/mk/bsd.prog.mk
 --- a/share/mk/bsd.prog.mk	Sat Oct 04 13:38:28 2025 +0000
 +++ b/share/mk/bsd.prog.mk	Sat Oct 04 14:19:18 2025 +0000
 @@ -205,19 +205,19 @@ LIB${_lib:tu}=3D	${DESTDIR}/usr/lib/lib${_
  LIBKRB5_LDADD+=3D -lkrb5 -lcom_err \
  	-lhx509 -lcrypto -lasn1 \
  	-lwind -lheimbase -lcom_err -lroken \
 -	-lcrypt -lutil -lpthread
 +	-lcrypt -lutil
  LIBKRB5_DPADD+=3D ${LIBKRB5} ${LIBCOM_ERR} \
  	${LIBHX509} ${LIBCRYPTO} ${LIBASN1} \
  	${LIBWIND} ${LIBHEIMBASE} ${LIBCOM_ERR} ${LIBROKEN} \
 -	${LIBCRYPT} ${LIBUTIL} ${LIBPTHREAD}
 +	${LIBCRYPT} ${LIBUTIL}
  LIBGSSAPI_LDADD+=3D -lgssapi -lheimntlm ${LIBKRB5_LDADD}
  LIBGSSAPI_DPADD+=3D ${LIBGSSAPI} ${LIBHEIMNTLM} ${LIBKRB5_DPADD}
  .endif
 =20
  .if (${MKLDAP} !=3D "no")
 -LIBLDAP_LDADD+=3D -lldap -llber ${LIBGSSAPI_LDADD} -lssl -lcrypto -lpthread
 +LIBLDAP_LDADD+=3D -lldap -llber ${LIBGSSAPI_LDADD} -lssl -lcrypto
  LIBLDAP_DPADD+=3D ${LIBLDAP} ${LIBLBER} ${LIBGSSAPI_DPADD} ${LIBSSL} \
 -    ${LIBCRYPTO} ${LIBPTHREAD}
 +    ${LIBCRYPTO}
  .endif
 =20
  # PAM applications, if linked statically, need more libraries
 @@ -226,10 +226,10 @@ PAM_STATIC_LDADD+=3D -lssh
  PAM_STATIC_DPADD+=3D ${LIBSSH}
  .if (${MKKERBEROS} !=3D "no")
  PAM_STATIC_LDADD+=3D -lkafs -lkrb5 -lhx509 -lwind -lasn1 \
 -	-lroken -lcom_err -lheimbase -lcrypto -lsqlite3 -lpthread -lm
 +	-lroken -lcom_err -lheimbase -lcrypto -lsqlite3 -lm
  PAM_STATIC_DPADD+=3D ${LIBKAFS} ${LIBKRB5} ${LIBHX509} ${LIBWIND} ${LIBASN=
 1} \
  	${LIBROKEN} ${LIBCOM_ERR} ${LIBHEIMBASE} ${LIBCRYPTO} ${LIBSQLITE3} \
 -	${LIBPTHREAD} ${LIBM}
 +	${LIBM}
  .endif
  .if (${MKSKEY} !=3D "no")
  PAM_STATIC_LDADD+=3D -lskey
 diff -r 482501fe3793 -r 14dfe4989904 tests/crypto/libcrypto/Makefile
 --- a/tests/crypto/libcrypto/Makefile	Sat Oct 04 13:38:28 2025 +0000
 +++ b/tests/crypto/libcrypto/Makefile	Sat Oct 04 14:19:18 2025 +0000
 @@ -19,8 +19,8 @@ SUBDIR +=3D lhash sha x509v3
  TESTSDIR=3D	${TESTSBASE}/crypto/libcrypto
 =20
  TESTS_C+=3D		t_sha512trunc
 -DPADD.t_sha512trunc+=3D	${LIBCRYPTO} ${LIBPTHREAD}
 -LDADD.t_sha512trunc+=3D	-lcrypto -lpthread
 +DPADD.t_sha512trunc+=3D	${LIBCRYPTO}
 +LDADD.t_sha512trunc+=3D	-lcrypto
 =20
  .if ${HAVE_OPENSSL} =3D=3D 10
  TESTS_SH=3D	t_certs
 diff -r 482501fe3793 -r 14dfe4989904 tests/crypto/libcrypto/Makefile.inc
 --- a/tests/crypto/libcrypto/Makefile.inc	Sat Oct 04 13:38:28 2025 +0000
 +++ b/tests/crypto/libcrypto/Makefile.inc	Sat Oct 04 14:19:18 2025 +0000
 @@ -32,8 +32,8 @@ PROGDPLIBS+=3D	cryptotest ${OPENSSLSRC}/..
  .if ${HELPER_NAME} !=3D "threadstest"
  PROGDPLIBS+=3D	crypto ${OPENSSLSRC}/../lib/libcrypto
  .endif
 -DPADD_AFTER+=3D		${LIBCRYPT} ${LIBPTHREAD}
 -LDADD_AFTER+=3D		-lcrypt -lpthread
 +DPADD+=3D		${LIBCRYPT}
 +LDADD+=3D		-lcrypt
 =20
 =20
  .include <bsd.test.mk>
 diff -r 482501fe3793 -r 14dfe4989904 tests/crypto/libcrypto/dh/Makefile
 --- a/tests/crypto/libcrypto/dh/Makefile	Sat Oct 04 13:38:28 2025 +0000
 +++ b/tests/crypto/libcrypto/dh/Makefile	Sat Oct 04 14:19:18 2025 +0000
 @@ -3,7 +3,5 @@
  PROGDPLIBSSTATIC=3Dyes
  HELPER_NAME=3D	dhtest
  HELPER_DIR=3D	dh
 -DPADD+=3D ${LIBPTHREAD}
 -LDADD+=3D -lpthread
 =20
  .include <bsd.init.mk>
 diff -r 482501fe3793 -r 14dfe4989904 tests/lib/libc/hash/Makefile
 --- a/tests/lib/libc/hash/Makefile	Sat Oct 04 13:38:28 2025 +0000
 +++ b/tests/lib/libc/hash/Makefile	Sat Oct 04 14:19:18 2025 +0000
 @@ -6,8 +6,8 @@ TESTSDIR=3D	${TESTSBASE}/lib/libc/hash
 =20
  TESTS_C+=3D	t_sha2
  TESTS_C+=3D	t_hmac
 -LDADD.t_hmac+=3D	-lcrypto -lpthread
 -DDADD.t_hmac+=3D	${LIBCRYPTO} ${LIBPTHREAD}
 +LDADD.t_hmac+=3D	-lcrypto
 +DDADD.t_hmac+=3D	${LIBCRYPTO}
 =20
  TESTS_SH+=3D	t_hash
 =20
 diff -r 482501fe3793 -r 14dfe4989904 usr.bin/dc/Makefile
 --- a/usr.bin/dc/Makefile	Sat Oct 04 13:38:28 2025 +0000
 +++ b/usr.bin/dc/Makefile	Sat Oct 04 14:19:18 2025 +0000
 @@ -6,8 +6,8 @@ PROG=3D	dc
  SRCS=3D	main.c dc.c bcode.c inout.c mem.c stack.c
 =20
  WARNS=3D6
 -LDADD=3D	-lcrypto -lpthread
 -DPADD=3D	${LIBCRYPTO} ${LIBPTHREAD}
 +LDADD=3D	-lcrypto
 +DPADD=3D	${LIBCRYPTO}
 =20
  SUBDIR.roff+=3DUSD.doc
 =20
 diff -r 482501fe3793 -r 14dfe4989904 usr.bin/ftp/Makefile
 --- a/usr.bin/ftp/Makefile	Sat Oct 04 13:38:28 2025 +0000
 +++ b/usr.bin/ftp/Makefile	Sat Oct 04 14:19:18 2025 +0000
 @@ -20,8 +20,8 @@ CPPFLAGS+=3D-DNO_EDITCOMPLETE -DNO_ABOUT -
  LDADD+=3D	-ledit -lterminfo
  DPADD+=3D	${LIBEDIT} ${LIBTERMINFO}
  CPPFLAGS+=3D -DWITH_SSL
 -LDADD+=3D -lssl -lcrypto -lpthread
 -DPADD+=3D ${LIBSSL} ${LIBCRYPTO} ${LIBPTHREAD}
 +LDADD+=3D -lssl -lcrypto
 +DPADD+=3D ${LIBSSL} ${LIBCRYPTO}
  .endif
 =20
  .if (!defined(SMALLPROG) || defined(SMALLPROG_INET6)) && (${USE_INET6} !=
 =3D "no")
 diff -r 482501fe3793 -r 14dfe4989904 usr.bin/moduli/Makefile.inc
 --- a/usr.bin/moduli/Makefile.inc	Sat Oct 04 13:38:28 2025 +0000
 +++ b/usr.bin/moduli/Makefile.inc	Sat Oct 04 14:19:18 2025 +0000
 @@ -2,8 +2,8 @@
 =20
  .include <bsd.own.mk>
 =20
 -DPADD+=3D ${LIBCRYPTO} ${LIBPTHREAD}
 -LDADD+=3D -lcrypto -lpthread
 +DPADD+=3D ${LIBCRYPTO}
 +LDADD+=3D -lcrypto
 =20
  .if exists(${.CURDIR}/../../Makefile.inc)
  .include "${.CURDIR}/../../Makefile.inc"
 diff -r 482501fe3793 -r 14dfe4989904 usr.bin/nbsvtool/Makefile
 --- a/usr.bin/nbsvtool/Makefile	Sat Oct 04 13:38:28 2025 +0000
 +++ b/usr.bin/nbsvtool/Makefile	Sat Oct 04 14:19:18 2025 +0000
 @@ -1,8 +1,8 @@
  # $NetBSD: Makefile,v 1.4 2025/07/19 15:56:31 christos Exp $
 =20
  PROG=3D	nbsvtool
 -LDADD+=3D	-lcrypto -lpthread
 -DPADD+=3D	${LIBCRYPTO} ${LIBPTHREAD}
 +LDADD+=3D	-lcrypto
 +DPADD+=3D	${LIBCRYPTO}
  CPPFLAGS+=3D-DOPENSSL_API_COMPAT=3D0x10100000L
 =20
  .include <bsd.prog.mk>
 diff -r 482501fe3793 -r 14dfe4989904 usr.sbin/plainrsa-gen/Makefile
 --- a/usr.sbin/plainrsa-gen/Makefile	Sat Oct 04 13:38:28 2025 +0000
 +++ b/usr.sbin/plainrsa-gen/Makefile	Sat Oct 04 14:19:18 2025 +0000
 @@ -9,8 +9,8 @@ SRCS+=3D	plainrsa-gen.c
  MAN=3D	plainrsa-gen.8
 =20
  CPPFLAGS+=3D-DNOUSE_PRIVSEP
 -LDADD+=3D -lcrypto -lipsec -lpthread
 -DPADD+=3D ${LIBCRYPTO} ${LIBIPSEC} ${LIBPTHREAD}
 +LDADD+=3D -lcrypto -lipsec
 +DPADD+=3D ${LIBCRYPTO} ${LIBIPSEC}
 =20
  .include "${.CURDIR}/../racoon/Makefile.racoon"
 =20
 diff -r 482501fe3793 -r 14dfe4989904 usr.sbin/syslogd/Makefile
 --- a/usr.sbin/syslogd/Makefile	Sat Oct 04 13:38:28 2025 +0000
 +++ b/usr.sbin/syslogd/Makefile	Sat Oct 04 14:19:18 2025 +0000
 @@ -28,8 +28,8 @@ CPPFLAGS+=3D-DOPENSSL_API_COMPAT=3D0x1010000
  LDADD+=3D	-lwrap -lblocklist=20
  DPADD+=3D	${LIBWRAP} ${LIBBLOCKLIST}=20
 =20
 -LDADD+=3D	-lssl -lcrypto -lpthread
 -DPADD+=3D ${LIBSSL} ${LIBCRYPTO} ${LIBPTHREAD}
 +LDADD+=3D	-lssl -lcrypto
 +DPADD+=3D ${LIBSSL} ${LIBCRYPTO}
 =20
  # Overflow that appears impossible
  COPTS.syslogd.c+=3D        ${CC_WNO_FORMAT_TRUNCATION} ${CC_WNO_STRINGOP_T=
 RUNCATION}

 --=_aD0stfJJ+WVg8+9bTfy4bTTT5i9m1xYu--

From: "Taylor R Campbell" <riastradh@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/59685 CVS commit: src
Date: Mon, 6 Oct 2025 13:11:56 +0000

 Module Name:	src
 Committed By:	riastradh
 Date:		Mon Oct  6 13:11:56 UTC 2025

 Modified Files:
 	src/distrib/sets/lists/tests: mi
 	src/tests/usr.bin/cc: Makefile
 Added Files:
 	src/tests/usr.bin/cc: t_pthread_abuse.sh

 Log Message:
 libpthread: Test pthread_create link errors without -(l)pthread.

 Prompted by:

 PR lib/59685: libcrypto should not depend on libpthread


 To generate a diff of this commit:
 cvs rdiff -u -r1.1394 -r1.1395 src/distrib/sets/lists/tests/mi
 cvs rdiff -u -r1.9 -r1.10 src/tests/usr.bin/cc/Makefile
 cvs rdiff -u -r0 -r1.1 src/tests/usr.bin/cc/t_pthread_abuse.sh

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

From: "Taylor R Campbell" <riastradh@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/59685 CVS commit: src/lib
Date: Mon, 6 Oct 2025 13:12:30 +0000

 Module Name:	src
 Committed By:	riastradh
 Date:		Mon Oct  6 13:12:30 UTC 2025

 Modified Files:
 	src/lib/libc/include: reentrant.h
 	src/lib/libc/thread-stub: thread-stub.c
 	src/lib/libpthread: pthread.c pthread.h pthread_attr.c
 	    pthread_mi.expsym

 Log Message:
 libc: Expose some more pthread stubs.

 Additionally, provide the option for pthread.h to expose
 pthread_create so that libc can provide a weak stub for it, if you
 define _NETBSD_PTHREAD_CREATE_WEAK.

 This allows libraries to use the functions without linking against
 libpthread for applications that don't need threads.  For example,
 with OpenSSL's libcrypto, as long as you don't try to raise
 OSSL_set_max_threads above 0, it won't ever try pthread_create.

 New pthread.h macros defined:

 pthread_attr_destroy		__libc_thr_attr_destroy
 pthread_attr_init		__libc_thr_attr_init
 pthread_attr_setdetachstate	__libc_thr_attr_setdetachstate
 pthread_detach			__libc_thr_detach
 pthread_join			__libc_thr_join

 New pthread.h macros defined if _NETBSD_PTHREAD_CREATE_WEAK is
 defined first:

 pthread_create			__libc_thr_create

 New symbols defined by libc as weak aliases for stubs that always
 fail but can be overridden by libpthread:

 __libc_thr_attr_destroy
 __libc_thr_attr_init
 __libc_thr_attr_setdetachstate
 __libc_thr_detach
 __libc_thr_join

 Note that libc already defined __libc_thr_create.

 New internal stubs, not for overriding:

 __libc_thr_detach_stub
 __libc_thr_join_stub

 These were formerly called __libc_pthread_detach and
 __libc_pthread_join, respectively, and libc has defined weak aliases
 pthread_detach and pthread_join for them since 2013.  I retained all
 four of those symbols, but defined new ones in the __ namespace that
 match the pattern for other thread stubs to avoid raising questions
 about why the pattern seems to be broken.  I left a comment noting
 this fact too.

 New pthread strong aliases to override the libc symbols:

 __libc_thr_attr_destroy
 __libc_thr_attr_init
 __libc_thr_attr_setdetachstate
 __libc_thr_detach
 __libc_thr_join

 Note that pthread already defined a strong __libc_thr_create alias
 for the real pthread_create, so there is no need to add a new one.

 PR lib/59685: libcrypto should not depend on libpthread


 To generate a diff of this commit:
 cvs rdiff -u -r1.23 -r1.24 src/lib/libc/include/reentrant.h
 cvs rdiff -u -r1.33 -r1.34 src/lib/libc/thread-stub/thread-stub.c
 cvs rdiff -u -r1.187 -r1.188 src/lib/libpthread/pthread.c
 cvs rdiff -u -r1.41 -r1.42 src/lib/libpthread/pthread.h
 cvs rdiff -u -r1.21 -r1.22 src/lib/libpthread/pthread_attr.c
 cvs rdiff -u -r1.2 -r1.3 src/lib/libpthread/pthread_mi.expsym

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

From: "Taylor R Campbell" <riastradh@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/59685 CVS commit: src
Date: Mon, 6 Oct 2025 13:16:44 +0000

 Module Name:	src
 Committed By:	riastradh
 Date:		Mon Oct  6 13:16:44 UTC 2025

 Modified Files:
 	src/distrib/sets/lists/debug: mi shl.mi
 	src/distrib/sets/lists/tests: mi shl.mi
 	src/etc/mtree: NetBSD.dist.tests
 	src/tests/lib/libpthread: Makefile
 Added Files:
 	src/tests/lib/libpthread/weak: Makefile Makefile.inc
 	src/tests/lib/libpthread/weak/lib: Makefile h_pthread_weak.c
 	    h_pthread_weak.h
 	src/tests/lib/libpthread/weak/test: Makefile t_pthread_weak_nothread.c
 	    t_pthread_weak_threaded.c

 Log Message:
 libpthread: Test pthread stubs in threaded vs non-threaded programs.

 PR lib/59685: libcrypto should not depend on libpthread


 To generate a diff of this commit:
 cvs rdiff -u -r1.486 -r1.487 src/distrib/sets/lists/debug/mi
 cvs rdiff -u -r1.372 -r1.373 src/distrib/sets/lists/debug/shl.mi
 cvs rdiff -u -r1.1395 -r1.1396 src/distrib/sets/lists/tests/mi
 cvs rdiff -u -r1.16 -r1.17 src/distrib/sets/lists/tests/shl.mi
 cvs rdiff -u -r1.210 -r1.211 src/etc/mtree/NetBSD.dist.tests
 cvs rdiff -u -r1.19 -r1.20 src/tests/lib/libpthread/Makefile
 cvs rdiff -u -r0 -r1.1 src/tests/lib/libpthread/weak/Makefile \
     src/tests/lib/libpthread/weak/Makefile.inc
 cvs rdiff -u -r0 -r1.1 src/tests/lib/libpthread/weak/lib/Makefile \
     src/tests/lib/libpthread/weak/lib/h_pthread_weak.c \
     src/tests/lib/libpthread/weak/lib/h_pthread_weak.h
 cvs rdiff -u -r0 -r1.1 src/tests/lib/libpthread/weak/test/Makefile \
     src/tests/lib/libpthread/weak/test/t_pthread_weak_nothread.c \
     src/tests/lib/libpthread/weak/test/t_pthread_weak_threaded.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

From: "Leonardo Taccari" <leot@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/59685 CVS commit: src/tests/lib/libpthread
Date: Mon, 6 Oct 2025 14:54:05 +0000

 Module Name:	src
 Committed By:	leot
 Date:		Mon Oct  6 14:54:05 UTC 2025

 Modified Files:
 	src/tests/lib/libpthread: Makefile

 Log Message:
 libpthread: append to SUBDIR instead of overwrite it

 Noticed and from <riastradh>, thanks!

 PR lib/59685: libcrypto should not depend on libpthread


 To generate a diff of this commit:
 cvs rdiff -u -r1.20 -r1.21 src/tests/lib/libpthread/Makefile

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

From: "Taylor R Campbell" <riastradh@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/59685 CVS commit: src/tests/lib/libpthread
Date: Sat, 18 Oct 2025 20:27:23 +0000

 Module Name:	src
 Committed By:	riastradh
 Date:		Sat Oct 18 20:27:23 UTC 2025

 Modified Files:
 	src/tests/lib/libpthread: Makefile
 	src/tests/lib/libpthread/weak: Makefile
 Added Files:
 	src/tests/lib/libpthread/weak: t_pthread_weak_nothread.c
 	    t_pthread_weak_threaded.c
 Removed Files:
 	src/tests/lib/libpthread/weak/test: Makefile t_pthread_weak_nothread.c
 	    t_pthread_weak_threaded.c

 Log Message:
 tests/lib/libpthread: Fix tests in subdirectory.

 Need to use TESTS_SUBDIRS for this, not SUBDIR.  Avoid the extra
 nesting level while here; can make the library be a subdirectory of
 the directory where the tests live.

 PR lib/59685: libcrypto should not depend on libpthread


 To generate a diff of this commit:
 cvs rdiff -u -r1.21 -r1.22 src/tests/lib/libpthread/Makefile
 cvs rdiff -u -r1.1 -r1.2 src/tests/lib/libpthread/weak/Makefile
 cvs rdiff -u -r0 -r1.1 \
     src/tests/lib/libpthread/weak/t_pthread_weak_nothread.c \
     src/tests/lib/libpthread/weak/t_pthread_weak_threaded.c
 cvs rdiff -u -r1.2 -r0 src/tests/lib/libpthread/weak/test/Makefile
 cvs rdiff -u -r1.1 -r0 \
     src/tests/lib/libpthread/weak/test/t_pthread_weak_nothread.c \
     src/tests/lib/libpthread/weak/test/t_pthread_weak_threaded.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

From: "Taylor R Campbell" <riastradh@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/59685 CVS commit: src
Date: Sun, 19 Oct 2025 01:00:01 +0000

 Module Name:	src
 Committed By:	riastradh
 Date:		Sun Oct 19 01:00:00 UTC 2025

 Modified Files:
 	src/crypto/external/apache2/openssl/bin: Makefile
 	src/crypto/external/apache2/openssl/dist/crypto/thread: api.c
 	src/crypto/external/apache2/openssl/lib/libcrypto: Makefile thread.inc
 	src/crypto/external/apache2/openssl/lib/libssl: thread.inc
 	src/crypto/external/bsd/heimdal: Makefile.inc
 	src/crypto/external/bsd/heimdal/bin/hxtool: Makefile
 	src/crypto/external/bsd/netpgp/bin: Makefile.inc
 	src/crypto/external/bsd/openssh/bin: Makefile.inc
 	src/external/bsd/libfido2/bin: Makefile.inc
 	src/external/bsd/nsd: Makefile.inc
 	src/external/bsd/ntp: Makefile.inc
 	src/external/bsd/pam-u2f/bin/pamu2fcfg: Makefile
 	src/external/bsd/ppp/usr.sbin/pppd: Makefile
 	src/external/bsd/tcpdump/bin: Makefile
 	src/external/bsd/wpa/bin/hostapd: Makefile
 	src/external/bsd/wpa/bin/wpa_passphrase: Makefile
 	src/external/bsd/wpa/bin/wpa_supplicant: Makefile
 	src/games/factor: Makefile
 	src/libexec/httpd: Makefile
 	src/share/mk: bsd.prog.mk
 	src/tests/crypto/libcrypto: Makefile Makefile.inc
 	src/tests/crypto/libcrypto/dh: Makefile
 	src/tests/lib/libc/hash: Makefile
 	src/usr.bin/dc: Makefile
 	src/usr.bin/ftp: Makefile
 	src/usr.bin/moduli: Makefile.inc
 	src/usr.bin/nbsvtool: Makefile
 	src/usr.sbin/plainrsa-gen: Makefile
 	src/usr.sbin/syslogd: Makefile

 Log Message:
 openssl: Stop dragging libpthread into every libcrypto user.

 With the new _NETBSD_PTHREAD_CREATE_WEAK, libcrypto can have a call
 to pthread_create without linking against libpthread, so it is not
 necessary to link all libcrypto users against libpthread too.

 Applications that link against libcrypto but not libpthread can't use
 threaded OpenSSL functionality, of course -- OSSL_set_max_threads
 will always fail in such applications.

 This reverts all the makefile churn that I found for unnecessary
 libpthread linkage since the openssl 3.5 import.

 PR lib/59685: libcrypto should not depend on libpthread


 To generate a diff of this commit:
 cvs rdiff -u -r1.1 -r1.2 src/crypto/external/apache2/openssl/bin/Makefile
 cvs rdiff -u -r1.1.1.1 -r1.2 \
     src/crypto/external/apache2/openssl/dist/crypto/thread/api.c
 cvs rdiff -u -r1.2 -r1.3 \
     src/crypto/external/apache2/openssl/lib/libcrypto/Makefile
 cvs rdiff -u -r1.1 -r1.2 \
     src/crypto/external/apache2/openssl/lib/libcrypto/thread.inc
 cvs rdiff -u -r1.1 -r1.2 \
     src/crypto/external/apache2/openssl/lib/libssl/thread.inc
 cvs rdiff -u -r1.13 -r1.14 src/crypto/external/bsd/heimdal/Makefile.inc
 cvs rdiff -u -r1.7 -r1.8 src/crypto/external/bsd/heimdal/bin/hxtool/Makefile
 cvs rdiff -u -r1.1 -r1.2 src/crypto/external/bsd/netpgp/bin/Makefile.inc
 cvs rdiff -u -r1.7 -r1.8 src/crypto/external/bsd/openssh/bin/Makefile.inc
 cvs rdiff -u -r1.4 -r1.5 src/external/bsd/libfido2/bin/Makefile.inc
 cvs rdiff -u -r1.10 -r1.11 src/external/bsd/nsd/Makefile.inc
 cvs rdiff -u -r1.25 -r1.26 src/external/bsd/ntp/Makefile.inc
 cvs rdiff -u -r1.7 -r1.8 src/external/bsd/pam-u2f/bin/pamu2fcfg/Makefile
 cvs rdiff -u -r1.5 -r1.6 src/external/bsd/ppp/usr.sbin/pppd/Makefile
 cvs rdiff -u -r1.28 -r1.29 src/external/bsd/tcpdump/bin/Makefile
 cvs rdiff -u -r1.20 -r1.21 src/external/bsd/wpa/bin/hostapd/Makefile
 cvs rdiff -u -r1.7 -r1.8 src/external/bsd/wpa/bin/wpa_passphrase/Makefile
 cvs rdiff -u -r1.13 -r1.14 src/external/bsd/wpa/bin/wpa_supplicant/Makefile
 cvs rdiff -u -r1.16 -r1.17 src/games/factor/Makefile
 cvs rdiff -u -r1.36 -r1.37 src/libexec/httpd/Makefile
 cvs rdiff -u -r1.356 -r1.357 src/share/mk/bsd.prog.mk
 cvs rdiff -u -r1.17 -r1.18 src/tests/crypto/libcrypto/Makefile
 cvs rdiff -u -r1.13 -r1.14 src/tests/crypto/libcrypto/Makefile.inc
 cvs rdiff -u -r1.3 -r1.4 src/tests/crypto/libcrypto/dh/Makefile
 cvs rdiff -u -r1.5 -r1.6 src/tests/lib/libc/hash/Makefile
 cvs rdiff -u -r1.6 -r1.7 src/usr.bin/dc/Makefile
 cvs rdiff -u -r1.43 -r1.44 src/usr.bin/ftp/Makefile
 cvs rdiff -u -r1.3 -r1.4 src/usr.bin/moduli/Makefile.inc
 cvs rdiff -u -r1.4 -r1.5 src/usr.bin/nbsvtool/Makefile
 cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/plainrsa-gen/Makefile
 cvs rdiff -u -r1.38 -r1.39 src/usr.sbin/syslogd/Makefile

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

State-Changed-From-To: open->needs-pullups
State-Changed-By: riastradh@NetBSD.org
State-Changed-When: Sun, 19 Oct 2025 13:26:11 +0000
State-Changed-Why:
fixed in HEAD, needs pullup-11, inapplicable <11

Note: Normally removing a NEEDED entry (nixing -lpthread) would require
a libcrypto.so major bump, but currently this only affects a beta
branch and current since late July, and only for pthread symbols which
applications are unlikely to have accidentally used without linker
errors in the past.  So I think the risk of skipping the major bump
(and recursive bump for all downstream libraries) at this point is
fairly low.


From: "Taylor R Campbell" <riastradh@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/59685 CVS commit: src
Date: Sun, 19 Oct 2025 23:52:44 +0000

 Module Name:	src
 Committed By:	riastradh
 Date:		Sun Oct 19 23:52:44 UTC 2025

 Modified Files:
 	src/distrib/sets/lists/base: shl.mi
 	src/distrib/sets/lists/debug: shl.mi
 	src/lib/libc: shlib_version
 	src/lib/libpthread: shlib_version

 Log Message:
 libc, libpthread: Bump for pthread stub additions.

 New symbols were added a couple weeks ago but I forgot to bump the
 shlib minors.

 PR lib/59685: libcrypto should not depend on libpthread


 To generate a diff of this commit:
 cvs rdiff -u -r1.1014 -r1.1015 src/distrib/sets/lists/base/shl.mi
 cvs rdiff -u -r1.375 -r1.376 src/distrib/sets/lists/debug/shl.mi
 cvs rdiff -u -r1.299 -r1.300 src/lib/libc/shlib_version
 cvs rdiff -u -r1.20 -r1.21 src/lib/libpthread/shlib_version

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.47 2022/09/11 19:34:41 kim Exp $
$NetBSD: gnats_config.sh,v 1.9 2014/08/02 14:16:04 spz Exp $
Copyright © 1994-2025 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.