public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 00/10] nptl: Complete libpthread removal
@ 2021-05-18 14:24 Florian Weimer
  2021-05-18 14:24 ` [PATCH 01/10] nptl: Perform signal initialization upon pthread_create Florian Weimer
                   ` (11 more replies)
  0 siblings, 12 replies; 47+ messages in thread
From: Florian Weimer @ 2021-05-18 14:24 UTC (permalink / raw)
  To: libc-alpha

This series finally removes libpthread for Linux/NPTL.

The first patch supersedes “nptl: Introduce __nptl_deferred_init”.  I
think doing cancel initialization on pthread_cancel is not an
improvement because we would have to use another flag to avoid the extra
system calls.  The next two patches were posted previous; Adhemerval
already reviewed them.

One test had to be adjusted because it use libpthread as the canonical
NODELETE object.

We need to provide libpthread.so.0 stub object for use with
memusagestat, otherwise a system libpthread.so.0 might leak into the
link.  Not loading libpthread.so.0 is hacked directly into the dynamic
loader.

For some reason, pthread debugging still works even without libpthread
loaded.  I didn't have to add the fake libpthread.so.0 link map to
trigger loading of libthread_db in GDB.  Testing with systemtap and
dyninst will happen once we get this into Fedora rawhide.

I have built and tested various intermediate steps (i686-linux-gnu,
x86_64-linux-gnu, build-many-glibcs.py).  In particular, the placeholder
symbols in the code-less libpthread match the abilist files.

Thanks,
Florian

Florian Weimer (10):
  nptl: Perform signal initialization upon pthread_create
  nptl: Eliminate the __static_tls_size, __static_tls_align_m1 variables
  nptl: Move semi-public __pthread_get_minstack symbol into libc
  elf: Use custom NODELETE DSO for tst-dlopenfail, tst-dlopenfail-2
  nptl: Move pthread_create, thrd_create into libc
  nptl: Remove unused __libc_pthread_init function
  nptl: Remove remaining code from libpthread
  elf: Do not load libpthread for PTHREAD_IN_LIBC
  elf: Add facility to create stub DSOs in elf/stub-dsos
  nptl: Stop building libpthread

 Makeconfig                                    |  13 +-
 elf/Makefile                                  |  29 ++-
 elf/dl-load.c                                 |  19 +-
 elf/dl-tls.c                                  |   5 +-
 elf/dl-version.c                              |   9 +
 nptl/version.c => elf/lib-stub.S              |  31 +--
 elf/tst-dlopenfail-2.c                        |   5 +-
 elf/tst-dlopenfail.c                          |  44 ++---
 elf/tst-dlopenfailmod2.c                      |   6 +-
 .../tst-dlopenfailnodelmod.c                  |  24 +--
 include/libc-internal.h                       |   6 +-
 nptl/Makefile                                 |  77 +-------
 nptl/Versions                                 |  33 ++--
 nptl/allocatestack.c                          |  25 +--
 nptl/libpthread-compat.c                      | 112 -----------
 nptl/libpthread-stub.S                        |   1 +
 nptl/nptl-init.c                              | 180 ------------------
 nptl/nptl-stack.c                             |  17 ++
 nptl/nptl-stack.h                             |  11 +-
 nptl/pt-crti.S                                |  50 -----
 nptl/pt-interp.c                              |   1 -
 nptl/pthreadP.h                               |  18 +-
 nptl/pthread_cancel.c                         |  88 ++++++++-
 nptl/pthread_create.c                         |  60 +++++-
 nptl/pthread_getattr_default_np.c             |   6 +-
 nptl_db/Makefile                              |   2 +-
 nptl_db/structs.def                           |  10 +-
 sysdeps/arm/nptl-aeabi_unwind_cpp_pr1.c       |   1 -
 sysdeps/arm/nptl/Makefile                     |   3 -
 sysdeps/ia64/nptl/Makefile                    |   5 -
 sysdeps/mips/Makefile                         |   5 -
 sysdeps/mips/nptl/Makefile                    |   5 -
 sysdeps/mips/nptl/nptl-sysdep.S               |   2 -
 sysdeps/nptl/Makeconfig                       |   7 +-
 sysdeps/nptl/Makefile                         |   4 -
 sysdeps/nptl/pthread_early_init.h             |  28 +++
 sysdeps/nptl/thrd_create.c                    |   2 -
 sysdeps/pthread/Makefile                      |   3 +-
 sysdeps/pthread/thrd_create.c                 |  11 +-
 sysdeps/riscv/nptl/Makefile                   |   5 -
 sysdeps/riscv/nptl/nptl-sysdep.S              |   2 -
 sysdeps/s390/nptl/Makefile                    |   5 -
 sysdeps/sparc/Makefile                        |   4 -
 sysdeps/sparc/nptl/Makefile                   |   5 -
 sysdeps/unix/sysv/linux/aarch64/libc.abilist  |   4 +
 .../sysv/linux/aarch64/libpthread.abilist     |   6 -
 sysdeps/unix/sysv/linux/alpha/Makefile        |   6 -
 sysdeps/unix/sysv/linux/alpha/libc.abilist    |   5 +
 .../unix/sysv/linux/alpha/libpthread.abilist  |  18 --
 sysdeps/unix/sysv/linux/arc/libc.abilist      |   4 +
 .../unix/sysv/linux/arc/libpthread.abilist    |   3 -
 sysdeps/unix/sysv/linux/arm/Makefile          |   5 -
 sysdeps/unix/sysv/linux/arm/be/libc.abilist   |   4 +
 .../unix/sysv/linux/arm/be/libpthread.abilist |   9 -
 sysdeps/unix/sysv/linux/arm/le/libc.abilist   |   4 +
 .../unix/sysv/linux/arm/le/libpthread.abilist |   9 -
 sysdeps/unix/sysv/linux/csky/libc.abilist     |   4 +
 .../unix/sysv/linux/csky/libpthread.abilist   |   5 -
 sysdeps/unix/sysv/linux/hppa/libc.abilist     |   4 +
 .../unix/sysv/linux/hppa/libpthread.abilist   |  14 --
 sysdeps/unix/sysv/linux/i386/Makefile         |  11 --
 sysdeps/unix/sysv/linux/i386/libc.abilist     |   5 +
 .../unix/sysv/linux/i386/libpthread.abilist   |  18 --
 sysdeps/unix/sysv/linux/ia64/libc.abilist     |   4 +
 .../unix/sysv/linux/ia64/libpthread.abilist   |  14 --
 .../sysv/linux/m68k/coldfire/libc.abilist     |   4 +
 .../linux/m68k/coldfire/libpthread.abilist    |   9 -
 .../unix/sysv/linux/m68k/m680x0/libc.abilist  |   5 +
 .../sysv/linux/m68k/m680x0/libpthread.abilist |  18 --
 sysdeps/unix/sysv/linux/microblaze/Makefile   |   6 -
 .../sysv/linux/microblaze/be/libc.abilist     |   4 +
 .../linux/microblaze/be/libpthread.abilist    |   5 -
 .../sysv/linux/microblaze/le/libc.abilist     |   4 +
 .../linux/microblaze/le/libpthread.abilist    |   5 -
 .../sysv/linux/mips/mips32/fpu/libc.abilist   |   5 +
 .../sysv/linux/mips/mips32/libpthread.abilist |  15 --
 .../sysv/linux/mips/mips32/nofpu/libc.abilist |   5 +
 .../sysv/linux/mips/mips64/libpthread.abilist |  15 --
 .../sysv/linux/mips/mips64/n32/libc.abilist   |   5 +
 .../sysv/linux/mips/mips64/n64/libc.abilist   |   5 +
 sysdeps/unix/sysv/linux/nios2/libc.abilist    |   4 +
 .../unix/sysv/linux/nios2/libpthread.abilist  |   5 -
 sysdeps/unix/sysv/linux/powerpc/Makefile      |   5 -
 .../linux/powerpc/powerpc32/fpu/libc.abilist  |   5 +
 .../powerpc/powerpc32/libpthread.abilist      |  19 --
 .../powerpc/powerpc32/nofpu/libc.abilist      |   5 +
 .../linux/powerpc/powerpc64/be/libc.abilist   |   4 +
 .../powerpc/powerpc64/be/libpthread.abilist   |  13 --
 .../linux/powerpc/powerpc64/le/libc.abilist   |   4 +
 .../powerpc/powerpc64/le/libpthread.abilist   |   6 -
 .../unix/sysv/linux/riscv/rv32/libc.abilist   |   4 +
 .../sysv/linux/riscv/rv32/libpthread.abilist  |   3 -
 .../unix/sysv/linux/riscv/rv64/libc.abilist   |   4 +
 .../sysv/linux/riscv/rv64/libpthread.abilist  |   5 -
 .../unix/sysv/linux/s390/s390-32/libc.abilist |   5 +
 .../linux/s390/s390-32/libpthread.abilist     |  19 --
 .../unix/sysv/linux/s390/s390-64/libc.abilist |   4 +
 .../linux/s390/s390-64/libpthread.abilist     |  15 --
 sysdeps/unix/sysv/linux/sh/be/libc.abilist    |   4 +
 .../unix/sysv/linux/sh/be/libpthread.abilist  |  14 --
 sysdeps/unix/sysv/linux/sh/le/libc.abilist    |   4 +
 .../unix/sysv/linux/sh/le/libpthread.abilist  |  14 --
 sysdeps/unix/sysv/linux/sparc/Makefile        |   6 -
 .../sysv/linux/sparc/sparc32/libc.abilist     |   5 +
 .../linux/sparc/sparc32/libpthread.abilist    |  18 --
 .../sysv/linux/sparc/sparc64/libc.abilist     |   4 +
 .../linux/sparc/sparc64/libpthread.abilist    |  14 --
 .../unix/sysv/linux/x86_64/64/libc.abilist    |   4 +
 .../sysv/linux/x86_64/64/libpthread.abilist   |  13 --
 .../unix/sysv/linux/x86_64/x32/libc.abilist   |   4 +
 .../sysv/linux/x86_64/x32/libpthread.abilist  |   6 -
 111 files changed, 510 insertions(+), 974 deletions(-)
 rename nptl/version.c => elf/lib-stub.S (51%)
 rename nptl/libc_pthread_init.c => elf/tst-dlopenfailnodelmod.c (61%)
 delete mode 100644 nptl/libpthread-compat.c
 create mode 100644 nptl/libpthread-stub.S
 delete mode 100644 nptl/nptl-init.c
 delete mode 100644 nptl/pt-crti.S
 delete mode 100644 nptl/pt-interp.c
 delete mode 100644 sysdeps/arm/nptl-aeabi_unwind_cpp_pr1.c
 delete mode 100644 sysdeps/mips/nptl/nptl-sysdep.S
 delete mode 100644 sysdeps/nptl/thrd_create.c
 delete mode 100644 sysdeps/riscv/nptl/nptl-sysdep.S
 delete mode 100644 sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/alpha/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/arc/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/arm/be/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/arm/le/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/csky/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/hppa/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/i386/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/ia64/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/nios2/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/sh/be/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/sh/le/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist

-- 
2.31.1


^ permalink raw reply	[flat|nested] 47+ messages in thread

* [PATCH 01/10] nptl: Perform signal initialization upon pthread_create
  2021-05-18 14:24 [PATCH 00/10] nptl: Complete libpthread removal Florian Weimer
@ 2021-05-18 14:24 ` Florian Weimer
  2021-05-20 19:15   ` Adhemerval Zanella
  2021-05-18 14:24 ` [PATCH 02/10] nptl: Eliminate the __static_tls_size, __static_tls_align_m1 variables Florian Weimer
                   ` (10 subsequent siblings)
  11 siblings, 1 reply; 47+ messages in thread
From: Florian Weimer @ 2021-05-18 14:24 UTC (permalink / raw)
  To: libc-alpha

Install signal handlers and unblock signals before pthread_create
creates the first thread.
---
 nptl/Versions         |  5 ++-
 nptl/nptl-init.c      | 75 ------------------------------------
 nptl/pthreadP.h       |  6 +++
 nptl/pthread_cancel.c | 88 ++++++++++++++++++++++++++++++++++++++-----
 nptl/pthread_create.c | 45 +++++++++++++++++++++-
 5 files changed, 131 insertions(+), 88 deletions(-)

diff --git a/nptl/Versions b/nptl/Versions
index e7883cbb49..d96b830d05 100644
--- a/nptl/Versions
+++ b/nptl/Versions
@@ -367,8 +367,6 @@ libc {
     tss_set;
   }
   GLIBC_PRIVATE {
-     __nptl_create_event;
-     __nptl_death_event;
     __default_pthread_attr;
     __default_pthread_attr_lock;
     __futex_abstimed_wait64;
@@ -386,11 +384,14 @@ libc {
     __lll_trylock_elision;
     __lll_unlock_elision;
     __mutex_aconf;
+    __nptl_create_event;
     __nptl_deallocate_stack;
     __nptl_deallocate_tsd;
+    __nptl_death_event;
     __nptl_free_tcb;
     __nptl_nthreads;
     __nptl_setxid_sighandler;
+    __nptl_sigcancel_handler;
     __nptl_stack_list_add;
     __nptl_stack_list_del;
     __pthread_attr_copy;
diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c
index f4b86fbfaf..bc4831ac89 100644
--- a/nptl/nptl-init.c
+++ b/nptl/nptl-init.c
@@ -44,84 +44,9 @@ size_t __static_tls_align_m1;
 /* Version of the library, used in libthread_db to detect mismatches.  */
 static const char nptl_version[] __attribute_used__ = VERSION;
 
-/* For asynchronous cancellation we use a signal.  This is the handler.  */
-static void
-sigcancel_handler (int sig, siginfo_t *si, void *ctx)
-{
-  /* Safety check.  It would be possible to call this function for
-     other signals and send a signal from another process.  This is not
-     correct and might even be a security problem.  Try to catch as
-     many incorrect invocations as possible.  */
-  if (sig != SIGCANCEL
-      || si->si_pid != __getpid()
-      || si->si_code != SI_TKILL)
-    return;
-
-  struct pthread *self = THREAD_SELF;
-
-  int oldval = THREAD_GETMEM (self, cancelhandling);
-  while (1)
-    {
-      /* We are canceled now.  When canceled by another thread this flag
-	 is already set but if the signal is directly send (internally or
-	 from another process) is has to be done here.  */
-      int newval = oldval | CANCELING_BITMASK | CANCELED_BITMASK;
-
-      if (oldval == newval || (oldval & EXITING_BITMASK) != 0)
-	/* Already canceled or exiting.  */
-	break;
-
-      int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, newval,
-					      oldval);
-      if (curval == oldval)
-	{
-	  /* Set the return value.  */
-	  THREAD_SETMEM (self, result, PTHREAD_CANCELED);
-
-	  /* Make sure asynchronous cancellation is still enabled.  */
-	  if ((newval & CANCELTYPE_BITMASK) != 0)
-	    /* Run the registered destructors and terminate the thread.  */
-	    __do_cancel ();
-
-	  break;
-	}
-
-      oldval = curval;
-    }
-}
-
-
-/* When using __thread for this, we do it in libc so as not
-   to give libpthread its own TLS segment just for this.  */
-extern void **__libc_dl_error_tsd (void) __attribute__ ((const));
-
-
 void
 __pthread_initialize_minimal_internal (void)
 {
-  struct sigaction sa;
-  __sigemptyset (&sa.sa_mask);
-
-  /* Install the cancellation signal handler.  If for some reason we
-     cannot install the handler we do not abort.  Maybe we should, but
-     it is only asynchronous cancellation which is affected.  */
-  sa.sa_sigaction = sigcancel_handler;
-  sa.sa_flags = SA_SIGINFO;
-  (void) __libc_sigaction (SIGCANCEL, &sa, NULL);
-
-  /* Install the handle to change the threads' uid/gid.  */
-  sa.sa_sigaction = __nptl_setxid_sighandler;
-  sa.sa_flags = SA_SIGINFO | SA_RESTART;
-  (void) __libc_sigaction (SIGSETXID, &sa, NULL);
-
-  /* The parent process might have left the signals blocked.  Just in
-     case, unblock it.  We reuse the signal mask in the sigaction
-     structure.  It is already cleared.  */
-  __sigaddset (&sa.sa_mask, SIGCANCEL);
-  __sigaddset (&sa.sa_mask, SIGSETXID);
-  INTERNAL_SYSCALL_CALL (rt_sigprocmask, SIG_UNBLOCK, &sa.sa_mask,
-			 NULL, __NSIG_BYTES);
-
   /* Get the size of the static and alignment requirements for the TLS
      block.  */
   size_t static_tls_align;
diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
index f93806e540..497c2ad3d9 100644
--- a/nptl/pthreadP.h
+++ b/nptl/pthreadP.h
@@ -571,6 +571,12 @@ libc_hidden_proto (__pthread_attr_setsigmask_internal)
 extern __typeof (pthread_attr_getsigmask_np) __pthread_attr_getsigmask_np;
 libc_hidden_proto (__pthread_attr_getsigmask_np)
 
+/* The cancellation signal handler defined alongside with
+   pthread_cancel.  This is included in statically linked binaries
+   only if pthread_cancel is linked in.  */
+void __nptl_sigcancel_handler (int sig, siginfo_t *si, void *ctx);
+libc_hidden_proto (__nptl_sigcancel_handler)
+
 /* Special versions which use non-exported functions.  */
 extern void __pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer,
 				    void (*routine) (void *), void *arg);
diff --git a/nptl/pthread_cancel.c b/nptl/pthread_cancel.c
index e4ad602900..802c691874 100644
--- a/nptl/pthread_cancel.c
+++ b/nptl/pthread_cancel.c
@@ -26,6 +26,63 @@
 #include <unwind-link.h>
 #include <stdio.h>
 #include <gnu/lib-names.h>
+#include <sys/single_threaded.h>
+
+/* For asynchronous cancellation we use a signal.  This is the core
+   logic of the signal handler.  */
+static void
+sigcancel_handler (void)
+{
+  struct pthread *self = THREAD_SELF;
+
+  int oldval = THREAD_GETMEM (self, cancelhandling);
+  while (1)
+    {
+      /* We are canceled now.  When canceled by another thread this flag
+	 is already set but if the signal is directly send (internally or
+	 from another process) is has to be done here.  */
+      int newval = oldval | CANCELING_BITMASK | CANCELED_BITMASK;
+
+      if (oldval == newval || (oldval & EXITING_BITMASK) != 0)
+	/* Already canceled or exiting.  */
+	break;
+
+      int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, newval,
+					      oldval);
+      if (curval == oldval)
+	{
+	  /* Set the return value.  */
+	  THREAD_SETMEM (self, result, PTHREAD_CANCELED);
+
+	  /* Make sure asynchronous cancellation is still enabled.  */
+	  if ((newval & CANCELTYPE_BITMASK) != 0)
+	    /* Run the registered destructors and terminate the thread.  */
+	    __do_cancel ();
+
+	  break;
+	}
+
+      oldval = curval;
+    }
+}
+
+/* This is the actually installed SIGCANCEL handler.  It adds some
+   safety checks before performing the cancellation.  */
+void
+__nptl_sigcancel_handler (int sig, siginfo_t *si, void *ctx)
+{
+  /* Safety check.  It would be possible to call this function for
+     other signals and send a signal from another process.  This is not
+     correct and might even be a security problem.  Try to catch as
+     many incorrect invocations as possible.  */
+  if (sig != SIGCANCEL
+      || si->si_pid != __getpid()
+      || si->si_code != SI_TKILL)
+    return;
+
+  sigcancel_handler ();
+}
+libc_hidden_def (__nptl_sigcancel_handler)
 
 int
 __pthread_cancel (pthread_t th)
@@ -72,14 +129,23 @@ __pthread_cancel (pthread_t th)
 						    oldval))
 	    goto again;
 
-	  /* The cancellation handler will take care of marking the
-	     thread as canceled.  */
-	  pid_t pid = __getpid ();
-
-	  int val = INTERNAL_SYSCALL_CALL (tgkill, pid, pd->tid,
-					   SIGCANCEL);
-	  if (INTERNAL_SYSCALL_ERROR_P (val))
-	    result = INTERNAL_SYSCALL_ERRNO (val);
+	  if (pd == THREAD_SELF)
+	    /* This is not merely an optimization: An application may
+	       call pthread_cancel (pthread_self ()) without calling
+	       pthread_create, so the signal handler may not have been
+	       set up for a self-cancel.  */
+	    sigcancel_handler ();
+	  else
+	    {
+	      /* The cancellation handler will take care of marking the
+		 thread as canceled.  */
+	      pid_t pid = __getpid ();
+
+	      int val = INTERNAL_SYSCALL_CALL (tgkill, pid, pd->tid,
+					       SIGCANCEL);
+	      if (INTERNAL_SYSCALL_ERROR_P (val))
+		result = INTERNAL_SYSCALL_ERRNO (val);
+	    }
 
 	  break;
 	}
@@ -106,4 +172,8 @@ versioned_symbol (libc, __pthread_cancel, pthread_cancel, GLIBC_2_34);
 compat_symbol (libpthread, __pthread_cancel, pthread_cancel, GLIBC_2_0);
 #endif
 
-PTHREAD_STATIC_FN_REQUIRE (__pthread_create)
+/* Ensure that the unwinder is always linked in (the __pthread_unwind
+   reference from __do_cancel is weak).  Use ___pthread_unwind_next
+   (three underscores) to produce a strong reference to the same
+   file.  */
+PTHREAD_STATIC_FN_REQUIRE (___pthread_unwind_next)
diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c
index 770656453d..772b5efcc6 100644
--- a/nptl/pthread_create.c
+++ b/nptl/pthread_create.c
@@ -56,6 +56,43 @@ static struct rtld_global *__nptl_rtld_global __attribute_used__
   = &_rtld_global;
 #endif
 
+/* This performs the initialization necessary when going from
+   single-threaded to multi-threaded mode for the first time.  */
+static void
+late_init (void)
+{
+  struct sigaction sa;
+  __sigemptyset (&sa.sa_mask);
+
+  /* Install the cancellation signal handler (in static builds only if
+     pthread_cancel has been linked in).  If for some reason we cannot
+     install the handler we do not abort.  Maybe we should, but it is
+     only asynchronous cancellation which is affected.  */
+#ifndef SHARED
+  extern __typeof (__nptl_sigcancel_handler) __nptl_sigcancel_handler
+    __attribute__ ((weak));
+  if (__nptl_sigcancel_handler != NULL)
+#endif
+    {
+      sa.sa_sigaction = __nptl_sigcancel_handler;
+      sa.sa_flags = SA_SIGINFO;
+      (void) __libc_sigaction (SIGCANCEL, &sa, NULL);
+    }
+
+  /* Install the handle to change the threads' uid/gid.  */
+  sa.sa_sigaction = __nptl_setxid_sighandler;
+  sa.sa_flags = SA_SIGINFO | SA_RESTART;
+  (void) __libc_sigaction (SIGSETXID, &sa, NULL);
+
+  /* The parent process might have left the signals blocked.  Just in
+     case, unblock it.  We reuse the signal mask in the sigaction
+     structure.  It is already cleared.  */
+  __sigaddset (&sa.sa_mask, SIGCANCEL);
+  __sigaddset (&sa.sa_mask, SIGSETXID);
+  INTERNAL_SYSCALL_CALL (rt_sigprocmask, SIG_UNBLOCK, &sa.sa_mask,
+			 NULL, __NSIG_BYTES);
+}
+
 /* Code to allocate and deallocate a stack.  */
 #include "allocatestack.c"
 
@@ -459,9 +496,13 @@ __pthread_create_2_1 (pthread_t *newthread, const pthread_attr_t *attr,
 {
   STACK_VARIABLES;
 
-  /* Avoid a data race in the multi-threaded case.  */
+  /* Avoid a data race in the multi-threaded case, and call the
+     deferred initialization only once.  */
   if (__libc_single_threaded)
-    __libc_single_threaded = 0;
+    {
+      late_init ();
+      __libc_single_threaded = 0;
+    }
 
   const struct pthread_attr *iattr = (struct pthread_attr *) attr;
   union pthread_attr_transparent default_attr;
-- 
2.31.1



^ permalink raw reply	[flat|nested] 47+ messages in thread

* [PATCH 02/10] nptl: Eliminate the __static_tls_size, __static_tls_align_m1 variables
  2021-05-18 14:24 [PATCH 00/10] nptl: Complete libpthread removal Florian Weimer
  2021-05-18 14:24 ` [PATCH 01/10] nptl: Perform signal initialization upon pthread_create Florian Weimer
@ 2021-05-18 14:24 ` Florian Weimer
  2021-05-18 14:25 ` [PATCH 03/10] nptl: Move semi-public __pthread_get_minstack symbol into libc Florian Weimer
                   ` (9 subsequent siblings)
  11 siblings, 0 replies; 47+ messages in thread
From: Florian Weimer @ 2021-05-18 14:24 UTC (permalink / raw)
  To: libc-alpha

Use the  __nptl_tls_static_size_for_stack inline function instead,
and the GLRO (dl_tls_static_align) value directly.

The computation of GLRO (dl_tls_static_align)  in
_dl_determine_tlsoffset ensures that the alignment is at least
TLS_TCB_ALIGN, which at least STACK_ALIGN (see allocate_stack).
Therefore, the additional rounding-up step is removed.

ALso move the initialization of the default stack size from
__pthread_initialize_minimal_internal to __pthread_early_init.
This introduces an extra system call during single-threaded startup,
but this simplifies the initialization sequence.  No locking is
needed around the writes to __default_pthread_attr because the
process is single-threaded at this point.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
---
 elf/dl-tls.c                      |  5 ++--
 nptl/allocatestack.c              | 25 +++++++++--------
 nptl/nptl-init.c                  | 46 ++-----------------------------
 nptl/nptl-stack.h                 | 11 +++++++-
 nptl/pthreadP.h                   |  4 ---
 sysdeps/nptl/pthread_early_init.h | 28 +++++++++++++++++++
 6 files changed, 58 insertions(+), 61 deletions(-)

diff --git a/elf/dl-tls.c b/elf/dl-tls.c
index 91031c2b72..e531ec5913 100644
--- a/elf/dl-tls.c
+++ b/elf/dl-tls.c
@@ -386,8 +386,9 @@ allocate_dtv (void *result)
   return result;
 }
 
-
-/* Get size and alignment requirements of the static TLS block.  */
+/* Get size and alignment requirements of the static TLS block.  This
+   function is no longer used by glibc itself, but the GCC sanitizers
+   use it despite the GLIBC_PRIVATE status.  */
 void
 _dl_get_tls_static_info (size_t *sizep, size_t *alignp)
 {
diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c
index c0a5c4d96d..dc81a2ca73 100644
--- a/nptl/allocatestack.c
+++ b/nptl/allocatestack.c
@@ -254,6 +254,8 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
   struct pthread *pd;
   size_t size;
   size_t pagesize_m1 = __getpagesize () - 1;
+  size_t tls_static_size_for_stack = __nptl_tls_static_size_for_stack ();
+  size_t tls_static_align_m1 = GLRO (dl_tls_static_align) - 1;
 
   assert (powerof2 (pagesize_m1 + 1));
   assert (TCB_ALIGNMENT >= STACK_ALIGN);
@@ -284,17 +286,18 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
       /* If the user also specified the size of the stack make sure it
 	 is large enough.  */
       if (attr->stacksize != 0
-	  && attr->stacksize < (__static_tls_size + MINIMAL_REST_STACK))
+	  && attr->stacksize < (tls_static_size_for_stack
+				+ MINIMAL_REST_STACK))
 	return EINVAL;
 
       /* Adjust stack size for alignment of the TLS block.  */
 #if TLS_TCB_AT_TP
       adj = ((uintptr_t) stackaddr - TLS_TCB_SIZE)
-	    & __static_tls_align_m1;
+	    & tls_static_align_m1;
       assert (size > adj + TLS_TCB_SIZE);
 #elif TLS_DTV_AT_TP
-      adj = ((uintptr_t) stackaddr - __static_tls_size)
-	    & __static_tls_align_m1;
+      adj = ((uintptr_t) stackaddr - tls_static_size_for_stack)
+	    & tls_static_align_m1;
       assert (size > adj);
 #endif
 
@@ -307,7 +310,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
 			       - TLS_TCB_SIZE - adj);
 #elif TLS_DTV_AT_TP
       pd = (struct pthread *) (((uintptr_t) stackaddr
-				- __static_tls_size - adj)
+				- tls_static_size_for_stack - adj)
 			       - TLS_PRE_TCB_SIZE);
 #endif
 
@@ -366,7 +369,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
 			| ((GL(dl_stack_flags) & PF_X) ? PROT_EXEC : 0));
 
       /* Adjust the stack size for alignment.  */
-      size &= ~__static_tls_align_m1;
+      size &= ~tls_static_align_m1;
       assert (size != 0);
 
       /* Make sure the size of the stack is enough for the guard and
@@ -385,7 +388,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
 	/* Arithmetic overflow.  */
 	return EINVAL;
       size += guardsize;
-      if (__builtin_expect (size < ((guardsize + __static_tls_size
+      if (__builtin_expect (size < ((guardsize + tls_static_size_for_stack
 				     + MINIMAL_REST_STACK + pagesize_m1)
 				    & ~pagesize_m1),
 			    0))
@@ -414,11 +417,11 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
 #if TLS_TCB_AT_TP
 	  pd = (struct pthread *) ((((uintptr_t) mem + size)
 				    - TLS_TCB_SIZE)
-				   & ~__static_tls_align_m1);
+				   & ~tls_static_align_m1);
 #elif TLS_DTV_AT_TP
 	  pd = (struct pthread *) ((((uintptr_t) mem + size
-				    - __static_tls_size)
-				    & ~__static_tls_align_m1)
+				    - tls_static_size_for_stack)
+				    & ~tls_static_align_m1)
 				   - TLS_PRE_TCB_SIZE);
 #endif
 
@@ -602,7 +605,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
 
 # if TLS_TCB_AT_TP
   /* The stack begins before the TCB and the static TLS block.  */
-  stacktop = ((char *) (pd + 1) - __static_tls_size);
+  stacktop = ((char *) (pd + 1) - tls_static_size_for_stack);
 # elif TLS_DTV_AT_TP
   stacktop = (char *) (pd - 1);
 # endif
diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c
index bc4831ac89..732e580355 100644
--- a/nptl/nptl-init.c
+++ b/nptl/nptl-init.c
@@ -36,10 +36,7 @@
 #include <kernel-features.h>
 #include <libc-pointer-arith.h>
 #include <pthread_mutex_conf.h>
-
-/* Size and alignment of static TLS block.  */
-size_t __static_tls_size;
-size_t __static_tls_align_m1;
+#include <nptl-stack.h>
 
 /* Version of the library, used in libthread_db to detect mismatches.  */
 static const char nptl_version[] __attribute_used__ = VERSION;
@@ -47,44 +44,6 @@ static const char nptl_version[] __attribute_used__ = VERSION;
 void
 __pthread_initialize_minimal_internal (void)
 {
-  /* Get the size of the static and alignment requirements for the TLS
-     block.  */
-  size_t static_tls_align;
-  _dl_get_tls_static_info (&__static_tls_size, &static_tls_align);
-
-  /* Make sure the size takes all the alignments into account.  */
-  if (STACK_ALIGN > static_tls_align)
-    static_tls_align = STACK_ALIGN;
-  __static_tls_align_m1 = static_tls_align - 1;
-
-  __static_tls_size = roundup (__static_tls_size, static_tls_align);
-
-  /* Determine the default allowed stack size.  This is the size used
-     in case the user does not specify one.  */
-  struct rlimit limit;
-  if (__getrlimit (RLIMIT_STACK, &limit) != 0
-      || limit.rlim_cur == RLIM_INFINITY)
-    /* The system limit is not usable.  Use an architecture-specific
-       default.  */
-    limit.rlim_cur = ARCH_STACK_DEFAULT_SIZE;
-  else if (limit.rlim_cur < PTHREAD_STACK_MIN)
-    /* The system limit is unusably small.
-       Use the minimal size acceptable.  */
-    limit.rlim_cur = PTHREAD_STACK_MIN;
-
-  /* Make sure it meets the minimum size that allocate_stack
-     (allocatestack.c) will demand, which depends on the page size.  */
-  const uintptr_t pagesz = GLRO(dl_pagesize);
-  const size_t minstack = pagesz + __static_tls_size + MINIMAL_REST_STACK;
-  if (limit.rlim_cur < minstack)
-    limit.rlim_cur = minstack;
-
-  /* Round the resource limit up to page size.  */
-  limit.rlim_cur = ALIGN_UP (limit.rlim_cur, pagesz);
-  lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
-  __default_pthread_attr.internal.stacksize = limit.rlim_cur;
-  __default_pthread_attr.internal.guardsize = GLRO (dl_pagesize);
-  lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
 }
 strong_alias (__pthread_initialize_minimal_internal,
 	      __pthread_initialize_minimal)
@@ -101,5 +60,6 @@ strong_alias (__pthread_initialize_minimal_internal,
 size_t
 __pthread_get_minstack (const pthread_attr_t *attr)
 {
-  return GLRO(dl_pagesize) + __static_tls_size + PTHREAD_STACK_MIN;
+  return (GLRO(dl_pagesize) + __nptl_tls_static_size_for_stack ()
+	  + PTHREAD_STACK_MIN);
 }
diff --git a/nptl/nptl-stack.h b/nptl/nptl-stack.h
index 8631b61816..a6bd8df77f 100644
--- a/nptl/nptl-stack.h
+++ b/nptl/nptl-stack.h
@@ -20,7 +20,8 @@
 #ifndef _NPTL_STACK_H
 #define _NPTL_STACK_H
 
-#include <descr.h>
+#include <nptl/descr.h>
+#include <ldsodefs.h>
 #include <list.h>
 #include <stdbool.h>
 
@@ -47,4 +48,12 @@ libc_hidden_proto (__nptl_deallocate_stack)
 /* Free stacks until cache size is lower than LIMIT.  */
 void __nptl_free_stacks (size_t limit) attribute_hidden;
 
+/* Compute the size of the static TLS area based on data from the
+   dynamic loader.  */
+static inline size_t
+__nptl_tls_static_size_for_stack (void)
+{
+  return roundup (GLRO (dl_tls_static_size), GLRO (dl_tls_static_align));
+}
+
 #endif /* _NPTL_STACK_H */
diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
index 497c2ad3d9..d011a0ec34 100644
--- a/nptl/pthreadP.h
+++ b/nptl/pthreadP.h
@@ -205,10 +205,6 @@ libc_hidden_proto (__default_pthread_attr_lock)
 /* Called from __libc_freeres to deallocate the default attribute.  */
 extern void __default_pthread_attr_freeres (void) attribute_hidden;
 
-/* Size and alignment of static TLS block.  */
-extern size_t __static_tls_size attribute_hidden;
-extern size_t __static_tls_align_m1 attribute_hidden;
-
 /* Attribute handling.  */
 extern struct pthread_attr *__attr_list attribute_hidden;
 extern int __attr_list_lock attribute_hidden;
diff --git a/sysdeps/nptl/pthread_early_init.h b/sysdeps/nptl/pthread_early_init.h
index 2d15303dd9..5b49ce39c2 100644
--- a/sysdeps/nptl/pthread_early_init.h
+++ b/sysdeps/nptl/pthread_early_init.h
@@ -19,12 +19,40 @@
 #ifndef _PTHREAD_EARLY_INIT_H
 #define _PTHREAD_EARLY_INIT_H 1
 
+#include <nptl/nptl-stack.h>
 #include <nptl/pthreadP.h>
 #include <pthread_mutex_conf.h>
+#include <sys/resource.h>
 
 static inline void
 __pthread_early_init (void)
 {
+  /* Determine the default allowed stack size.  This is the size used
+     in case the user does not specify one.  */
+  struct rlimit limit;
+  if (__getrlimit (RLIMIT_STACK, &limit) != 0
+      || limit.rlim_cur == RLIM_INFINITY)
+    /* The system limit is not usable.  Use an architecture-specific
+       default.  */
+    limit.rlim_cur = ARCH_STACK_DEFAULT_SIZE;
+  else if (limit.rlim_cur < PTHREAD_STACK_MIN)
+    /* The system limit is unusably small.
+       Use the minimal size acceptable.  */
+    limit.rlim_cur = PTHREAD_STACK_MIN;
+
+  /* Make sure it meets the minimum size that allocate_stack
+     (allocatestack.c) will demand, which depends on the page size.  */
+  const uintptr_t pagesz = GLRO(dl_pagesize);
+  const size_t minstack = (pagesz + __nptl_tls_static_size_for_stack ()
+                           + MINIMAL_REST_STACK);
+  if (limit.rlim_cur < minstack)
+    limit.rlim_cur = minstack;
+
+  /* Round the resource limit up to page size.  */
+  limit.rlim_cur = ALIGN_UP (limit.rlim_cur, pagesz);
+  __default_pthread_attr.internal.stacksize = limit.rlim_cur;
+  __default_pthread_attr.internal.guardsize = GLRO (dl_pagesize);
+
 #if HAVE_TUNABLES
   __pthread_tunables_init ();
 #endif
-- 
2.31.1



^ permalink raw reply	[flat|nested] 47+ messages in thread

* [PATCH 03/10] nptl: Move semi-public __pthread_get_minstack symbol into libc
  2021-05-18 14:24 [PATCH 00/10] nptl: Complete libpthread removal Florian Weimer
  2021-05-18 14:24 ` [PATCH 01/10] nptl: Perform signal initialization upon pthread_create Florian Weimer
  2021-05-18 14:24 ` [PATCH 02/10] nptl: Eliminate the __static_tls_size, __static_tls_align_m1 variables Florian Weimer
@ 2021-05-18 14:25 ` Florian Weimer
  2021-05-18 14:25 ` [PATCH 04/10] elf: Use custom NODELETE DSO for tst-dlopenfail, tst-dlopenfail-2 Florian Weimer
                   ` (8 subsequent siblings)
  11 siblings, 0 replies; 47+ messages in thread
From: Florian Weimer @ 2021-05-18 14:25 UTC (permalink / raw)
  To: libc-alpha

No abilist updates here because it is a GLIBC_PRIVATE symbol.

It's also necessary to move nptl_version into pthread_create, so
that it still ends up in static binaries.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
---
 nptl/Versions         |  2 +-
 nptl/nptl-init.c      | 19 -------------------
 nptl/nptl-stack.c     | 17 +++++++++++++++++
 nptl/pthreadP.h       |  1 +
 nptl/pthread_create.c |  4 ++++
 5 files changed, 23 insertions(+), 20 deletions(-)

diff --git a/nptl/Versions b/nptl/Versions
index d96b830d05..845001847b 100644
--- a/nptl/Versions
+++ b/nptl/Versions
@@ -408,6 +408,7 @@ libc {
     __pthread_disable_asynccancel;
     __pthread_enable_asynccancel;
     __pthread_force_elision;
+    __pthread_get_minstack;
     __pthread_getattr_default_np;
     __pthread_getattr_default_np;
     __pthread_keys;
@@ -510,7 +511,6 @@ libpthread {
   GLIBC_PRIVATE {
     __pthread_clock_gettime;
     __pthread_clock_settime;
-    __pthread_get_minstack;
     __pthread_initialize_minimal;
   }
 }
diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c
index 732e580355..5a460aedba 100644
--- a/nptl/nptl-init.c
+++ b/nptl/nptl-init.c
@@ -38,28 +38,9 @@
 #include <pthread_mutex_conf.h>
 #include <nptl-stack.h>
 
-/* Version of the library, used in libthread_db to detect mismatches.  */
-static const char nptl_version[] __attribute_used__ = VERSION;
-
 void
 __pthread_initialize_minimal_internal (void)
 {
 }
 strong_alias (__pthread_initialize_minimal_internal,
 	      __pthread_initialize_minimal)
-
-
-/* This function is internal (it has a GLIBC_PRIVATE) version, but it
-   is widely used (either via weak symbol, or dlsym) to obtain the
-   __static_tls_size value.  This value is then used to adjust the
-   value of the stack size attribute, so that applications receive the
-   full requested stack size, not diminished by the TCB and static TLS
-   allocation on the stack.  Once the TCB is separately allocated,
-   this function should be removed or renamed (if it is still
-   necessary at that point).  */
-size_t
-__pthread_get_minstack (const pthread_attr_t *attr)
-{
-  return (GLRO(dl_pagesize) + __nptl_tls_static_size_for_stack ()
-	  + PTHREAD_STACK_MIN);
-}
diff --git a/nptl/nptl-stack.c b/nptl/nptl-stack.c
index 7853c105be..1a0c460ba8 100644
--- a/nptl/nptl-stack.c
+++ b/nptl/nptl-stack.c
@@ -19,6 +19,7 @@
 
 #include <nptl-stack.h>
 #include <ldsodefs.h>
+#include <pthreadP.h>
 
 /* Maximum size in kB of cache.  40MiBi by default.  */
 static const size_t stack_cache_maxsize = 40 * 1024 * 1024;
@@ -128,3 +129,19 @@ __nptl_deallocate_stack (struct pthread *pd)
   lll_unlock (GL (dl_stack_cache_lock), LLL_PRIVATE);
 }
 libc_hidden_def (__nptl_deallocate_stack)
+
+/* This function is internal (it has a GLIBC_PRIVATE) version, but it
+   is widely used (either via weak symbol, or dlsym) to obtain the
+   __static_tls_size value.  This value is then used to adjust the
+   value of the stack size attribute, so that applications receive the
+   full requested stack size, not diminished by the TCB and static TLS
+   allocation on the stack.  Once the TCB is separately allocated,
+   this function should be removed or renamed (if it is still
+   necessary at that point).  */
+size_t
+__pthread_get_minstack (const pthread_attr_t *attr)
+{
+  return (GLRO(dl_pagesize) + __nptl_tls_static_size_for_stack ()
+	  + PTHREAD_STACK_MIN);
+}
+libc_hidden_def (__pthread_get_minstack)
diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
index d011a0ec34..3151842891 100644
--- a/nptl/pthreadP.h
+++ b/nptl/pthreadP.h
@@ -343,6 +343,7 @@ extern unsigned long int __fork_generation attribute_hidden;
 extern unsigned long int *__fork_generation_pointer attribute_hidden;
 
 extern size_t __pthread_get_minstack (const pthread_attr_t *attr);
+libc_hidden_proto (__pthread_get_minstack)
 
 /* Namespace save aliases.  */
 extern int __pthread_getschedparam (pthread_t thread_id, int *policy,
diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c
index 772b5efcc6..438b8a7ae1 100644
--- a/nptl/pthread_create.c
+++ b/nptl/pthread_create.c
@@ -36,6 +36,7 @@
 #include <tls-setup.h>
 #include "libioP.h"
 #include <sys/single_threaded.h>
+#include <version.h>
 
 #include <shlib-compat.h>
 
@@ -56,6 +57,9 @@ static struct rtld_global *__nptl_rtld_global __attribute_used__
   = &_rtld_global;
 #endif
 
+/* Version of the library, used in libthread_db to detect mismatches.  */
+static const char nptl_version[] __attribute_used__ = VERSION;
+
 /* This performs the initialization necessary when going from
    single-threaded to multi-threaded mode for the first time.  */
 static void
-- 
2.31.1



^ permalink raw reply	[flat|nested] 47+ messages in thread

* [PATCH 04/10] elf: Use custom NODELETE DSO for tst-dlopenfail, tst-dlopenfail-2
  2021-05-18 14:24 [PATCH 00/10] nptl: Complete libpthread removal Florian Weimer
                   ` (2 preceding siblings ...)
  2021-05-18 14:25 ` [PATCH 03/10] nptl: Move semi-public __pthread_get_minstack symbol into libc Florian Weimer
@ 2021-05-18 14:25 ` Florian Weimer
  2021-05-20 20:36   ` Adhemerval Zanella
  2021-05-18 14:25 ` [PATCH 05/10] nptl: Move pthread_create, thrd_create into libc Florian Weimer
                   ` (7 subsequent siblings)
  11 siblings, 1 reply; 47+ messages in thread
From: Florian Weimer @ 2021-05-18 14:25 UTC (permalink / raw)
  To: libc-alpha

Once libpthread is removed, it no longer can be used for testing.
---
 elf/Makefile                 | 11 +++++++--
 elf/tst-dlopenfail-2.c       |  5 +---
 elf/tst-dlopenfail.c         | 44 ++++++++++++++----------------------
 elf/tst-dlopenfailmod2.c     |  6 ++---
 elf/tst-dlopenfailnodelmod.c | 29 ++++++++++++++++++++++++
 5 files changed, 59 insertions(+), 36 deletions(-)
 create mode 100644 elf/tst-dlopenfailnodelmod.c

diff --git a/elf/Makefile b/elf/Makefile
index 5e809dbfaa..834ec858a8 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -334,7 +334,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
 		tst-auditmanymod7 tst-auditmanymod8 tst-auditmanymod9 \
 		tst-initlazyfailmod tst-finilazyfailmod \
 		tst-dlopenfailmod1 tst-dlopenfaillinkmod tst-dlopenfailmod2 \
-		tst-dlopenfailmod3 tst-ldconfig-ld-mod \
+		tst-dlopenfailmod3 tst-dlopenfailnodelmod tst-ldconfig-ld-mod \
 		tst-filterobj-flt tst-filterobj-aux tst-filterobj-filtee \
 		tst-auditlogmod-1 tst-auditlogmod-2 tst-auditlogmod-3 \
 		tst-single_threaded-mod1 tst-single_threaded-mod2 \
@@ -1733,11 +1733,18 @@ LDFLAGS-tst-dlopenfailmod1.so = -Wl,--no-as-needed
 $(objpfx)tst-dlopenfailmod1.so: \
   $(shared-thread-library) $(objpfx)tst-dlopenfaillinkmod.so
 LDFLAGS-tst-dlopenfaillinkmod.so = -Wl,-soname,tst-dlopenfail-missingmod.so
-$(objpfx)tst-dlopenfailmod2.so: $(shared-thread-library)
+$(objpfx)tst-dlopenfailmod2.so: $(objpfx)tst-dlopenfailnodelmod.so
 $(objpfx)tst-dlopenfail-2: $(libdl)
 $(objpfx)tst-dlopenfail-2.out: \
   $(objpfx)tst-dlopenfailmod1.so $(objpfx)tst-dlopenfailmod2.so \
   $(objpfx)tst-dlopenfailmod3.so
+# tst-dlopenfailnodelmod.so emulates how libpthread was linked.
+$(objpfx)tst-dlopenfailnodelmod.so: $(libsupport)
+LDFLAGS-tst-dlopenfailnodelmod.so = \
+  -Wl,--enable-new-dtags,-z,nodelete,-z,initfirst
+# tst-dlopenfail should export the libsupport symbols, so that
+# tst-dlopenfailnodelmod.so uses them for error reporting.
+LDFLAGS-tst-dlopenfail = -Wl,-E
 
 $(objpfx)tst-dlopen-nodelete-reloc: $(libdl)
 $(objpfx)tst-dlopen-nodelete-reloc.out: \
diff --git a/elf/tst-dlopenfail-2.c b/elf/tst-dlopenfail-2.c
index 50eed81cb0..168c4b2c7f 100644
--- a/elf/tst-dlopenfail-2.c
+++ b/elf/tst-dlopenfail-2.c
@@ -28,10 +28,7 @@
 static int
 do_test (void)
 {
-  /* This test uses libpthread as the canonical NODELETE module.  If
-     libpthread is no longer NODELETE because it has been merged into
-     libc, the test needs to be updated.  */
-  TEST_VERIFY (dlsym (NULL, "pthread_create") == NULL);
+  TEST_VERIFY (dlsym (NULL, "no_delete_mod_function") == NULL);
 
   /* This is expected to fail because of the missing dependency.  */
   puts ("info: attempting to load tst-dlopenfailmod1.so");
diff --git a/elf/tst-dlopenfail.c b/elf/tst-dlopenfail.c
index db2b41f9b5..990e28dbce 100644
--- a/elf/tst-dlopenfail.c
+++ b/elf/tst-dlopenfail.c
@@ -18,7 +18,6 @@
 
 #include <dlfcn.h>
 #include <errno.h>
-#include <gnu/lib-names.h>
 #include <stddef.h>
 #include <stdio.h>
 #include <string.h>
@@ -28,10 +27,7 @@
 static int
 do_test (void)
 {
-  /* This test uses libpthread as the canonical NODELETE module.  If
-     libpthread is no longer NODELETE because it has been merged into
-     libc, the test needs to be updated.  */
-  TEST_VERIFY (dlsym (NULL, "pthread_create") == NULL);
+  TEST_VERIFY (dlsym (NULL, "no_delete_mod_function") == NULL);
 
   /* This is expected to fail because of the missing dependency.  */
   puts ("info: attempting to load tst-dlopenfailmod1.so");
@@ -42,36 +38,30 @@ do_test (void)
                        " cannot open shared object file:"
                        " No such file or directory");
 
-  /* Do not probe for the presence of libpthread at this point because
-     that might trigger relocation if bug 20839 is present, obscuring
-     a subsequent crash.  */
+  /* Do not probe for the presence of the tst-dlopenfailnodelmod.so at
+     this point because that might trigger relocation if bug 20839 is
+     present, obscuring a subsequent crash.  */
 
   /* This is expected to succeed.  */
   puts ("info: loading tst-dlopenfailmod2.so");
   void *handle = xdlopen ("tst-dlopenfailmod2.so", RTLD_NOW);
+  xdlsym (handle, "no_delete_mod_function");
   xdlclose (handle);
 
-  /* libpthread should remain loaded.  */
-  TEST_VERIFY (dlopen (LIBPTHREAD_SO, RTLD_LAZY | RTLD_NOLOAD) != NULL);
-  TEST_VERIFY (dlsym (NULL, "pthread_create") == NULL);
+  /* The NODELETE module should remain loaded.  */
+  xdlopen ("tst-dlopenfailnodelmod.so", RTLD_LAZY | RTLD_NOLOAD);
+  /* But the symbol is not in the global scope.  */
+  TEST_VERIFY (dlsym (NULL, "no_delete_mod_function") == NULL);
 
-  /* We can make libpthread global, and then the symbol should become
-     available.  */
-  TEST_VERIFY (dlopen (LIBPTHREAD_SO, RTLD_LAZY | RTLD_GLOBAL) != NULL);
-  TEST_VERIFY (dlsym (NULL, "pthread_create") != NULL);
+  /* We can make tst-dlopenfailnodelmod.so global, and then the symbol
+     should become available.  */
+  xdlopen ("tst-dlopenfailnodelmod.so", RTLD_LAZY | RTLD_GLOBAL);
+  void (*no_delete_mod_function) (void)
+    = xdlsym (NULL, "no_delete_mod_function");
 
-  /* sem_open is sufficiently complex to depend on relocations.  */
-  void *(*sem_open_ptr) (const char *, int flag, ...)
-    = dlsym (NULL, "sem_open");
-  if (sem_open_ptr == NULL)
-    /* Hurd does not implement sem_open.  */
-    puts ("warning: sem_open not found, further testing not possible");
-  else
-    {
-      errno = 0;
-      TEST_VERIFY (sem_open_ptr ("/", 0) == NULL);
-      TEST_COMPARE (errno, EINVAL);
-    }
+  /* Hopefully, no_delete_mod_function is sufficiently complex to
+     depend on relocations.  */
+  no_delete_mod_function ();
 
   return 0;
 }
diff --git a/elf/tst-dlopenfailmod2.c b/elf/tst-dlopenfailmod2.c
index cd6f9cf56b..ed353f9a3c 100644
--- a/elf/tst-dlopenfailmod2.c
+++ b/elf/tst-dlopenfailmod2.c
@@ -16,11 +16,11 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <pthread.h>
 #include <stdio.h>
 
-/* Force linking against libpthread.  */
-void *pthread_create_reference = pthread_create;
+/* Force linking against tst-dlopenfailnodelmod.so.  */
+void no_delete_mod_function (void);
+void *function_reference = no_delete_mod_function;
 
 static void __attribute__ ((constructor))
 init (void)
diff --git a/elf/tst-dlopenfailnodelmod.c b/elf/tst-dlopenfailnodelmod.c
new file mode 100644
index 0000000000..c4347b7591
--- /dev/null
+++ b/elf/tst-dlopenfailnodelmod.c
@@ -0,0 +1,29 @@
+/* NODELETE module for tst-dlopenfail, tst-dlopenfail-2.
+   Copyright (C) 2021 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <support/check.h>
+
+/* Introduce some relocation dependencies.  */
+const char test_string[] = "test string";
+const char *test_string_ptr = test_string;
+
+void
+no_delete_mod_function (void)
+{
+  TEST_COMPARE_STRING (test_string, test_string_ptr);
+}
-- 
2.31.1



^ permalink raw reply	[flat|nested] 47+ messages in thread

* [PATCH 05/10] nptl: Move pthread_create, thrd_create into libc
  2021-05-18 14:24 [PATCH 00/10] nptl: Complete libpthread removal Florian Weimer
                   ` (3 preceding siblings ...)
  2021-05-18 14:25 ` [PATCH 04/10] elf: Use custom NODELETE DSO for tst-dlopenfail, tst-dlopenfail-2 Florian Weimer
@ 2021-05-18 14:25 ` Florian Weimer
  2021-05-20 20:44   ` Adhemerval Zanella
  2021-05-18 14:25 ` [PATCH 06/10] nptl: Remove unused __libc_pthread_init function Florian Weimer
                   ` (6 subsequent siblings)
  11 siblings, 1 reply; 47+ messages in thread
From: Florian Weimer @ 2021-05-18 14:25 UTC (permalink / raw)
  To: libc-alpha

The symbols were moved using scripts/move-symbol-to-libc.py.

The libpthread placeholder symbols need some changes because some
symbol versions have gone away completely.  But
__errno_location@@GLIBC_2.0 still exists, so the GLIBC_2.0 version
is still there.

The internal __pthread_create symbol now points to the correct
function, so the sysdeps/nptl/thrd_create.c override is no longer
necessary.

There was an issue how the hidden alias of pthread_getattr_default_np
was defined, so this commit cleans up that aspects and removes the
GLIBC_PRIVATE export altogether.
---
 include/libc-internal.h                       |  6 ++++-
 nptl/Makefile                                 |  2 +-
 nptl/Versions                                 | 14 +++++++----
 nptl/libpthread-compat.c                      | 24 +++++++++----------
 nptl/pthreadP.h                               |  7 +++---
 nptl/pthread_create.c                         | 11 +++++++--
 nptl/pthread_getattr_default_np.c             |  6 +++--
 nptl_db/Makefile                              |  2 +-
 nptl_db/structs.def                           | 10 ++++----
 sysdeps/nptl/thrd_create.c                    |  2 --
 sysdeps/pthread/Makefile                      |  3 +--
 sysdeps/pthread/thrd_create.c                 | 11 ++++++++-
 sysdeps/unix/sysv/linux/aarch64/libc.abilist  |  4 ++++
 .../sysv/linux/aarch64/libpthread.abilist     |  3 +--
 sysdeps/unix/sysv/linux/alpha/libc.abilist    |  5 ++++
 .../unix/sysv/linux/alpha/libpthread.abilist  |  5 ++--
 sysdeps/unix/sysv/linux/arc/libc.abilist      |  4 ++++
 .../unix/sysv/linux/arc/libpthread.abilist    |  2 --
 sysdeps/unix/sysv/linux/arm/be/libc.abilist   |  4 ++++
 .../unix/sysv/linux/arm/be/libpthread.abilist |  3 +--
 sysdeps/unix/sysv/linux/arm/le/libc.abilist   |  4 ++++
 .../unix/sysv/linux/arm/le/libpthread.abilist |  3 +--
 sysdeps/unix/sysv/linux/csky/libc.abilist     |  4 ++++
 .../unix/sysv/linux/csky/libpthread.abilist   |  2 --
 sysdeps/unix/sysv/linux/hppa/libc.abilist     |  4 ++++
 .../unix/sysv/linux/hppa/libpthread.abilist   |  3 +--
 sysdeps/unix/sysv/linux/i386/libc.abilist     |  5 ++++
 .../unix/sysv/linux/i386/libpthread.abilist   |  5 ++--
 sysdeps/unix/sysv/linux/ia64/libc.abilist     |  4 ++++
 .../unix/sysv/linux/ia64/libpthread.abilist   |  3 +--
 .../sysv/linux/m68k/coldfire/libc.abilist     |  4 ++++
 .../linux/m68k/coldfire/libpthread.abilist    |  3 +--
 .../unix/sysv/linux/m68k/m680x0/libc.abilist  |  5 ++++
 .../sysv/linux/m68k/m680x0/libpthread.abilist |  5 ++--
 .../sysv/linux/microblaze/be/libc.abilist     |  4 ++++
 .../linux/microblaze/be/libpthread.abilist    |  3 +--
 .../sysv/linux/microblaze/le/libc.abilist     |  4 ++++
 .../linux/microblaze/le/libpthread.abilist    |  3 +--
 .../sysv/linux/mips/mips32/fpu/libc.abilist   |  5 ++++
 .../sysv/linux/mips/mips32/libpthread.abilist |  5 ++--
 .../sysv/linux/mips/mips32/nofpu/libc.abilist |  5 ++++
 .../sysv/linux/mips/mips64/libpthread.abilist |  5 ++--
 .../sysv/linux/mips/mips64/n32/libc.abilist   |  5 ++++
 .../sysv/linux/mips/mips64/n64/libc.abilist   |  5 ++++
 sysdeps/unix/sysv/linux/nios2/libc.abilist    |  4 ++++
 .../unix/sysv/linux/nios2/libpthread.abilist  |  3 +--
 .../linux/powerpc/powerpc32/fpu/libc.abilist  |  5 ++++
 .../powerpc/powerpc32/libpthread.abilist      |  5 ++--
 .../powerpc/powerpc32/nofpu/libc.abilist      |  5 ++++
 .../linux/powerpc/powerpc64/be/libc.abilist   |  4 ++++
 .../powerpc/powerpc64/be/libpthread.abilist   |  3 +--
 .../linux/powerpc/powerpc64/le/libc.abilist   |  4 ++++
 .../powerpc/powerpc64/le/libpthread.abilist   |  3 +--
 .../unix/sysv/linux/riscv/rv32/libc.abilist   |  4 ++++
 .../sysv/linux/riscv/rv32/libpthread.abilist  |  2 --
 .../unix/sysv/linux/riscv/rv64/libc.abilist   |  4 ++++
 .../sysv/linux/riscv/rv64/libpthread.abilist  |  3 +--
 .../unix/sysv/linux/s390/s390-32/libc.abilist |  5 ++++
 .../linux/s390/s390-32/libpthread.abilist     |  5 ++--
 .../unix/sysv/linux/s390/s390-64/libc.abilist |  4 ++++
 .../linux/s390/s390-64/libpthread.abilist     |  3 +--
 sysdeps/unix/sysv/linux/sh/be/libc.abilist    |  4 ++++
 .../unix/sysv/linux/sh/be/libpthread.abilist  |  3 +--
 sysdeps/unix/sysv/linux/sh/le/libc.abilist    |  4 ++++
 .../unix/sysv/linux/sh/le/libpthread.abilist  |  3 +--
 .../sysv/linux/sparc/sparc32/libc.abilist     |  5 ++++
 .../linux/sparc/sparc32/libpthread.abilist    |  5 ++--
 .../sysv/linux/sparc/sparc64/libc.abilist     |  4 ++++
 .../linux/sparc/sparc64/libpthread.abilist    |  3 +--
 .../unix/sysv/linux/x86_64/64/libc.abilist    |  4 ++++
 .../sysv/linux/x86_64/64/libpthread.abilist   |  3 +--
 .../unix/sysv/linux/x86_64/x32/libc.abilist   |  4 ++++
 .../sysv/linux/x86_64/x32/libpthread.abilist  |  3 +--
 73 files changed, 233 insertions(+), 104 deletions(-)
 delete mode 100644 sysdeps/nptl/thrd_create.c

diff --git a/include/libc-internal.h b/include/libc-internal.h
index 5b18c7c9f2..749dfb919c 100644
--- a/include/libc-internal.h
+++ b/include/libc-internal.h
@@ -38,7 +38,11 @@ extern void __libc_freeres (void);
 libc_hidden_proto (__libc_freeres)
 
 /* Free resources stored in thread-local variables on thread exit.  */
-extern void __libc_thread_freeres (void);
+extern void __libc_thread_freeres (void)
+#if PTHREAD_IN_LIBC
+  attribute_hidden
+#endif
+  ;
 
 /* Define and initialize `__progname' et. al.  */
 extern void __init_misc (int, char **, char **) attribute_hidden;
diff --git a/nptl/Makefile b/nptl/Makefile
index bd5a9ce51f..7426997a83 100644
--- a/nptl/Makefile
+++ b/nptl/Makefile
@@ -109,6 +109,7 @@ routines = \
   pthread_condattr_init \
   pthread_condattr_setclock \
   pthread_condattr_setpshared \
+  pthread_create \
   pthread_detach \
   pthread_equal \
   pthread_exit \
@@ -211,7 +212,6 @@ libpthread-routines = \
   libpthread-compat \
   nptl-init \
   pt-interp \
-  pthread_create \
   version \
 
 libpthread-shared-only-routines = \
diff --git a/nptl/Versions b/nptl/Versions
index 845001847b..0db56bce29 100644
--- a/nptl/Versions
+++ b/nptl/Versions
@@ -38,6 +38,7 @@ libc {
     pthread_cond_wait;
     pthread_condattr_destroy;
     pthread_condattr_init;
+    pthread_create;
     pthread_detach;
     pthread_equal;
     pthread_exit;
@@ -80,6 +81,7 @@ libc {
     pthread_attr_setguardsize;
     pthread_attr_setstackaddr;
     pthread_attr_setstacksize;
+    pthread_create;
     pthread_getconcurrency;
     pthread_mutexattr_gettype;
     pthread_mutexattr_settype;
@@ -217,6 +219,7 @@ libc {
     mtx_trylock;
     mtx_unlock;
     thrd_current;
+    thrd_create;
     thrd_detach;
     thrd_equal;
     thrd_exit;
@@ -358,6 +361,7 @@ libc {
     sem_trywait;
     sem_unlink;
     sem_wait;
+    thrd_create;
     thrd_detach;
     thrd_exit;
     thrd_join;
@@ -409,8 +413,6 @@ libc {
     __pthread_enable_asynccancel;
     __pthread_force_elision;
     __pthread_get_minstack;
-    __pthread_getattr_default_np;
-    __pthread_getattr_default_np;
     __pthread_keys;
     __pthread_mutex_unlock_usercnt;
     __pthread_setcancelstate;
@@ -438,7 +440,7 @@ libpthread {
   }
 
   GLIBC_2.1 {
-    pthread_create;
+    __libpthread_version_placeholder;
   }
 
   GLIBC_2.1.1 {
@@ -495,9 +497,11 @@ libpthread {
   GLIBC_2.19 {
   }
 
-  # C11 thread symbols.
   GLIBC_2.28 {
-    thrd_create;
+    __libpthread_version_placeholder;
+  }
+
+  GLIBC_2.29 {
   }
 
   GLIBC_2.30 {
diff --git a/nptl/libpthread-compat.c b/nptl/libpthread-compat.c
index 7e3e7aa0c3..2dcf175f3f 100644
--- a/nptl/libpthread-compat.c
+++ b/nptl/libpthread-compat.c
@@ -28,14 +28,11 @@ __libpthread_version_placeholder_1 (void)
 }
 #endif
 
-/* This is an unused compatibility symbol definition, to prevent ld
-   from creating a weak version definition for GLIBC_2.1.2.  (__vfork
-   used to be defined at that version, but it is now provided by libc,
-   and there are no versions left in libpthread for that symbol
-   version.)  If the ABI baseline for glibc is the GLIBC_2.2 symbol
-   version or later, the placeholder symbol is not needed because
-   there are plenty of other symbols which populate those later
-   versions.  */
+#if (SHLIB_COMPAT (libpthread, GLIBC_2_1, GLIBC_2_2))
+compat_symbol (libpthread, __libpthread_version_placeholder_1,
+	       __libpthread_version_placeholder, GLIBC_2_1);
+#endif
+
 #if (SHLIB_COMPAT (libpthread, GLIBC_2_1_1, GLIBC_2_1_2))
 compat_symbol (libpthread, __libpthread_version_placeholder_1,
 	       __libpthread_version_placeholder, GLIBC_2_1_1);
@@ -45,12 +42,8 @@ compat_symbol (libpthread, __libpthread_version_placeholder_1,
 	       __libpthread_version_placeholder, GLIBC_2_1_2);
 #endif
 
-/* Do not create the placeholder symbol version if there are other
-   symbols left that keep the version around (because GLIBC_2.0 got
-   promoted to GLIBC_2.2).  */
 #if SHLIB_COMPAT (libpthread, GLIBC_2_2, GLIBC_2_2_3) \
-  && ABI_libpthread_GLIBC_2_2 != ABI_libpthread_GLIBC_2_0 \
-  && ABI_libpthread_GLIBC_2_2 != ABI_libpthread_GLIBC_2_1_3
+  && ABI_libpthread_GLIBC_2_2 != ABI_libpthread_GLIBC_2_0
 compat_symbol (libpthread, __libpthread_version_placeholder_1,
 	       __libpthread_version_placeholder, GLIBC_2_2);
 #endif
@@ -101,6 +94,11 @@ compat_symbol (libpthread, __libpthread_version_placeholder_1,
 	       __libpthread_version_placeholder, GLIBC_2_18);
 #endif
 
+#if (SHLIB_COMPAT (libpthread, GLIBC_2_28, GLIBC_2_29))
+compat_symbol (libpthread, __libpthread_version_placeholder_1,
+	       __libpthread_version_placeholder, GLIBC_2_28);
+#endif
+
 #if (SHLIB_COMPAT (libpthread, GLIBC_2_30, GLIBC_2_31))
 compat_symbol (libpthread, __libpthread_version_placeholder_1,
 	       __libpthread_version_placeholder, GLIBC_2_30);
diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
index 3151842891..05f2bae521 100644
--- a/nptl/pthreadP.h
+++ b/nptl/pthreadP.h
@@ -314,9 +314,10 @@ libc_hidden_proto (__pthread_cleanup_upto)
 
 
 /* Functions with versioned interfaces.  */
-extern int __pthread_create_2_1 (pthread_t *newthread,
-				 const pthread_attr_t *attr,
-				 void *(*start_routine) (void *), void *arg);
+extern int __pthread_create (pthread_t *newthread,
+			     const pthread_attr_t *attr,
+			     void *(*start_routine) (void *), void *arg);
+libc_hidden_proto (__pthread_create)
 extern int __pthread_create_2_0 (pthread_t *newthread,
 				 const pthread_attr_t *attr,
 				 void *(*start_routine) (void *), void *arg);
diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c
index 438b8a7ae1..5680687efe 100644
--- a/nptl/pthread_create.c
+++ b/nptl/pthread_create.c
@@ -762,10 +762,17 @@ __pthread_create_2_1 (pthread_t *newthread, const pthread_attr_t *attr,
 
   return retval;
 }
-versioned_symbol (libpthread, __pthread_create_2_1, pthread_create, GLIBC_2_1);
+versioned_symbol (libc, __pthread_create_2_1, pthread_create, GLIBC_2_34);
+libc_hidden_ver (__pthread_create_2_1, __pthread_create)
+#ifndef SHARED
+strong_alias (__pthread_create_2_1, __pthread_create)
+#endif
 
+#if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_1, GLIBC_2_34)
+compat_symbol (libpthread, __pthread_create_2_1, pthread_create, GLIBC_2_1);
+#endif
 
-#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)
+#if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_1)
 int
 __pthread_create_2_0 (pthread_t *newthread, const pthread_attr_t *attr,
 		      void *(*start_routine) (void *), void *arg)
diff --git a/nptl/pthread_getattr_default_np.c b/nptl/pthread_getattr_default_np.c
index f38f687431..ad10a27339 100644
--- a/nptl/pthread_getattr_default_np.c
+++ b/nptl/pthread_getattr_default_np.c
@@ -29,8 +29,10 @@ ___pthread_getattr_default_np (pthread_attr_t *out)
 }
 versioned_symbol (libc, ___pthread_getattr_default_np,
                   pthread_getattr_default_np, GLIBC_2_34);
-versioned_symbol (libc, ___pthread_getattr_default_np,
-                  __pthread_getattr_default_np, GLIBC_PRIVATE);
+libc_hidden_ver (___pthread_getattr_default_np, __pthread_getattr_default_np)
+#ifndef SHARED
+strong_alias (___pthread_getattr_default_np, __pthread_getattr_default_np)
+#endif
 
 #if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_18, GLIBC_2_34)
 compat_symbol (libpthread, ___pthread_getattr_default_np,
diff --git a/nptl_db/Makefile b/nptl_db/Makefile
index 8873a0a0ee..ea721c1dcf 100644
--- a/nptl_db/Makefile
+++ b/nptl_db/Makefile
@@ -56,7 +56,7 @@ tests-special += $(objpfx)db-symbols.out
 include ../Rules
 
 $(objpfx)db-symbols.out: $(objpfx)db-symbols.v.i \
-			 $(common-objpfx)nptl/libpthread.so
+			 $(common-objpfx)libc.so
 	LC_ALL=C $(READELF) -W -s $(filter %.so,$^) | $(AWK) -f $< > $@; \
 	$(evaluate-test)
 
diff --git a/nptl_db/structs.def b/nptl_db/structs.def
index 71c9f7bfc2..6a726f207e 100644
--- a/nptl_db/structs.def
+++ b/nptl_db/structs.def
@@ -1,4 +1,4 @@
-/* List of types and symbols in libpthread examined by libthread_db.
+/* List of types and symbols in libc examined by libthread_db.
    Copyright (C) 2003-2021 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -27,7 +27,7 @@
 #endif
 
 /* DB_MAIN_VARIABLE, DB_MAIN_SYMBOL, DB_MAIN_ARRAY_VARIABLE are not
-   covered by the libpthread symbol check in db-symbols.awk.  */
+   covered by the libc symbol check in db-symbols.awk.  */
 #ifndef DB_MAIN_VARIABLE
 # define DB_MAIN_VARIABLE(name) DB_VARIABLE (name)
 #endif
@@ -39,7 +39,7 @@
 #endif
 
 #ifndef DB_RTLD_GLOBAL_FIELD
-# if !IS_IN (libpthread)
+# if !IS_IN (libc)
 #  define DB_RTLD_GLOBAL_FIELD(field)		\
   DB_STRUCT_FIELD (rtld_global, _##field)	\
   DB_MAIN_VARIABLE (_##field)
@@ -103,11 +103,11 @@ DB_STRUCT_ARRAY_FIELD (dtv, dtv)
 #define pointer_val pointer.val /* Field of anonymous struct in dtv_t.  */
 DB_STRUCT_FIELD (dtv_t, pointer_val)
 DB_STRUCT_FIELD (dtv_t, counter)
-#if !IS_IN (libpthread) || TLS_TCB_AT_TP
+#if !IS_IN (libc) || TLS_TCB_AT_TP
 DB_STRUCT_FIELD (pthread, dtvp)
 #endif
 
-#if !(IS_IN (libpthread) && !defined SHARED)
+#if !(IS_IN (libc) && !defined SHARED)
 DB_VARIABLE (__nptl_rtld_global)
 #endif
 DB_RTLD_GLOBAL_FIELD (dl_tls_dtv_slotinfo_list)
diff --git a/sysdeps/nptl/thrd_create.c b/sysdeps/nptl/thrd_create.c
deleted file mode 100644
index 596a7ba588..0000000000
--- a/sysdeps/nptl/thrd_create.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define __pthread_create __pthread_create_2_1
-#include <sysdeps/pthread/thrd_create.c>
diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile
index b15d085f51..bca642f438 100644
--- a/sysdeps/pthread/Makefile
+++ b/sysdeps/pthread/Makefile
@@ -31,8 +31,6 @@ headers += threads.h
 
 routines += thrd_current thrd_equal thrd_sleep thrd_yield
 
-libpthread-routines += thrd_create
-
 $(libpthread-routines-var) += \
   call_once \
   cnd_broadcast \
@@ -47,6 +45,7 @@ $(libpthread-routines-var) += \
   mtx_timedlock \
   mtx_trylock \
   mtx_unlock \
+  thrd_create \
   thrd_detach \
   thrd_exit \
   thrd_join \
diff --git a/sysdeps/pthread/thrd_create.c b/sysdeps/pthread/thrd_create.c
index 07848c0aab..3cb9f1cefb 100644
--- a/sysdeps/pthread/thrd_create.c
+++ b/sysdeps/pthread/thrd_create.c
@@ -17,9 +17,10 @@
    <https://www.gnu.org/licenses/>.  */
 
 #include "thrd_priv.h"
+#include <shlib-compat.h>
 
 int
-thrd_create (thrd_t *thr, thrd_start_t func, void *arg)
+__thrd_create (thrd_t *thr, thrd_start_t func, void *arg)
 {
   _Static_assert (sizeof (thrd_t) == sizeof (pthread_t),
 		  "sizeof (thrd_t) != sizeof (pthread_t)");
@@ -28,3 +29,11 @@ thrd_create (thrd_t *thr, thrd_start_t func, void *arg)
 				   (void* (*) (void*))func, arg);
   return thrd_err_map (err_code);
 }
+#if PTHREAD_IN_LIBC
+versioned_symbol (libc, __thrd_create, thrd_create, GLIBC_2_34);
+# if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_28, GLIBC_2_34)
+compat_symbol (libc, __thrd_create, thrd_create, GLIBC_2_28);
+# endif
+#else /* !PTHREAD_IN_LIBC */
+strong_alias (__thrd_create, thrd_create)
+#endif
diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
index bc051ba9f5..d22c7da7ef 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
@@ -1488,6 +1488,7 @@ GLIBC_2.17 pthread_condattr_getpshared F
 GLIBC_2.17 pthread_condattr_init F
 GLIBC_2.17 pthread_condattr_setclock F
 GLIBC_2.17 pthread_condattr_setpshared F
+GLIBC_2.17 pthread_create F
 GLIBC_2.17 pthread_detach F
 GLIBC_2.17 pthread_equal F
 GLIBC_2.17 pthread_exit F
@@ -2277,6 +2278,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2370,6 +2372,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2442,6 +2445,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist b/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
index 3c03fcc17b..14ada15a35 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
@@ -1,6 +1,5 @@
 GLIBC_2.17 __errno_location F
-GLIBC_2.17 pthread_create F
 GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
 GLIBC_2.31 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
index 3bea473d00..cefff3bf36 100644
--- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
@@ -898,6 +898,7 @@ GLIBC_2.0 pthread_cond_timedwait F
 GLIBC_2.0 pthread_cond_wait F
 GLIBC_2.0 pthread_condattr_destroy F
 GLIBC_2.0 pthread_condattr_init F
+GLIBC_2.0 pthread_create F
 GLIBC_2.0 pthread_detach F
 GLIBC_2.0 pthread_equal F
 GLIBC_2.0 pthread_exit F
@@ -1620,6 +1621,7 @@ GLIBC_2.1 pthread_attr_init F
 GLIBC_2.1 pthread_attr_setguardsize F
 GLIBC_2.1 pthread_attr_setstackaddr F
 GLIBC_2.1 pthread_attr_setstacksize F
+GLIBC_2.1 pthread_create F
 GLIBC_2.1 pthread_getconcurrency F
 GLIBC_2.1 pthread_mutexattr_gettype F
 GLIBC_2.1 pthread_mutexattr_settype F
@@ -2166,6 +2168,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2461,6 +2464,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2533,6 +2537,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/alpha/libpthread.abilist b/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
index c8f065b787..47cbcf3baf 100644
--- a/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
@@ -1,6 +1,5 @@
 GLIBC_2.0 __errno_location F
-GLIBC_2.0 pthread_create F
-GLIBC_2.1 pthread_create F
+GLIBC_2.1 __libpthread_version_placeholder F
 GLIBC_2.1.1 __libpthread_version_placeholder F
 GLIBC_2.1.2 __libpthread_version_placeholder F
 GLIBC_2.11 __libpthread_version_placeholder F
@@ -9,7 +8,7 @@ GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.2 __libpthread_version_placeholder F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.3.2 __libpthread_version_placeholder F
 GLIBC_2.3.3 __libpthread_version_placeholder F
 GLIBC_2.3.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/arc/libc.abilist b/sysdeps/unix/sysv/linux/arc/libc.abilist
index 3461527c5a..91a90f8ca4 100644
--- a/sysdeps/unix/sysv/linux/arc/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arc/libc.abilist
@@ -1429,6 +1429,7 @@ GLIBC_2.32 pthread_condattr_getpshared F
 GLIBC_2.32 pthread_condattr_init F
 GLIBC_2.32 pthread_condattr_setclock F
 GLIBC_2.32 pthread_condattr_setpshared F
+GLIBC_2.32 pthread_create F
 GLIBC_2.32 pthread_detach F
 GLIBC_2.32 pthread_equal F
 GLIBC_2.32 pthread_exit F
@@ -1889,6 +1890,7 @@ GLIBC_2.32 tempnam F
 GLIBC_2.32 textdomain F
 GLIBC_2.32 tfind F
 GLIBC_2.32 tgkill F
+GLIBC_2.32 thrd_create F
 GLIBC_2.32 thrd_current F
 GLIBC_2.32 thrd_detach F
 GLIBC_2.32 thrd_equal F
@@ -2129,6 +2131,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2201,6 +2204,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/arc/libpthread.abilist b/sysdeps/unix/sysv/linux/arc/libpthread.abilist
index 1d363aa47f..c4264810e6 100644
--- a/sysdeps/unix/sysv/linux/arc/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/arc/libpthread.abilist
@@ -1,3 +1 @@
 GLIBC_2.32 __errno_location F
-GLIBC_2.32 pthread_create F
-GLIBC_2.32 thrd_create F
diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
index 7c3029a7e5..120288d766 100644
--- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
@@ -140,6 +140,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -236,6 +237,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -308,6 +310,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
@@ -1740,6 +1743,7 @@ GLIBC_2.4 pthread_condattr_getpshared F
 GLIBC_2.4 pthread_condattr_init F
 GLIBC_2.4 pthread_condattr_setclock F
 GLIBC_2.4 pthread_condattr_setpshared F
+GLIBC_2.4 pthread_create F
 GLIBC_2.4 pthread_detach F
 GLIBC_2.4 pthread_equal F
 GLIBC_2.4 pthread_exit F
diff --git a/sysdeps/unix/sysv/linux/arm/be/libpthread.abilist b/sysdeps/unix/sysv/linux/arm/be/libpthread.abilist
index 0ad6524820..f8ebb4cae2 100644
--- a/sysdeps/unix/sysv/linux/arm/be/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/arm/be/libpthread.abilist
@@ -1,9 +1,8 @@
 GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
 GLIBC_2.31 __libpthread_version_placeholder F
 GLIBC_2.4 __errno_location F
 GLIBC_2.4 __libpthread_version_placeholder F
-GLIBC_2.4 pthread_create F
diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
index 24f5b202e8..be987da77e 100644
--- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
@@ -140,6 +140,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -233,6 +234,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -305,6 +307,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
@@ -1737,6 +1740,7 @@ GLIBC_2.4 pthread_condattr_getpshared F
 GLIBC_2.4 pthread_condattr_init F
 GLIBC_2.4 pthread_condattr_setclock F
 GLIBC_2.4 pthread_condattr_setpshared F
+GLIBC_2.4 pthread_create F
 GLIBC_2.4 pthread_detach F
 GLIBC_2.4 pthread_equal F
 GLIBC_2.4 pthread_exit F
diff --git a/sysdeps/unix/sysv/linux/arm/le/libpthread.abilist b/sysdeps/unix/sysv/linux/arm/le/libpthread.abilist
index 0ad6524820..f8ebb4cae2 100644
--- a/sysdeps/unix/sysv/linux/arm/le/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/arm/le/libpthread.abilist
@@ -1,9 +1,8 @@
 GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
 GLIBC_2.31 __libpthread_version_placeholder F
 GLIBC_2.4 __errno_location F
 GLIBC_2.4 __libpthread_version_placeholder F
-GLIBC_2.4 pthread_create F
diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist
index 85851c5fca..adb4e15cb8 100644
--- a/sysdeps/unix/sysv/linux/csky/libc.abilist
+++ b/sysdeps/unix/sysv/linux/csky/libc.abilist
@@ -1488,6 +1488,7 @@ GLIBC_2.29 pthread_condattr_getpshared F
 GLIBC_2.29 pthread_condattr_init F
 GLIBC_2.29 pthread_condattr_setclock F
 GLIBC_2.29 pthread_condattr_setpshared F
+GLIBC_2.29 pthread_create F
 GLIBC_2.29 pthread_detach F
 GLIBC_2.29 pthread_equal F
 GLIBC_2.29 pthread_exit F
@@ -1979,6 +1980,7 @@ GLIBC_2.29 telldir F
 GLIBC_2.29 tempnam F
 GLIBC_2.29 textdomain F
 GLIBC_2.29 tfind F
+GLIBC_2.29 thrd_create F
 GLIBC_2.29 thrd_current F
 GLIBC_2.29 thrd_detach F
 GLIBC_2.29 thrd_equal F
@@ -2313,6 +2315,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2385,6 +2388,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/csky/libpthread.abilist b/sysdeps/unix/sysv/linux/csky/libpthread.abilist
index d2f66f45ff..f7649b87b2 100644
--- a/sysdeps/unix/sysv/linux/csky/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/csky/libpthread.abilist
@@ -1,5 +1,3 @@
 GLIBC_2.29 __errno_location F
-GLIBC_2.29 pthread_create F
-GLIBC_2.29 thrd_create F
 GLIBC_2.30 __libpthread_version_placeholder F
 GLIBC_2.31 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
index ede69c7ed5..bd022276e8 100644
--- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
@@ -1312,6 +1312,7 @@ GLIBC_2.2 pthread_condattr_destroy F
 GLIBC_2.2 pthread_condattr_getpshared F
 GLIBC_2.2 pthread_condattr_init F
 GLIBC_2.2 pthread_condattr_setpshared F
+GLIBC_2.2 pthread_create F
 GLIBC_2.2 pthread_detach F
 GLIBC_2.2 pthread_equal F
 GLIBC_2.2 pthread_exit F
@@ -1999,6 +2000,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2266,6 +2268,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2338,6 +2341,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/hppa/libpthread.abilist b/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
index cc941573b6..f1adf37ff2 100644
--- a/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
@@ -2,10 +2,9 @@ GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.2 __errno_location F
-GLIBC_2.2 pthread_create F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.3.2 __libpthread_version_placeholder F
 GLIBC_2.3.3 __libpthread_version_placeholder F
 GLIBC_2.3.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
index c883dc08bc..9e37e1cb38 100644
--- a/sysdeps/unix/sysv/linux/i386/libc.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
@@ -875,6 +875,7 @@ GLIBC_2.0 pthread_cond_timedwait F
 GLIBC_2.0 pthread_cond_wait F
 GLIBC_2.0 pthread_condattr_destroy F
 GLIBC_2.0 pthread_condattr_init F
+GLIBC_2.0 pthread_create F
 GLIBC_2.0 pthread_detach F
 GLIBC_2.0 pthread_equal F
 GLIBC_2.0 pthread_exit F
@@ -1588,6 +1589,7 @@ GLIBC_2.1 pthread_attr_init F
 GLIBC_2.1 pthread_attr_setguardsize F
 GLIBC_2.1 pthread_attr_setstackaddr F
 GLIBC_2.1 pthread_attr_setstacksize F
+GLIBC_2.1 pthread_create F
 GLIBC_2.1 pthread_getconcurrency F
 GLIBC_2.1 pthread_mutexattr_gettype F
 GLIBC_2.1 pthread_mutexattr_settype F
@@ -2179,6 +2181,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2449,6 +2452,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2521,6 +2525,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/i386/libpthread.abilist b/sysdeps/unix/sysv/linux/i386/libpthread.abilist
index c8f065b787..47cbcf3baf 100644
--- a/sysdeps/unix/sysv/linux/i386/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libpthread.abilist
@@ -1,6 +1,5 @@
 GLIBC_2.0 __errno_location F
-GLIBC_2.0 pthread_create F
-GLIBC_2.1 pthread_create F
+GLIBC_2.1 __libpthread_version_placeholder F
 GLIBC_2.1.1 __libpthread_version_placeholder F
 GLIBC_2.1.2 __libpthread_version_placeholder F
 GLIBC_2.11 __libpthread_version_placeholder F
@@ -9,7 +8,7 @@ GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.2 __libpthread_version_placeholder F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.3.2 __libpthread_version_placeholder F
 GLIBC_2.3.3 __libpthread_version_placeholder F
 GLIBC_2.3.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
index 38fb02e32b..b8089b0b0c 100644
--- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
@@ -1333,6 +1333,7 @@ GLIBC_2.2 pthread_condattr_destroy F
 GLIBC_2.2 pthread_condattr_getpshared F
 GLIBC_2.2 pthread_condattr_init F
 GLIBC_2.2 pthread_condattr_setpshared F
+GLIBC_2.2 pthread_create F
 GLIBC_2.2 pthread_detach F
 GLIBC_2.2 pthread_equal F
 GLIBC_2.2 pthread_exit F
@@ -2034,6 +2035,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2302,6 +2304,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2374,6 +2377,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/ia64/libpthread.abilist b/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
index cc941573b6..f1adf37ff2 100644
--- a/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
@@ -2,10 +2,9 @@ GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.2 __errno_location F
-GLIBC_2.2 pthread_create F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.3.2 __libpthread_version_placeholder F
 GLIBC_2.3.3 __libpthread_version_placeholder F
 GLIBC_2.3.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
index 8ee9648828..093854ad85 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
@@ -141,6 +141,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -237,6 +238,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -309,6 +311,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
@@ -1720,6 +1723,7 @@ GLIBC_2.4 pthread_condattr_getpshared F
 GLIBC_2.4 pthread_condattr_init F
 GLIBC_2.4 pthread_condattr_setclock F
 GLIBC_2.4 pthread_condattr_setpshared F
+GLIBC_2.4 pthread_create F
 GLIBC_2.4 pthread_detach F
 GLIBC_2.4 pthread_equal F
 GLIBC_2.4 pthread_exit F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
index 0ad6524820..f8ebb4cae2 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
@@ -1,9 +1,8 @@
 GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
 GLIBC_2.31 __libpthread_version_placeholder F
 GLIBC_2.4 __errno_location F
 GLIBC_2.4 __libpthread_version_placeholder F
-GLIBC_2.4 pthread_create F
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
index 1c51cb41ec..87554f1468 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
@@ -874,6 +874,7 @@ GLIBC_2.0 pthread_cond_timedwait F
 GLIBC_2.0 pthread_cond_wait F
 GLIBC_2.0 pthread_condattr_destroy F
 GLIBC_2.0 pthread_condattr_init F
+GLIBC_2.0 pthread_create F
 GLIBC_2.0 pthread_detach F
 GLIBC_2.0 pthread_equal F
 GLIBC_2.0 pthread_exit F
@@ -1584,6 +1585,7 @@ GLIBC_2.1 pthread_attr_init F
 GLIBC_2.1 pthread_attr_setguardsize F
 GLIBC_2.1 pthread_attr_setstackaddr F
 GLIBC_2.1 pthread_attr_setstacksize F
+GLIBC_2.1 pthread_create F
 GLIBC_2.1 pthread_getconcurrency F
 GLIBC_2.1 pthread_mutexattr_gettype F
 GLIBC_2.1 pthread_mutexattr_settype F
@@ -2122,6 +2124,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2392,6 +2395,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2464,6 +2468,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
index c8f065b787..47cbcf3baf 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
@@ -1,6 +1,5 @@
 GLIBC_2.0 __errno_location F
-GLIBC_2.0 pthread_create F
-GLIBC_2.1 pthread_create F
+GLIBC_2.1 __libpthread_version_placeholder F
 GLIBC_2.1.1 __libpthread_version_placeholder F
 GLIBC_2.1.2 __libpthread_version_placeholder F
 GLIBC_2.11 __libpthread_version_placeholder F
@@ -9,7 +8,7 @@ GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.2 __libpthread_version_placeholder F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.3.2 __libpthread_version_placeholder F
 GLIBC_2.3.3 __libpthread_version_placeholder F
 GLIBC_2.3.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
index f8b67cd170..e9340671c5 100644
--- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
@@ -1490,6 +1490,7 @@ GLIBC_2.18 pthread_condattr_getpshared F
 GLIBC_2.18 pthread_condattr_init F
 GLIBC_2.18 pthread_condattr_setclock F
 GLIBC_2.18 pthread_condattr_setpshared F
+GLIBC_2.18 pthread_create F
 GLIBC_2.18 pthread_detach F
 GLIBC_2.18 pthread_equal F
 GLIBC_2.18 pthread_exit F
@@ -2268,6 +2269,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2364,6 +2366,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2436,6 +2439,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist
index 921e604dbe..c99c8b026c 100644
--- a/sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist
@@ -1,5 +1,4 @@
 GLIBC_2.18 __errno_location F
-GLIBC_2.18 pthread_create F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
 GLIBC_2.31 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
index edac4a1bb4..6ddc0e90cf 100644
--- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
@@ -1490,6 +1490,7 @@ GLIBC_2.18 pthread_condattr_getpshared F
 GLIBC_2.18 pthread_condattr_init F
 GLIBC_2.18 pthread_condattr_setclock F
 GLIBC_2.18 pthread_condattr_setpshared F
+GLIBC_2.18 pthread_create F
 GLIBC_2.18 pthread_detach F
 GLIBC_2.18 pthread_equal F
 GLIBC_2.18 pthread_exit F
@@ -2268,6 +2269,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2361,6 +2363,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2433,6 +2436,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist
index 921e604dbe..c99c8b026c 100644
--- a/sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist
@@ -1,5 +1,4 @@
 GLIBC_2.18 __errno_location F
-GLIBC_2.18 pthread_create F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
 GLIBC_2.31 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
index db900c89ab..8582c9c371 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
@@ -871,6 +871,7 @@ GLIBC_2.0 pthread_cond_timedwait F
 GLIBC_2.0 pthread_cond_wait F
 GLIBC_2.0 pthread_condattr_destroy F
 GLIBC_2.0 pthread_condattr_init F
+GLIBC_2.0 pthread_create F
 GLIBC_2.0 pthread_detach F
 GLIBC_2.0 pthread_equal F
 GLIBC_2.0 pthread_exit F
@@ -1869,6 +1870,7 @@ GLIBC_2.2 pthread_barrierattr_init F
 GLIBC_2.2 pthread_barrierattr_setpshared F
 GLIBC_2.2 pthread_condattr_getpshared F
 GLIBC_2.2 pthread_condattr_setpshared F
+GLIBC_2.2 pthread_create F
 GLIBC_2.2 pthread_getconcurrency F
 GLIBC_2.2 pthread_getcpuclockid F
 GLIBC_2.2 pthread_mutex_timedlock F
@@ -2092,6 +2094,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2357,6 +2360,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2429,6 +2433,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
index a5f3d5ce2a..2d0b9e3542 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
@@ -1,12 +1,11 @@
 GLIBC_2.0 __errno_location F
-GLIBC_2.0 pthread_create F
 GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2 pthread_create F
+GLIBC_2.2 __libpthread_version_placeholder F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.3.2 __libpthread_version_placeholder F
 GLIBC_2.3.3 __libpthread_version_placeholder F
 GLIBC_2.3.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
index 4e15f48b6c..b0849bec98 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
@@ -871,6 +871,7 @@ GLIBC_2.0 pthread_cond_timedwait F
 GLIBC_2.0 pthread_cond_wait F
 GLIBC_2.0 pthread_condattr_destroy F
 GLIBC_2.0 pthread_condattr_init F
+GLIBC_2.0 pthread_create F
 GLIBC_2.0 pthread_detach F
 GLIBC_2.0 pthread_equal F
 GLIBC_2.0 pthread_exit F
@@ -1867,6 +1868,7 @@ GLIBC_2.2 pthread_barrierattr_init F
 GLIBC_2.2 pthread_barrierattr_setpshared F
 GLIBC_2.2 pthread_condattr_getpshared F
 GLIBC_2.2 pthread_condattr_setpshared F
+GLIBC_2.2 pthread_create F
 GLIBC_2.2 pthread_getconcurrency F
 GLIBC_2.2 pthread_getcpuclockid F
 GLIBC_2.2 pthread_mutex_timedlock F
@@ -2090,6 +2092,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2355,6 +2358,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2427,6 +2431,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
index a5f3d5ce2a..2d0b9e3542 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
@@ -1,12 +1,11 @@
 GLIBC_2.0 __errno_location F
-GLIBC_2.0 pthread_create F
 GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2 pthread_create F
+GLIBC_2.2 __libpthread_version_placeholder F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.3.2 __libpthread_version_placeholder F
 GLIBC_2.3.3 __libpthread_version_placeholder F
 GLIBC_2.3.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
index 616a6076f1..386660a5a1 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
@@ -871,6 +871,7 @@ GLIBC_2.0 pthread_cond_timedwait F
 GLIBC_2.0 pthread_cond_wait F
 GLIBC_2.0 pthread_condattr_destroy F
 GLIBC_2.0 pthread_condattr_init F
+GLIBC_2.0 pthread_create F
 GLIBC_2.0 pthread_detach F
 GLIBC_2.0 pthread_equal F
 GLIBC_2.0 pthread_exit F
@@ -1867,6 +1868,7 @@ GLIBC_2.2 pthread_barrierattr_init F
 GLIBC_2.2 pthread_barrierattr_setpshared F
 GLIBC_2.2 pthread_condattr_getpshared F
 GLIBC_2.2 pthread_condattr_setpshared F
+GLIBC_2.2 pthread_create F
 GLIBC_2.2 pthread_getconcurrency F
 GLIBC_2.2 pthread_getcpuclockid F
 GLIBC_2.2 pthread_mutex_timedlock F
@@ -2098,6 +2100,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2363,6 +2366,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2435,6 +2439,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
index 59a353d306..4d05128f21 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
@@ -869,6 +869,7 @@ GLIBC_2.0 pthread_cond_timedwait F
 GLIBC_2.0 pthread_cond_wait F
 GLIBC_2.0 pthread_condattr_destroy F
 GLIBC_2.0 pthread_condattr_init F
+GLIBC_2.0 pthread_create F
 GLIBC_2.0 pthread_detach F
 GLIBC_2.0 pthread_equal F
 GLIBC_2.0 pthread_exit F
@@ -1863,6 +1864,7 @@ GLIBC_2.2 pthread_barrierattr_init F
 GLIBC_2.2 pthread_barrierattr_setpshared F
 GLIBC_2.2 pthread_condattr_getpshared F
 GLIBC_2.2 pthread_condattr_setpshared F
+GLIBC_2.2 pthread_create F
 GLIBC_2.2 pthread_getconcurrency F
 GLIBC_2.2 pthread_getcpuclockid F
 GLIBC_2.2 pthread_mutex_timedlock F
@@ -2093,6 +2095,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2357,6 +2360,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2429,6 +2433,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
index 0fc42897aa..bd305f440f 100644
--- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
@@ -1533,6 +1533,7 @@ GLIBC_2.21 pthread_condattr_getpshared F
 GLIBC_2.21 pthread_condattr_init F
 GLIBC_2.21 pthread_condattr_setclock F
 GLIBC_2.21 pthread_condattr_setpshared F
+GLIBC_2.21 pthread_create F
 GLIBC_2.21 pthread_detach F
 GLIBC_2.21 pthread_equal F
 GLIBC_2.21 pthread_exit F
@@ -2310,6 +2311,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2403,6 +2405,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2475,6 +2478,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/nios2/libpthread.abilist b/sysdeps/unix/sysv/linux/nios2/libpthread.abilist
index f36733746e..4d8ff6a262 100644
--- a/sysdeps/unix/sysv/linux/nios2/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libpthread.abilist
@@ -1,5 +1,4 @@
 GLIBC_2.21 __errno_location F
-GLIBC_2.21 pthread_create F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
 GLIBC_2.31 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
index 553ecdabc9..c2665624aa 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
@@ -882,6 +882,7 @@ GLIBC_2.0 pthread_cond_timedwait F
 GLIBC_2.0 pthread_cond_wait F
 GLIBC_2.0 pthread_condattr_destroy F
 GLIBC_2.0 pthread_condattr_init F
+GLIBC_2.0 pthread_create F
 GLIBC_2.0 pthread_detach F
 GLIBC_2.0 pthread_equal F
 GLIBC_2.0 pthread_exit F
@@ -1592,6 +1593,7 @@ GLIBC_2.1 pthread_attr_init F
 GLIBC_2.1 pthread_attr_setguardsize F
 GLIBC_2.1 pthread_attr_setstackaddr F
 GLIBC_2.1 pthread_attr_setstacksize F
+GLIBC_2.1 pthread_create F
 GLIBC_2.1 pthread_getconcurrency F
 GLIBC_2.1 pthread_mutexattr_gettype F
 GLIBC_2.1 pthread_mutexattr_settype F
@@ -2126,6 +2128,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2419,6 +2422,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2491,6 +2495,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
index 84a1592904..e545bcc56c 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
@@ -1,6 +1,5 @@
 GLIBC_2.0 __errno_location F
-GLIBC_2.0 pthread_create F
-GLIBC_2.1 pthread_create F
+GLIBC_2.1 __libpthread_version_placeholder F
 GLIBC_2.1.1 __libpthread_version_placeholder F
 GLIBC_2.1.2 __libpthread_version_placeholder F
 GLIBC_2.11 __libpthread_version_placeholder F
@@ -9,7 +8,7 @@ GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.2 __libpthread_version_placeholder F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.3.2 __libpthread_version_placeholder F
 GLIBC_2.3.3 __libpthread_version_placeholder F
 GLIBC_2.3.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
index 7ec438f7b4..13ef6ef39e 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
@@ -882,6 +882,7 @@ GLIBC_2.0 pthread_cond_timedwait F
 GLIBC_2.0 pthread_cond_wait F
 GLIBC_2.0 pthread_condattr_destroy F
 GLIBC_2.0 pthread_condattr_init F
+GLIBC_2.0 pthread_create F
 GLIBC_2.0 pthread_detach F
 GLIBC_2.0 pthread_equal F
 GLIBC_2.0 pthread_exit F
@@ -1592,6 +1593,7 @@ GLIBC_2.1 pthread_attr_init F
 GLIBC_2.1 pthread_attr_setguardsize F
 GLIBC_2.1 pthread_attr_setstackaddr F
 GLIBC_2.1 pthread_attr_setstacksize F
+GLIBC_2.1 pthread_create F
 GLIBC_2.1 pthread_getconcurrency F
 GLIBC_2.1 pthread_mutexattr_gettype F
 GLIBC_2.1 pthread_mutexattr_settype F
@@ -2130,6 +2132,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2452,6 +2455,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2524,6 +2528,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
index f382e3e296..b21072e313 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
@@ -140,6 +140,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -1437,6 +1438,7 @@ GLIBC_2.3 pthread_condattr_destroy F
 GLIBC_2.3 pthread_condattr_getpshared F
 GLIBC_2.3 pthread_condattr_init F
 GLIBC_2.3 pthread_condattr_setpshared F
+GLIBC_2.3 pthread_create F
 GLIBC_2.3 pthread_detach F
 GLIBC_2.3 pthread_equal F
 GLIBC_2.3 pthread_exit F
@@ -2267,6 +2269,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2339,6 +2342,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
index b66279a352..e10c836946 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
@@ -1,9 +1,8 @@
 GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.3 __errno_location F
-GLIBC_2.3 pthread_create F
 GLIBC_2.3.2 __libpthread_version_placeholder F
 GLIBC_2.3.3 __libpthread_version_placeholder F
 GLIBC_2.3.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
index 97ff951418..62af65536c 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
@@ -1576,6 +1576,7 @@ GLIBC_2.17 pthread_condattr_getpshared F
 GLIBC_2.17 pthread_condattr_init F
 GLIBC_2.17 pthread_condattr_setclock F
 GLIBC_2.17 pthread_condattr_setpshared F
+GLIBC_2.17 pthread_create F
 GLIBC_2.17 pthread_detach F
 GLIBC_2.17 pthread_equal F
 GLIBC_2.17 pthread_exit F
@@ -2367,6 +2368,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2566,6 +2568,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2638,6 +2641,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
index 3c03fcc17b..14ada15a35 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
@@ -1,6 +1,5 @@
 GLIBC_2.17 __errno_location F
-GLIBC_2.17 pthread_create F
 GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
 GLIBC_2.31 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
index 5bde5bb508..a63aec3379 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
@@ -1431,6 +1431,7 @@ GLIBC_2.33 pthread_condattr_getpshared F
 GLIBC_2.33 pthread_condattr_init F
 GLIBC_2.33 pthread_condattr_setclock F
 GLIBC_2.33 pthread_condattr_setpshared F
+GLIBC_2.33 pthread_create F
 GLIBC_2.33 pthread_detach F
 GLIBC_2.33 pthread_equal F
 GLIBC_2.33 pthread_exit F
@@ -1899,6 +1900,7 @@ GLIBC_2.33 tempnam F
 GLIBC_2.33 textdomain F
 GLIBC_2.33 tfind F
 GLIBC_2.33 tgkill F
+GLIBC_2.33 thrd_create F
 GLIBC_2.33 thrd_current F
 GLIBC_2.33 thrd_detach F
 GLIBC_2.33 thrd_equal F
@@ -2131,6 +2133,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2203,6 +2206,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist
index e9cded0b3c..73188776b6 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist
@@ -1,3 +1 @@
 GLIBC_2.33 __errno_location F
-GLIBC_2.33 pthread_create F
-GLIBC_2.33 thrd_create F
diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
index 42f6d52e13..b52efaf5ee 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
@@ -1478,6 +1478,7 @@ GLIBC_2.27 pthread_condattr_getpshared F
 GLIBC_2.27 pthread_condattr_init F
 GLIBC_2.27 pthread_condattr_setclock F
 GLIBC_2.27 pthread_condattr_setpshared F
+GLIBC_2.27 pthread_create F
 GLIBC_2.27 pthread_detach F
 GLIBC_2.27 pthread_equal F
 GLIBC_2.27 pthread_exit F
@@ -2238,6 +2239,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2331,6 +2333,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2403,6 +2406,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
index 07a3c7f01d..35a6a20935 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
@@ -1,5 +1,4 @@
 GLIBC_2.27 __errno_location F
-GLIBC_2.27 pthread_create F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
 GLIBC_2.31 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
index 2274342208..b699dedcc1 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
@@ -873,6 +873,7 @@ GLIBC_2.0 pthread_cond_timedwait F
 GLIBC_2.0 pthread_cond_wait F
 GLIBC_2.0 pthread_condattr_destroy F
 GLIBC_2.0 pthread_condattr_init F
+GLIBC_2.0 pthread_create F
 GLIBC_2.0 pthread_detach F
 GLIBC_2.0 pthread_equal F
 GLIBC_2.0 pthread_exit F
@@ -1584,6 +1585,7 @@ GLIBC_2.1 pthread_attr_init F
 GLIBC_2.1 pthread_attr_setguardsize F
 GLIBC_2.1 pthread_attr_setstackaddr F
 GLIBC_2.1 pthread_attr_setstacksize F
+GLIBC_2.1 pthread_create F
 GLIBC_2.1 pthread_getconcurrency F
 GLIBC_2.1 pthread_mutexattr_gettype F
 GLIBC_2.1 pthread_mutexattr_settype F
@@ -2135,6 +2137,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2417,6 +2420,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2489,6 +2493,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
index faae6bcf76..ac212e942a 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
@@ -1,6 +1,5 @@
 GLIBC_2.0 __errno_location F
-GLIBC_2.0 pthread_create F
-GLIBC_2.1 pthread_create F
+GLIBC_2.1 __libpthread_version_placeholder F
 GLIBC_2.1.1 __libpthread_version_placeholder F
 GLIBC_2.1.2 __libpthread_version_placeholder F
 GLIBC_2.11 __libpthread_version_placeholder F
@@ -10,7 +9,7 @@ GLIBC_2.19 __libpthread_version_placeholder F
 GLIBC_2.2 __libpthread_version_placeholder F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.3.2 __libpthread_version_placeholder F
 GLIBC_2.3.3 __libpthread_version_placeholder F
 GLIBC_2.3.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
index 14d1c5e7f8..94209858b1 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
@@ -1330,6 +1330,7 @@ GLIBC_2.2 pthread_condattr_destroy F
 GLIBC_2.2 pthread_condattr_getpshared F
 GLIBC_2.2 pthread_condattr_init F
 GLIBC_2.2 pthread_condattr_setpshared F
+GLIBC_2.2 pthread_create F
 GLIBC_2.2 pthread_detach F
 GLIBC_2.2 pthread_equal F
 GLIBC_2.2 pthread_exit F
@@ -2026,6 +2027,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2304,6 +2306,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2376,6 +2379,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
index ac3a2834dc..e0feab34d5 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
@@ -3,10 +3,9 @@ GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.19 __libpthread_version_placeholder F
 GLIBC_2.2 __errno_location F
-GLIBC_2.2 pthread_create F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.3.2 __libpthread_version_placeholder F
 GLIBC_2.3.3 __libpthread_version_placeholder F
 GLIBC_2.3.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
index 97942ff01a..0fab90e1e3 100644
--- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
@@ -1316,6 +1316,7 @@ GLIBC_2.2 pthread_condattr_destroy F
 GLIBC_2.2 pthread_condattr_getpshared F
 GLIBC_2.2 pthread_condattr_init F
 GLIBC_2.2 pthread_condattr_setpshared F
+GLIBC_2.2 pthread_create F
 GLIBC_2.2 pthread_detach F
 GLIBC_2.2 pthread_equal F
 GLIBC_2.2 pthread_exit F
@@ -2003,6 +2004,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2273,6 +2275,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2345,6 +2348,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/sh/be/libpthread.abilist b/sysdeps/unix/sysv/linux/sh/be/libpthread.abilist
index cc941573b6..f1adf37ff2 100644
--- a/sysdeps/unix/sysv/linux/sh/be/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/sh/be/libpthread.abilist
@@ -2,10 +2,9 @@ GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.2 __errno_location F
-GLIBC_2.2 pthread_create F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.3.2 __libpthread_version_placeholder F
 GLIBC_2.3.3 __libpthread_version_placeholder F
 GLIBC_2.3.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
index 617b673620..2f3a64b580 100644
--- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
@@ -1316,6 +1316,7 @@ GLIBC_2.2 pthread_condattr_destroy F
 GLIBC_2.2 pthread_condattr_getpshared F
 GLIBC_2.2 pthread_condattr_init F
 GLIBC_2.2 pthread_condattr_setpshared F
+GLIBC_2.2 pthread_create F
 GLIBC_2.2 pthread_detach F
 GLIBC_2.2 pthread_equal F
 GLIBC_2.2 pthread_exit F
@@ -2003,6 +2004,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2270,6 +2272,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2342,6 +2345,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/sh/le/libpthread.abilist b/sysdeps/unix/sysv/linux/sh/le/libpthread.abilist
index cc941573b6..f1adf37ff2 100644
--- a/sysdeps/unix/sysv/linux/sh/le/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/sh/le/libpthread.abilist
@@ -2,10 +2,9 @@ GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.2 __errno_location F
-GLIBC_2.2 pthread_create F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.3.2 __libpthread_version_placeholder F
 GLIBC_2.3.3 __libpthread_version_placeholder F
 GLIBC_2.3.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
index 3c6559bb4f..e6fe453f50 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
@@ -876,6 +876,7 @@ GLIBC_2.0 pthread_cond_timedwait F
 GLIBC_2.0 pthread_cond_wait F
 GLIBC_2.0 pthread_condattr_destroy F
 GLIBC_2.0 pthread_condattr_init F
+GLIBC_2.0 pthread_create F
 GLIBC_2.0 pthread_detach F
 GLIBC_2.0 pthread_equal F
 GLIBC_2.0 pthread_exit F
@@ -1585,6 +1586,7 @@ GLIBC_2.1 pthread_attr_init F
 GLIBC_2.1 pthread_attr_setguardsize F
 GLIBC_2.1 pthread_attr_setstackaddr F
 GLIBC_2.1 pthread_attr_setstacksize F
+GLIBC_2.1 pthread_create F
 GLIBC_2.1 pthread_getconcurrency F
 GLIBC_2.1 pthread_mutexattr_gettype F
 GLIBC_2.1 pthread_mutexattr_settype F
@@ -2129,6 +2131,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2410,6 +2413,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2482,6 +2486,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
index c8f065b787..47cbcf3baf 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
@@ -1,6 +1,5 @@
 GLIBC_2.0 __errno_location F
-GLIBC_2.0 pthread_create F
-GLIBC_2.1 pthread_create F
+GLIBC_2.1 __libpthread_version_placeholder F
 GLIBC_2.1.1 __libpthread_version_placeholder F
 GLIBC_2.1.2 __libpthread_version_placeholder F
 GLIBC_2.11 __libpthread_version_placeholder F
@@ -9,7 +8,7 @@ GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.2 __libpthread_version_placeholder F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.3.2 __libpthread_version_placeholder F
 GLIBC_2.3.3 __libpthread_version_placeholder F
 GLIBC_2.3.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
index 77f54bb23b..4327cf5eb3 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
@@ -1359,6 +1359,7 @@ GLIBC_2.2 pthread_condattr_destroy F
 GLIBC_2.2 pthread_condattr_getpshared F
 GLIBC_2.2 pthread_condattr_init F
 GLIBC_2.2 pthread_condattr_setpshared F
+GLIBC_2.2 pthread_create F
 GLIBC_2.2 pthread_detach F
 GLIBC_2.2 pthread_equal F
 GLIBC_2.2 pthread_exit F
@@ -2056,6 +2057,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2323,6 +2325,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2395,6 +2398,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
index cc941573b6..f1adf37ff2 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
@@ -2,10 +2,9 @@ GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.2 __errno_location F
-GLIBC_2.2 pthread_create F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.3.2 __libpthread_version_placeholder F
 GLIBC_2.3.3 __libpthread_version_placeholder F
 GLIBC_2.3.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
index 4035841a1e..318a6d50f9 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
@@ -1326,6 +1326,7 @@ GLIBC_2.2.5 pthread_condattr_destroy F
 GLIBC_2.2.5 pthread_condattr_getpshared F
 GLIBC_2.2.5 pthread_condattr_init F
 GLIBC_2.2.5 pthread_condattr_setpshared F
+GLIBC_2.2.5 pthread_create F
 GLIBC_2.2.5 pthread_detach F
 GLIBC_2.2.5 pthread_equal F
 GLIBC_2.2.5 pthread_exit F
@@ -2015,6 +2016,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2282,6 +2284,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2354,6 +2357,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
index d3abfb7d11..ec4e3c0ecd 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
@@ -2,9 +2,8 @@ GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.2.5 __errno_location F
-GLIBC_2.2.5 pthread_create F
 GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.3.2 __libpthread_version_placeholder F
 GLIBC_2.3.3 __libpthread_version_placeholder F
 GLIBC_2.3.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
index 61ac187db9..0bcf898d4d 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
@@ -1495,6 +1495,7 @@ GLIBC_2.16 pthread_condattr_getpshared F
 GLIBC_2.16 pthread_condattr_init F
 GLIBC_2.16 pthread_condattr_setclock F
 GLIBC_2.16 pthread_condattr_setpshared F
+GLIBC_2.16 pthread_create F
 GLIBC_2.16 pthread_detach F
 GLIBC_2.16 pthread_equal F
 GLIBC_2.16 pthread_exit F
@@ -2290,6 +2291,7 @@ GLIBC_2.28 mtx_trylock F
 GLIBC_2.28 mtx_unlock F
 GLIBC_2.28 renameat2 F
 GLIBC_2.28 statx F
+GLIBC_2.28 thrd_create F
 GLIBC_2.28 thrd_current F
 GLIBC_2.28 thrd_detach F
 GLIBC_2.28 thrd_equal F
@@ -2385,6 +2387,7 @@ GLIBC_2.34 pthread_condattr_getclock F
 GLIBC_2.34 pthread_condattr_getpshared F
 GLIBC_2.34 pthread_condattr_setclock F
 GLIBC_2.34 pthread_condattr_setpshared F
+GLIBC_2.34 pthread_create F
 GLIBC_2.34 pthread_detach F
 GLIBC_2.34 pthread_getattr_default_np F
 GLIBC_2.34 pthread_getconcurrency F
@@ -2457,6 +2460,7 @@ GLIBC_2.34 sem_timedwait F
 GLIBC_2.34 sem_trywait F
 GLIBC_2.34 sem_unlink F
 GLIBC_2.34 sem_wait F
+GLIBC_2.34 thrd_create F
 GLIBC_2.34 thrd_detach F
 GLIBC_2.34 thrd_exit F
 GLIBC_2.34 thrd_join F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
index af42dea518..cc6e073a11 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
@@ -1,6 +1,5 @@
 GLIBC_2.16 __errno_location F
-GLIBC_2.16 pthread_create F
 GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.28 thrd_create F
+GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
 GLIBC_2.31 __libpthread_version_placeholder F
-- 
2.31.1



^ permalink raw reply	[flat|nested] 47+ messages in thread

* [PATCH 06/10] nptl: Remove unused __libc_pthread_init function
  2021-05-18 14:24 [PATCH 00/10] nptl: Complete libpthread removal Florian Weimer
                   ` (4 preceding siblings ...)
  2021-05-18 14:25 ` [PATCH 05/10] nptl: Move pthread_create, thrd_create into libc Florian Weimer
@ 2021-05-18 14:25 ` Florian Weimer
  2021-05-18 14:49   ` Andreas Schwab
  2021-05-18 14:25 ` [PATCH 07/10] nptl: Remove remaining code from libpthread Florian Weimer
                   ` (5 subsequent siblings)
  11 siblings, 1 reply; 47+ messages in thread
From: Florian Weimer @ 2021-05-18 14:25 UTC (permalink / raw)
  To: libc-alpha

Fixes commit 732139dabeda7ecce0d56200bc176251e759ccde
("Linux: Move __reclaim_stacks into the fork implementation in
libc").
---
 nptl/Makefile            |  1 -
 nptl/libc_pthread_init.c | 35 -----------------------------------
 2 files changed, 36 deletions(-)
 delete mode 100644 nptl/libc_pthread_init.c

diff --git a/nptl/Makefile b/nptl/Makefile
index 7426997a83..a6e3b615a8 100644
--- a/nptl/Makefile
+++ b/nptl/Makefile
@@ -45,7 +45,6 @@ routines = \
   futex-internal \
   libc-cleanup \
   libc_multiple_threads \
-  libc_pthread_init \
   lowlevellock \
   nptl-stack \
   nptl_deallocate_tsd \
diff --git a/nptl/libc_pthread_init.c b/nptl/libc_pthread_init.c
deleted file mode 100644
index 75f5d28ed6..0000000000
--- a/nptl/libc_pthread_init.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Copyright (C) 2002-2021 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include <unistd.h>
-#include <list.h>
-#include <register-atfork.h>
-#include <dl-sysdep.h>
-#include <tls.h>
-#include <string.h>
-#include <pthreadP.h>
-#include <libc-lock.h>
-#include <sysdep.h>
-#include <ldsodefs.h>
-
-void
-__libc_pthread_init (void (*reclaim) (void))
-{
-  /* Called by a child after fork.  */
-  __register_atfork (NULL, NULL, reclaim, NULL);
-}
-- 
2.31.1



^ permalink raw reply	[flat|nested] 47+ messages in thread

* [PATCH 07/10] nptl: Remove remaining code from libpthread
  2021-05-18 14:24 [PATCH 00/10] nptl: Complete libpthread removal Florian Weimer
                   ` (5 preceding siblings ...)
  2021-05-18 14:25 ` [PATCH 06/10] nptl: Remove unused __libc_pthread_init function Florian Weimer
@ 2021-05-18 14:25 ` Florian Weimer
  2021-05-20 20:49   ` Adhemerval Zanella
  2021-05-18 14:25 ` [PATCH 08/10] elf: Do not load libpthread for PTHREAD_IN_LIBC Florian Weimer
                   ` (4 subsequent siblings)
  11 siblings, 1 reply; 47+ messages in thread
From: Florian Weimer @ 2021-05-18 14:25 UTC (permalink / raw)
  To: libc-alpha

Only the placeholder compatibility symbols are left now.

The __errno_location symbol was removed (moved) using
scripts/move-symbol-to-libc.py.
---
 nptl/Makefile                                 | 46 ++---------------
 nptl/Versions                                 | 12 +----
 nptl/libpthread-compat.c                      | 10 ++--
 nptl/nptl-init.c                              | 46 -----------------
 nptl/pt-crti.S                                | 50 -------------------
 nptl/pt-interp.c                              |  1 -
 nptl/version.c                                | 41 ---------------
 sysdeps/arm/nptl-aeabi_unwind_cpp_pr1.c       |  1 -
 sysdeps/arm/nptl/Makefile                     |  3 --
 sysdeps/ia64/nptl/Makefile                    |  5 --
 sysdeps/mips/Makefile                         |  5 --
 sysdeps/mips/nptl/Makefile                    |  5 --
 sysdeps/mips/nptl/nptl-sysdep.S               |  2 -
 sysdeps/nptl/Makefile                         |  4 --
 sysdeps/riscv/nptl/Makefile                   |  5 --
 sysdeps/riscv/nptl/nptl-sysdep.S              |  2 -
 sysdeps/s390/nptl/Makefile                    |  5 --
 sysdeps/sparc/Makefile                        |  4 --
 sysdeps/sparc/nptl/Makefile                   |  5 --
 .../sysv/linux/aarch64/libpthread.abilist     |  2 +-
 sysdeps/unix/sysv/linux/alpha/Makefile        |  6 ---
 .../unix/sysv/linux/alpha/libpthread.abilist  |  2 +-
 .../unix/sysv/linux/arc/libpthread.abilist    |  2 +-
 sysdeps/unix/sysv/linux/arm/Makefile          |  5 --
 .../unix/sysv/linux/arm/be/libpthread.abilist |  1 -
 .../unix/sysv/linux/arm/le/libpthread.abilist |  1 -
 .../unix/sysv/linux/csky/libpthread.abilist   |  2 +-
 .../unix/sysv/linux/hppa/libpthread.abilist   |  2 +-
 sysdeps/unix/sysv/linux/i386/Makefile         | 11 ----
 .../unix/sysv/linux/i386/libpthread.abilist   |  2 +-
 .../unix/sysv/linux/ia64/libpthread.abilist   |  2 +-
 .../linux/m68k/coldfire/libpthread.abilist    |  1 -
 .../sysv/linux/m68k/m680x0/libpthread.abilist |  2 +-
 sysdeps/unix/sysv/linux/microblaze/Makefile   |  6 ---
 .../linux/microblaze/be/libpthread.abilist    |  2 +-
 .../linux/microblaze/le/libpthread.abilist    |  2 +-
 .../sysv/linux/mips/mips32/libpthread.abilist |  2 +-
 .../sysv/linux/mips/mips64/libpthread.abilist |  2 +-
 .../unix/sysv/linux/nios2/libpthread.abilist  |  2 +-
 sysdeps/unix/sysv/linux/powerpc/Makefile      |  5 --
 .../powerpc/powerpc32/libpthread.abilist      |  2 +-
 .../powerpc/powerpc64/be/libpthread.abilist   |  2 +-
 .../powerpc/powerpc64/le/libpthread.abilist   |  2 +-
 .../sysv/linux/riscv/rv32/libpthread.abilist  |  2 +-
 .../sysv/linux/riscv/rv64/libpthread.abilist  |  2 +-
 .../linux/s390/s390-32/libpthread.abilist     |  2 +-
 .../linux/s390/s390-64/libpthread.abilist     |  2 +-
 .../unix/sysv/linux/sh/be/libpthread.abilist  |  2 +-
 .../unix/sysv/linux/sh/le/libpthread.abilist  |  2 +-
 sysdeps/unix/sysv/linux/sparc/Makefile        |  6 ---
 .../linux/sparc/sparc32/libpthread.abilist    |  2 +-
 .../linux/sparc/sparc64/libpthread.abilist    |  2 +-
 .../sysv/linux/x86_64/64/libpthread.abilist   |  2 +-
 .../sysv/linux/x86_64/x32/libpthread.abilist  |  2 +-
 54 files changed, 37 insertions(+), 309 deletions(-)
 delete mode 100644 nptl/nptl-init.c
 delete mode 100644 nptl/pt-crti.S
 delete mode 100644 nptl/pt-interp.c
 delete mode 100644 nptl/version.c
 delete mode 100644 sysdeps/arm/nptl-aeabi_unwind_cpp_pr1.c
 delete mode 100644 sysdeps/mips/nptl/nptl-sysdep.S
 delete mode 100644 sysdeps/riscv/nptl/nptl-sysdep.S

diff --git a/nptl/Makefile b/nptl/Makefile
index a6e3b615a8..64cd0dcbf6 100644
--- a/nptl/Makefile
+++ b/nptl/Makefile
@@ -207,16 +207,8 @@ routines = \
 shared-only-routines = forward
 static-only-routines = pthread_atfork
 
-libpthread-routines = \
-  libpthread-compat \
-  nptl-init \
-  pt-interp \
-  version \
-
-libpthread-shared-only-routines = \
-  pt-allocrtsig \
-  pt-interp \
-  version \
+libpthread-routines = libpthread-compat
+libpthread-shared-only-routines = libpthread-compat
 
 # Since cancellation handling is in large parts handled using exceptions
 # we have to compile some files with exception handling enabled, some
@@ -382,7 +374,7 @@ else
 tests-printers-libs := $(static-thread-library)
 endif
 
-LDFLAGS-pthread.so = -Wl,--enable-new-dtags,-z,nodelete,-z,initfirst
+LDFLAGS-pthread.so = -Wl,--enable-new-dtags,-z,nodelete
 
 tests += tst-cancelx7 tst-cancelx17
 
@@ -432,17 +424,6 @@ $(objpfx)multidir.mk: $(common-objpfx)config.make
 	echo "multidir := $$dir" > $@T
 	mv -f $@T $@
 
-crti-objs := crti.o
-crtn-objs := crtn.o
-ifneq (,$(patsubst .,,$(multidir)))
-generated-dirs += $(firstword $(subst /, , $(multidir)))
-crti-objs += $(multidir)/crti.o
-crtn-objs += $(multidir)/crtn.o
-$(objpfx)$(multidir):
-	mkdir -p $@
-endif
-extra-objs += $(crti-objs) $(crtn-objs)
-extra-objs += pt-crti.o
 endif
 
 CFLAGS-ftrylockfile.c += $(libio-mtsafe)
@@ -577,11 +558,6 @@ $(objpfx)tst-cancelx17: $(librt)
 LDLIBS-tst-cancel24 = -Wl,--no-as-needed -lstdc++
 LDLIBS-tst-cancel24-static = $(LDLIBS-tst-cancel24)
 
-extra-B-pthread.so = -B$(common-objpfx)nptl/
-$(objpfx)libpthread.so: $(addprefix $(objpfx),$(crti-objs) $(crtn-objs))
-$(objpfx)libpthread.so: +preinit += $(addprefix $(objpfx),$(crti-objs))
-$(objpfx)libpthread.so: +postinit += $(addprefix $(objpfx),$(crtn-objs))
-
 # Make sure we link with the thread library.
 ifeq ($(build-shared),yes)
 $(addprefix $(objpfx), \
@@ -601,23 +577,7 @@ $(addprefix $(objpfx),$(tests) $(test-srcs)): $(objpfx)libpthread.a
 endif
 
 ifeq ($(build-shared),yes)
-$(objpfx)crti.o: $(objpfx)pt-crti.o
-	ln -f $< $@
-
-ifneq ($(multidir),.)
-$(objpfx)$(multidir)/crti.o: $(objpfx)crti.o $(objpfx)$(multidir)/
-	ln -f $< $@
-
-$(objpfx)$(multidir)/crtn.o: $(objpfx)crtn.o $(objpfx)$(multidir)/
-	ln -f $< $@
-endif
-
 generated += multidir.mk tst-tls6.out
-
-# Give libpthread.so an entry point and make it directly runnable itself.
-LDFLAGS-pthread.so += -e __nptl_main
-# pt-interp.c exists just to get the runtime linker path into libpthread.so.
-$(objpfx)pt-interp.os: $(common-objpfx)runtime-linker.h
 endif
 
 tst-exec4-ARGS = $(host-test-program-cmd)
diff --git a/nptl/Versions b/nptl/Versions
index 0db56bce29..af62a47cca 100644
--- a/nptl/Versions
+++ b/nptl/Versions
@@ -426,17 +426,7 @@ libc {
 
 libpthread {
   GLIBC_2.0 {
-    _Exit;
-    _IO_flockfile;
-    _IO_ftrylockfile;
-    _IO_funlockfile;
-    __errno_location;
-    _exit;
-    flockfile;
-    ftrylockfile;
-    funlockfile;
-    pthread_create;
-    pthread_sigmask;
+    __libpthread_version_placeholder;
   }
 
   GLIBC_2.1 {
diff --git a/nptl/libpthread-compat.c b/nptl/libpthread-compat.c
index 2dcf175f3f..fb336d0685 100644
--- a/nptl/libpthread-compat.c
+++ b/nptl/libpthread-compat.c
@@ -28,6 +28,11 @@ __libpthread_version_placeholder_1 (void)
 }
 #endif
 
+#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_34)
+compat_symbol (libpthread, __libpthread_version_placeholder_1,
+	       __libpthread_version_placeholder, GLIBC_2_0);
+#endif
+
 #if (SHLIB_COMPAT (libpthread, GLIBC_2_1, GLIBC_2_2))
 compat_symbol (libpthread, __libpthread_version_placeholder_1,
 	       __libpthread_version_placeholder, GLIBC_2_1);
@@ -42,7 +47,7 @@ compat_symbol (libpthread, __libpthread_version_placeholder_1,
 	       __libpthread_version_placeholder, GLIBC_2_1_2);
 #endif
 
-#if SHLIB_COMPAT (libpthread, GLIBC_2_2, GLIBC_2_2_3) \
+#if SHLIB_COMPAT (libpthread, GLIBC_2_2, GLIBC_2_3) \
   && ABI_libpthread_GLIBC_2_2 != ABI_libpthread_GLIBC_2_0
 compat_symbol (libpthread, __libpthread_version_placeholder_1,
 	       __libpthread_version_placeholder, GLIBC_2_2);
@@ -88,8 +93,7 @@ compat_symbol (libpthread, __libpthread_version_placeholder_1,
 	       __libpthread_version_placeholder, GLIBC_2_12);
 #endif
 
-#if SHLIB_COMPAT (libpthread, GLIBC_2_18, GLIBC_2_19) \
-  && ABI_libpthread_GLIBC_2_18 != ABI_libpthread_GLIBC_2_0
+#if SHLIB_COMPAT (libpthread, GLIBC_2_18, GLIBC_2_19)
 compat_symbol (libpthread, __libpthread_version_placeholder_1,
 	       __libpthread_version_placeholder, GLIBC_2_18);
 #endif
diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c
deleted file mode 100644
index 5a460aedba..0000000000
--- a/nptl/nptl-init.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Copyright (C) 2002-2021 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include <assert.h>
-#include <errno.h>
-#include <limits.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/param.h>
-#include <sys/resource.h>
-#include <pthreadP.h>
-#include <atomic.h>
-#include <ldsodefs.h>
-#include <tls.h>
-#include <list.h>
-#include <version.h>
-#include <shlib-compat.h>
-#include <lowlevellock.h>
-#include <futex-internal.h>
-#include <kernel-features.h>
-#include <libc-pointer-arith.h>
-#include <pthread_mutex_conf.h>
-#include <nptl-stack.h>
-
-void
-__pthread_initialize_minimal_internal (void)
-{
-}
-strong_alias (__pthread_initialize_minimal_internal,
-	      __pthread_initialize_minimal)
diff --git a/nptl/pt-crti.S b/nptl/pt-crti.S
deleted file mode 100644
index e618986f98..0000000000
--- a/nptl/pt-crti.S
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Special .init and .fini section support for libpthread.
-   Copyright (C) 2012-2021 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file with other
-   programs, and to distribute those programs without any restriction
-   coming from the use of this file. (The GNU Lesser General Public
-   License restrictions do apply in other respects; for example, they
-   cover modification of the file, and distribution when not linked
-   into another program.)
-
-   Note that people who make modified versions of this file are not
-   obligated to grant this special exception for their modified
-   versions; it is their choice whether to do so. The GNU Lesser
-   General Public License gives permission to release a modified
-   version without this exception; this exception also makes it
-   possible to release a modified version which carries forward this
-   exception.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include <elf-initfini.h>
-
-/* Arrange for __pthread_initialize_minimal_internal to be called at
-   libpthread startup, instead of conditionally calling
-   __gmon_start__.  */
-
-#if ELF_INITFINI
-# define PREINIT_FUNCTION __pthread_initialize_minimal_internal
-# define PREINIT_FUNCTION_WEAK 0
-
-# include <crti.S>
-#else
-	.section .init_array,"a",%init_array
-	.dc.a __pthread_initialize_minimal_internal
-#endif
diff --git a/nptl/pt-interp.c b/nptl/pt-interp.c
deleted file mode 100644
index ecf1fe70df..0000000000
--- a/nptl/pt-interp.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <elf/interp.c>
diff --git a/nptl/version.c b/nptl/version.c
deleted file mode 100644
index 25e3a0c872..0000000000
--- a/nptl/version.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Entry point for libpthread DSO.
-   Copyright (C) 2002-2021 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include <unistd.h>
-#include <sysdep.h>
-
-
-static const char banner[] =
-"Native POSIX Threads Library\n\
-Copyright (C) 2021 Free Software Foundation, Inc.\n\
-This is free software; see the source for copying conditions.\n\
-There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n\
-PARTICULAR PURPOSE.\n"
-"Forced unwind support included.\n"
-;
-
-
-/* This is made the e_entry of libpthread.so by LDFLAGS-pthread.so.  */
-__attribute__ ((noreturn))
-void
-__nptl_main (void)
-{
-  write (STDOUT_FILENO, banner, sizeof banner - 1);
-  _exit (0);
-}
diff --git a/sysdeps/arm/nptl-aeabi_unwind_cpp_pr1.c b/sysdeps/arm/nptl-aeabi_unwind_cpp_pr1.c
deleted file mode 100644
index 7b83522437..0000000000
--- a/sysdeps/arm/nptl-aeabi_unwind_cpp_pr1.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <aeabi_unwind_cpp_pr1.c>
diff --git a/sysdeps/arm/nptl/Makefile b/sysdeps/arm/nptl/Makefile
index 5e4905df2f..44154bff37 100644
--- a/sysdeps/arm/nptl/Makefile
+++ b/sysdeps/arm/nptl/Makefile
@@ -20,9 +20,6 @@ gen-as-const-headers += tcb-offsets.sym
 endif
 
 ifeq ($(subdir),nptl)
-libpthread-sysdep_routines += nptl-aeabi_unwind_cpp_pr1
-libpthread-shared-only-routines += nptl-aeabi_unwind_cpp_pr1
-
 # This test relies on compiling part of the binary with EH information,
 # part without, and unwinding through.  The .ARM.exidx tables have
 # start addresses for EH regions, but no end addresses.  Every
diff --git a/sysdeps/ia64/nptl/Makefile b/sysdeps/ia64/nptl/Makefile
index d8a8fc44fe..d99cfd5b34 100644
--- a/sysdeps/ia64/nptl/Makefile
+++ b/sysdeps/ia64/nptl/Makefile
@@ -18,8 +18,3 @@
 ifeq ($(subdir),csu)
 gen-as-const-headers += tcb-offsets.sym
 endif
-
-ifeq ($(subdir),nptl)
-libpthread-routines += sysdep
-libpthread-shared-only-routines += sysdep
-endif
diff --git a/sysdeps/mips/Makefile b/sysdeps/mips/Makefile
index 6ad69e9ef9..19e6a57622 100644
--- a/sysdeps/mips/Makefile
+++ b/sysdeps/mips/Makefile
@@ -17,11 +17,6 @@ CPPFLAGS-crti.S += $(pic-ccflag)
 CPPFLAGS-crtn.S += $(pic-ccflag)
 endif
 
-ifeq ($(subdir),nptl)
-CPPFLAGS-pt-crti.S += $(pic-ccflag)
-CPPFLAGS-crtn.S += $(pic-ccflag)
-endif
-
 ASFLAGS-.os += $(pic-ccflag)
 # libc.a and libc_p.a must be compiled with -fPIE/-fpie for static PIE.
 ASFLAGS-.o += $(pie-default)
diff --git a/sysdeps/mips/nptl/Makefile b/sysdeps/mips/nptl/Makefile
index 87ba580ec2..329a57a473 100644
--- a/sysdeps/mips/nptl/Makefile
+++ b/sysdeps/mips/nptl/Makefile
@@ -18,8 +18,3 @@
 ifeq ($(subdir),csu)
 gen-as-const-headers += tcb-offsets.sym
 endif
-
-ifeq ($(subdir),nptl)
-libpthread-sysdep_routines += nptl-sysdep
-libpthread-shared-only-routines += nptl-sysdep
-endif
diff --git a/sysdeps/mips/nptl/nptl-sysdep.S b/sysdeps/mips/nptl/nptl-sysdep.S
deleted file mode 100644
index 3f5c2a364a..0000000000
--- a/sysdeps/mips/nptl/nptl-sysdep.S
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Pull in __syscall_error.  */
-#include <sysdep.S>
diff --git a/sysdeps/nptl/Makefile b/sysdeps/nptl/Makefile
index 632cd3686b..0707f130eb 100644
--- a/sysdeps/nptl/Makefile
+++ b/sysdeps/nptl/Makefile
@@ -16,10 +16,6 @@
 # License along with the GNU C Library; if not, see
 # <https://www.gnu.org/licenses/>.
 
-ifeq ($(subdir),nptl)
-libpthread-sysdep_routines += errno-loc
-endif
-
 ifeq ($(subdir),rt)
 librt-sysdep_routines += timer_routines
 
diff --git a/sysdeps/riscv/nptl/Makefile b/sysdeps/riscv/nptl/Makefile
index 85ef9cf691..cca67db324 100644
--- a/sysdeps/riscv/nptl/Makefile
+++ b/sysdeps/riscv/nptl/Makefile
@@ -19,8 +19,3 @@
 ifeq ($(subdir),csu)
 gen-as-const-headers += tcb-offsets.sym
 endif
-
-ifeq ($(subdir),nptl)
-libpthread-sysdep_routines += nptl-sysdep
-libpthread-shared-only-routines += nptl-sysdep
-endif
diff --git a/sysdeps/riscv/nptl/nptl-sysdep.S b/sysdeps/riscv/nptl/nptl-sysdep.S
deleted file mode 100644
index 3f5c2a364a..0000000000
--- a/sysdeps/riscv/nptl/nptl-sysdep.S
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Pull in __syscall_error.  */
-#include <sysdep.S>
diff --git a/sysdeps/s390/nptl/Makefile b/sysdeps/s390/nptl/Makefile
index d8a8fc44fe..d99cfd5b34 100644
--- a/sysdeps/s390/nptl/Makefile
+++ b/sysdeps/s390/nptl/Makefile
@@ -18,8 +18,3 @@
 ifeq ($(subdir),csu)
 gen-as-const-headers += tcb-offsets.sym
 endif
-
-ifeq ($(subdir),nptl)
-libpthread-routines += sysdep
-libpthread-shared-only-routines += sysdep
-endif
diff --git a/sysdeps/sparc/Makefile b/sysdeps/sparc/Makefile
index c123b527b5..1be9a3db2c 100644
--- a/sysdeps/sparc/Makefile
+++ b/sysdeps/sparc/Makefile
@@ -30,9 +30,5 @@ ifeq ($(subdir),nscd)
 routines += cpu_relax
 endif
 
-ifeq ($(subdir), nptl)
-libpthread-routines += cpu_relax
-endif
-
 # The assembler on SPARC needs the -fPIC flag even when it's assembler code.
 ASFLAGS-.os += -fPIC
diff --git a/sysdeps/sparc/nptl/Makefile b/sysdeps/sparc/nptl/Makefile
index 5372867dbd..81bddf688c 100644
--- a/sysdeps/sparc/nptl/Makefile
+++ b/sysdeps/sparc/nptl/Makefile
@@ -1,8 +1,3 @@
 ifeq ($(subdir),csu)
 gen-as-const-headers += tcb-offsets.sym
 endif
-
-ifeq ($(subdir),nptl)
-CPPFLAGS-pt-crti.S += -fPIC
-CPPFLAGS-crtn.S += -fPIC
-endif
diff --git a/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist b/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
index 14ada15a35..cebf7c6064 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
@@ -1,4 +1,4 @@
-GLIBC_2.17 __errno_location F
+GLIBC_2.17 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/alpha/Makefile b/sysdeps/unix/sysv/linux/alpha/Makefile
index 92484bbe65..d7c7d7fc16 100644
--- a/sysdeps/unix/sysv/linux/alpha/Makefile
+++ b/sysdeps/unix/sysv/linux/alpha/Makefile
@@ -30,12 +30,6 @@ ifeq ($(subdir),math)
 libm-routines += multc3 divtc3
 endif   # math
 
-ifeq ($(subdir),nptl)
-# pull in __syscall_error routine, sigaction stubs.
-libpthread-routines += sysdep rt_sigaction
-libpthread-shared-only-routines += sysdep rt_sigaction
-endif
-
 ifeq ($(subdir),conform)
 # For bug 21260.
 conformtest-xfail-conds += alpha-linux
diff --git a/sysdeps/unix/sysv/linux/alpha/libpthread.abilist b/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
index 47cbcf3baf..051caff7c0 100644
--- a/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
@@ -1,4 +1,4 @@
-GLIBC_2.0 __errno_location F
+GLIBC_2.0 __libpthread_version_placeholder F
 GLIBC_2.1 __libpthread_version_placeholder F
 GLIBC_2.1.1 __libpthread_version_placeholder F
 GLIBC_2.1.2 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/arc/libpthread.abilist b/sysdeps/unix/sysv/linux/arc/libpthread.abilist
index c4264810e6..cd90b49787 100644
--- a/sysdeps/unix/sysv/linux/arc/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/arc/libpthread.abilist
@@ -1 +1 @@
-GLIBC_2.32 __errno_location F
+GLIBC_2.32 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/arm/Makefile b/sysdeps/unix/sysv/linux/arm/Makefile
index abdf01f00c..32db854cbd 100644
--- a/sysdeps/unix/sysv/linux/arm/Makefile
+++ b/sysdeps/unix/sysv/linux/arm/Makefile
@@ -26,11 +26,6 @@ librt-sysdep_routines += libc-do-syscall
 librt-shared-only-routines += libc-do-syscall
 endif
 
-ifeq ($(subdir),nptl)
-libpthread-sysdep_routines += libc-do-syscall
-libpthread-shared-only-routines += libc-do-syscall
-endif
-
 ifeq ($(subdir),resolv)
 libanl-sysdep_routines += libc-do-syscall
 libanl-shared-only-routines += libc-do-syscall
diff --git a/sysdeps/unix/sysv/linux/arm/be/libpthread.abilist b/sysdeps/unix/sysv/linux/arm/be/libpthread.abilist
index f8ebb4cae2..1774f414c6 100644
--- a/sysdeps/unix/sysv/linux/arm/be/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/arm/be/libpthread.abilist
@@ -4,5 +4,4 @@ GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
 GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __errno_location F
 GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/arm/le/libpthread.abilist b/sysdeps/unix/sysv/linux/arm/le/libpthread.abilist
index f8ebb4cae2..1774f414c6 100644
--- a/sysdeps/unix/sysv/linux/arm/le/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/arm/le/libpthread.abilist
@@ -4,5 +4,4 @@ GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
 GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __errno_location F
 GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/csky/libpthread.abilist b/sysdeps/unix/sysv/linux/csky/libpthread.abilist
index f7649b87b2..8ce9efcbf8 100644
--- a/sysdeps/unix/sysv/linux/csky/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/csky/libpthread.abilist
@@ -1,3 +1,3 @@
-GLIBC_2.29 __errno_location F
+GLIBC_2.29 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
 GLIBC_2.31 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/hppa/libpthread.abilist b/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
index f1adf37ff2..35b6df4615 100644
--- a/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
@@ -1,7 +1,7 @@
 GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2 __errno_location F
+GLIBC_2.2 __libpthread_version_placeholder F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
 GLIBC_2.28 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/i386/Makefile b/sysdeps/unix/sysv/linux/i386/Makefile
index da716e2c1b..26e0a8852b 100644
--- a/sysdeps/unix/sysv/linux/i386/Makefile
+++ b/sysdeps/unix/sysv/linux/i386/Makefile
@@ -18,11 +18,6 @@ ifeq ($(subdir),io)
 sysdep_routines += libc-do-syscall
 endif
 
-ifeq ($(subdir),nptl)
-libpthread-sysdep_routines += libc-do-syscall
-libpthread-shared-only-routines += libc-do-syscall
-endif
-
 ifeq ($(subdir),stdlib)
 gen-as-const-headers += ucontext_i.sym
 endif
@@ -36,12 +31,6 @@ CPPFLAGS-divdi3.c = -Din_divdi3_c
 endif
 endif
 
-ifeq ($(subdir),nptl)
-# pull in __syscall_error routine
-libpthread-routines += sysdep
-libpthread-shared-only-routines += sysdep
-endif
-
 ifeq ($(subdir),rt)
 # pull in __syscall_error routine
 librt-routines += sysdep
diff --git a/sysdeps/unix/sysv/linux/i386/libpthread.abilist b/sysdeps/unix/sysv/linux/i386/libpthread.abilist
index 47cbcf3baf..051caff7c0 100644
--- a/sysdeps/unix/sysv/linux/i386/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libpthread.abilist
@@ -1,4 +1,4 @@
-GLIBC_2.0 __errno_location F
+GLIBC_2.0 __libpthread_version_placeholder F
 GLIBC_2.1 __libpthread_version_placeholder F
 GLIBC_2.1.1 __libpthread_version_placeholder F
 GLIBC_2.1.2 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/ia64/libpthread.abilist b/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
index f1adf37ff2..35b6df4615 100644
--- a/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
@@ -1,7 +1,7 @@
 GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2 __errno_location F
+GLIBC_2.2 __libpthread_version_placeholder F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
 GLIBC_2.28 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
index f8ebb4cae2..1774f414c6 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
@@ -4,5 +4,4 @@ GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
 GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __errno_location F
 GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
index 47cbcf3baf..051caff7c0 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
@@ -1,4 +1,4 @@
-GLIBC_2.0 __errno_location F
+GLIBC_2.0 __libpthread_version_placeholder F
 GLIBC_2.1 __libpthread_version_placeholder F
 GLIBC_2.1.1 __libpthread_version_placeholder F
 GLIBC_2.1.2 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/microblaze/Makefile b/sysdeps/unix/sysv/linux/microblaze/Makefile
index d178bc6f34..614553204f 100644
--- a/sysdeps/unix/sysv/linux/microblaze/Makefile
+++ b/sysdeps/unix/sysv/linux/microblaze/Makefile
@@ -1,9 +1,3 @@
 ifeq ($(subdir),resource)
 sysdep_routines += backtrace_linux
 endif
-
-ifeq ($(subdir),nptl)
-# pull in __syscall_error routine
-libpthread-routines += sysdep
-libpthread-shared-only-routines += sysdep
-endif
diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist
index c99c8b026c..419561d3ce 100644
--- a/sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist
@@ -1,4 +1,4 @@
-GLIBC_2.18 __errno_location F
+GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
 GLIBC_2.31 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist
index c99c8b026c..419561d3ce 100644
--- a/sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist
@@ -1,4 +1,4 @@
-GLIBC_2.18 __errno_location F
+GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
 GLIBC_2.31 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
index 2d0b9e3542..eac5591410 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
@@ -1,4 +1,4 @@
-GLIBC_2.0 __errno_location F
+GLIBC_2.0 __libpthread_version_placeholder F
 GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
index 2d0b9e3542..eac5591410 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
@@ -1,4 +1,4 @@
-GLIBC_2.0 __errno_location F
+GLIBC_2.0 __libpthread_version_placeholder F
 GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/nios2/libpthread.abilist b/sysdeps/unix/sysv/linux/nios2/libpthread.abilist
index 4d8ff6a262..714dfd90aa 100644
--- a/sysdeps/unix/sysv/linux/nios2/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libpthread.abilist
@@ -1,4 +1,4 @@
-GLIBC_2.21 __errno_location F
+GLIBC_2.21 __libpthread_version_placeholder F
 GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
 GLIBC_2.31 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/powerpc/Makefile b/sysdeps/unix/sysv/linux/powerpc/Makefile
index 06f1328fab..733557ba13 100644
--- a/sysdeps/unix/sysv/linux/powerpc/Makefile
+++ b/sysdeps/unix/sysv/linux/powerpc/Makefile
@@ -25,8 +25,3 @@ tests += $(tests-static)
 tests += test-gettimebasefreq
 tests += test-powerpc-linux-sysconf
 endif
-
-ifeq ($(subdir),nptl)
-libpthread-routines += sysdep
-libpthread-shared-only-routines += sysdep
-endif
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
index e545bcc56c..5623c6a313 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
@@ -1,4 +1,4 @@
-GLIBC_2.0 __errno_location F
+GLIBC_2.0 __libpthread_version_placeholder F
 GLIBC_2.1 __libpthread_version_placeholder F
 GLIBC_2.1.1 __libpthread_version_placeholder F
 GLIBC_2.1.2 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
index e10c836946..3246752fdd 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
@@ -2,7 +2,7 @@ GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.3 __errno_location F
+GLIBC_2.3 __libpthread_version_placeholder F
 GLIBC_2.3.2 __libpthread_version_placeholder F
 GLIBC_2.3.3 __libpthread_version_placeholder F
 GLIBC_2.3.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
index 14ada15a35..cebf7c6064 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
@@ -1,4 +1,4 @@
-GLIBC_2.17 __errno_location F
+GLIBC_2.17 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist
index 73188776b6..d8835698d8 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist
@@ -1 +1 @@
-GLIBC_2.33 __errno_location F
+GLIBC_2.33 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
index 35a6a20935..fb241212a5 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
@@ -1,4 +1,4 @@
-GLIBC_2.27 __errno_location F
+GLIBC_2.27 __libpthread_version_placeholder F
 GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
 GLIBC_2.31 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
index ac212e942a..40ce2f1fbd 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
@@ -1,4 +1,4 @@
-GLIBC_2.0 __errno_location F
+GLIBC_2.0 __libpthread_version_placeholder F
 GLIBC_2.1 __libpthread_version_placeholder F
 GLIBC_2.1.1 __libpthread_version_placeholder F
 GLIBC_2.1.2 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
index e0feab34d5..08ef7c4283 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
@@ -2,7 +2,7 @@ GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.19 __libpthread_version_placeholder F
-GLIBC_2.2 __errno_location F
+GLIBC_2.2 __libpthread_version_placeholder F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
 GLIBC_2.28 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/sh/be/libpthread.abilist b/sysdeps/unix/sysv/linux/sh/be/libpthread.abilist
index f1adf37ff2..35b6df4615 100644
--- a/sysdeps/unix/sysv/linux/sh/be/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/sh/be/libpthread.abilist
@@ -1,7 +1,7 @@
 GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2 __errno_location F
+GLIBC_2.2 __libpthread_version_placeholder F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
 GLIBC_2.28 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/sh/le/libpthread.abilist b/sysdeps/unix/sysv/linux/sh/le/libpthread.abilist
index f1adf37ff2..35b6df4615 100644
--- a/sysdeps/unix/sysv/linux/sh/le/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/sh/le/libpthread.abilist
@@ -1,7 +1,7 @@
 GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2 __errno_location F
+GLIBC_2.2 __libpthread_version_placeholder F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
 GLIBC_2.28 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/sparc/Makefile b/sysdeps/unix/sysv/linux/sparc/Makefile
index 1475039677..e0056c9413 100644
--- a/sysdeps/unix/sysv/linux/sparc/Makefile
+++ b/sysdeps/unix/sysv/linux/sparc/Makefile
@@ -14,9 +14,3 @@ endif
 ifeq ($(subdir),signal)
 sysdep_routines += sigreturn_stub
 endif
-
-ifeq ($(subdir),nptl)
-# pull in __syscall_error routine
-libpthread-routines += sysdep sigreturn_stub
-libpthread-shared-only-routines += sysdep sigreturn_stub
-endif
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
index 47cbcf3baf..051caff7c0 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
@@ -1,4 +1,4 @@
-GLIBC_2.0 __errno_location F
+GLIBC_2.0 __libpthread_version_placeholder F
 GLIBC_2.1 __libpthread_version_placeholder F
 GLIBC_2.1.1 __libpthread_version_placeholder F
 GLIBC_2.1.2 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
index f1adf37ff2..35b6df4615 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
@@ -1,7 +1,7 @@
 GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2 __errno_location F
+GLIBC_2.2 __libpthread_version_placeholder F
 GLIBC_2.2.3 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
 GLIBC_2.28 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
index ec4e3c0ecd..c94ae208cb 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
@@ -1,7 +1,7 @@
 GLIBC_2.11 __libpthread_version_placeholder F
 GLIBC_2.12 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2.5 __errno_location F
+GLIBC_2.2.5 __libpthread_version_placeholder F
 GLIBC_2.2.6 __libpthread_version_placeholder F
 GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.3.2 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
index cc6e073a11..38308e4ca7 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
@@ -1,4 +1,4 @@
-GLIBC_2.16 __errno_location F
+GLIBC_2.16 __libpthread_version_placeholder F
 GLIBC_2.18 __libpthread_version_placeholder F
 GLIBC_2.28 __libpthread_version_placeholder F
 GLIBC_2.30 __libpthread_version_placeholder F
-- 
2.31.1



^ permalink raw reply	[flat|nested] 47+ messages in thread

* [PATCH 08/10] elf: Do not load libpthread for PTHREAD_IN_LIBC
  2021-05-18 14:24 [PATCH 00/10] nptl: Complete libpthread removal Florian Weimer
                   ` (6 preceding siblings ...)
  2021-05-18 14:25 ` [PATCH 07/10] nptl: Remove remaining code from libpthread Florian Weimer
@ 2021-05-18 14:25 ` Florian Weimer
  2021-05-20 20:53   ` Adhemerval Zanella
  2021-05-18 14:25 ` [PATCH 09/10] elf: Add facility to create stub DSOs in elf/stub-dsos Florian Weimer
                   ` (3 subsequent siblings)
  11 siblings, 1 reply; 47+ messages in thread
From: Florian Weimer @ 2021-05-18 14:25 UTC (permalink / raw)
  To: libc-alpha

---
 elf/dl-load.c    | 19 +++++++++++++++++--
 elf/dl-version.c |  9 +++++++++
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/elf/dl-load.c b/elf/dl-load.c
index 918ec7546c..f97cb140f4 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -2029,12 +2029,26 @@ open_path (const char *name, size_t namelen, int mode,
 
 /* Map in the shared object file NAME.  */
 
+static inline const char *
+object_real_name (const char *name)
+{
+  /* If libpthread is integrated into libc, treat a request to load
+     libpthread as a request to load libc (because libc was a
+     dependency of libpthread).  */
+#if PTHREAD_IN_LIBC
+  if (strcmp (name, LIBPTHREAD_SO) == 0)
+    return LIBC_SO;
+#endif
+  return name;
+}
+
 struct link_map *
 _dl_map_object (struct link_map *loader, const char *name,
 		int type, int trace_mode, int mode, Lmid_t nsid)
 {
   int fd;
   const char *origname = NULL;
+  const char *implementation_name = object_real_name (name);
   char *realname;
   char *name_copy;
   struct link_map *l;
@@ -2051,7 +2065,7 @@ _dl_map_object (struct link_map *loader, const char *name,
 	 yet been opened.  */
       if (__glibc_unlikely ((l->l_faked | l->l_removed) != 0))
 	continue;
-      if (!_dl_name_match_p (name, l))
+      if (!_dl_name_match_p (implementation_name, l))
 	{
 	  const char *soname;
 
@@ -2061,7 +2075,7 @@ _dl_map_object (struct link_map *loader, const char *name,
 
 	  soname = ((const char *) D_PTR (l, l_info[DT_STRTAB])
 		    + l->l_info[DT_SONAME]->d_un.d_val);
-	  if (strcmp (name, soname) != 0)
+	  if (strcmp (implementation_name, soname) != 0)
 	    continue;
 
 	  /* We have a match on a new name -- cache it.  */
@@ -2106,6 +2120,7 @@ _dl_map_object (struct link_map *loader, const char *name,
 		  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
 		    _dl_debug_printf ("audit changed filename %s -> %s\n",
 				      before, name);
+		  implementation_name = object_real_name (name);
 
 		  if (origname == NULL)
 		    origname = before;
diff --git a/elf/dl-version.c b/elf/dl-version.c
index 914955c2a8..932cffda09 100644
--- a/elf/dl-version.c
+++ b/elf/dl-version.c
@@ -24,6 +24,7 @@
 #include <string.h>
 #include <ldsodefs.h>
 #include <_itoa.h>
+#include <gnu/lib-names.h>
 
 #include <assert.h>
 
@@ -200,6 +201,14 @@ _dl_check_map_versions (struct link_map *map, int verbose, int trace_mode)
 	  ElfW(Vernaux) *aux;
 	  struct link_map *needed = find_needed (strtab + ent->vn_file, map);
 
+#if PTHREAD_IN_LIBC
+	  /* With an integrated libpthread, check libpthread
+	     references against libc instead.  */
+	  if (needed == NULL
+	      && strcmp (strtab + ent->vn_file, LIBPTHREAD_SO) == 0)
+	    needed = find_needed (LIBC_SO, map);
+#endif
+
 	  /* If NEEDED is NULL this means a dependency was not found
 	     and no stub entry was created.  This should never happen.  */
 	  assert (needed != NULL);
-- 
2.31.1



^ permalink raw reply	[flat|nested] 47+ messages in thread

* [PATCH 09/10] elf: Add facility to create stub DSOs in elf/stub-dsos
  2021-05-18 14:24 [PATCH 00/10] nptl: Complete libpthread removal Florian Weimer
                   ` (7 preceding siblings ...)
  2021-05-18 14:25 ` [PATCH 08/10] elf: Do not load libpthread for PTHREAD_IN_LIBC Florian Weimer
@ 2021-05-18 14:25 ` Florian Weimer
  2021-05-24 18:24   ` Adhemerval Zanella
  2021-05-18 14:25 ` [PATCH 10/10] nptl: Stop building libpthread Florian Weimer
                   ` (2 subsequent siblings)
  11 siblings, 1 reply; 47+ messages in thread
From: Florian Weimer @ 2021-05-18 14:25 UTC (permalink / raw)
  To: libc-alpha

And reference the elf/stub-dsos directory when linking installed
programs.
---
 Makeconfig     | 10 ++++++++--
 elf/Makefile   | 18 +++++++++++++++++-
 elf/lib-stub.S | 22 ++++++++++++++++++++++
 3 files changed, 47 insertions(+), 3 deletions(-)
 create mode 100644 elf/lib-stub.S

diff --git a/Makeconfig b/Makeconfig
index 1d5e45926c..3ef71cc02b 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -425,7 +425,8 @@ ifndef +link-pie
 	     $(link-extra-libs)
 +link-pie-after-libc = $(+postctorS) $(+postinit)
 define +link-pie
-$(CC) $(link-libc-rpath-link) $(+link-pie-before-libc) $(rtld-LDFLAGS) \
+$(CC) $(link-libc-rpath-link)$(rpath-link-stubs) \
+  $(+link-pie-before-libc) $(rtld-LDFLAGS) \
   $(link-extra-flags) $(link-libc) $(+link-pie-after-libc)
 $(call after-link,$@)
 endef
@@ -487,7 +488,8 @@ else  # not build-pie-default
 	      $(link-extra-libs)
 +link-after-libc = $(+postctor) $(+postinit)
 define +link
-$(CC) $(link-libc-rpath-link) $(+link-before-libc) $(rtld-LDFLAGS) \
+$(CC) $(link-libc-rpath-link)$(rpath-link-stubs) \
+  $(+link-before-libc) $(rtld-LDFLAGS) \
   $(link-extra-flags) $(link-libc) $(+link-after-libc)
 $(call after-link,$@)
 endef
@@ -581,6 +583,10 @@ link-libc-printers-tests = $(link-libc-rpath) \
 rpath-dirs = math elf dlfcn nss nis rt resolv mathvec support
 rpath-link = \
 $(common-objdir):$(subst $(empty) ,:,$(patsubst ../$(subdir),.,$(rpath-dirs:%=$(common-objpfx)%)))
+
+# See $(elf-stub-dso-files) in elf/Makefile.
+rpath-link-stubs=:$(common-objdir)/elf/stub-dsos
+
 else  # build-static
 link-libc = $(common-objpfx)libc.a $(otherlibs) $(gnulib) $(common-objpfx)libc.a $(gnulib)
 link-libc-tests = $(common-objpfx)libc.a $(otherlibs) $(gnulib-tests) $(common-objpfx)libc.a $(gnulib-tests)
diff --git a/elf/Makefile b/elf/Makefile
index 834ec858a8..5f179bae19 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -505,7 +505,23 @@ ifeq (yes,$(build-shared))
 # to run programs during the `make others' pass.
 lib-noranlib: $(objpfx)$(rtld-installed-name) \
 	      $(addprefix $(objpfx),$(extra-objs))
-endif
+
+# The system may have installed DSO that no longer exist as separate
+# DSOs in the current glibc version.  The link editor will try to
+# resolve versioned GLIBC_PRIVATE symbol references in them against
+# libc.so, but these exports do not exist anymore.  Supplying these
+# stub DSOs in a directory searched by -rpath-link prevents the link
+# editor from picking up the installed system files.
+ifneq ($(strip $(elf-stub-dsos)),)
+elf-stub-dso-files :=\
+$(foreach L,$(elf-stub-dsos),$(objpfx)/stub-dsos/lib$L.so$(lib$L.so-version))
+$(elf-stub-dso-files): lib-stub.S
+	$(make-target-directory)
+	$(LINK.o) -shared -o $@ -B$(csu-objpfx) $(LDFLAGS.so) \
+	  -Wl,-soname=$(@F) -nostdlib $<
+subdir_lib: $(elf-stub-dso-files)
+endif # $(elf-stub-dsos)
+endif # $(build-shared)
 
 # Command to link into a larger single relocatable object.
 reloc-link = $(LINK.o) -nostdlib -nostartfiles -r
diff --git a/elf/lib-stub.S b/elf/lib-stub.S
new file mode 100644
index 0000000000..2b5ae2010e
--- /dev/null
+++ b/elf/lib-stub.S
@@ -0,0 +1,22 @@
+/* Assembler source file for creating stub libraries.
+   Copyright (C) 2021 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+	/* Produce an invalid init function, so that loading the stub
+	   crashes.  */
+	.section .init_array,"a",%init_array
+	.dc.a 4096
-- 
2.31.1



^ permalink raw reply	[flat|nested] 47+ messages in thread

* [PATCH 10/10] nptl: Stop building libpthread
  2021-05-18 14:24 [PATCH 00/10] nptl: Complete libpthread removal Florian Weimer
                   ` (8 preceding siblings ...)
  2021-05-18 14:25 ` [PATCH 09/10] elf: Add facility to create stub DSOs in elf/stub-dsos Florian Weimer
@ 2021-05-18 14:25 ` Florian Weimer
  2021-05-18 14:56 ` [PATCH 00/10] nptl: Complete libpthread removal Andreas Schwab
  2021-05-19 11:57 ` Szabolcs Nagy
  11 siblings, 0 replies; 47+ messages in thread
From: Florian Weimer @ 2021-05-18 14:25 UTC (permalink / raw)
  To: libc-alpha

This removes the compatibility symbols file.  For linking with installed
libraries (primarily for memusagestat), create a libpthread.so.0 stub
file.
---
 Makeconfig                                    |   3 +
 nptl/Makefile                                 |  34 ++----
 nptl/libpthread-compat.c                      | 114 ------------------
 nptl/libpthread-stub.S                        |   1 +
 sysdeps/nptl/Makeconfig                       |   7 +-
 .../sysv/linux/aarch64/libpthread.abilist     |   5 -
 .../unix/sysv/linux/alpha/libpthread.abilist  |  17 ---
 .../unix/sysv/linux/arc/libpthread.abilist    |   1 -
 .../unix/sysv/linux/arm/be/libpthread.abilist |   7 --
 .../unix/sysv/linux/arm/le/libpthread.abilist |   7 --
 .../unix/sysv/linux/csky/libpthread.abilist   |   3 -
 .../unix/sysv/linux/hppa/libpthread.abilist   |  13 --
 .../unix/sysv/linux/i386/libpthread.abilist   |  17 ---
 .../unix/sysv/linux/ia64/libpthread.abilist   |  13 --
 .../linux/m68k/coldfire/libpthread.abilist    |   7 --
 .../sysv/linux/m68k/m680x0/libpthread.abilist |  17 ---
 .../linux/microblaze/be/libpthread.abilist    |   4 -
 .../linux/microblaze/le/libpthread.abilist    |   4 -
 .../sysv/linux/mips/mips32/libpthread.abilist |  14 ---
 .../sysv/linux/mips/mips64/libpthread.abilist |  14 ---
 .../unix/sysv/linux/nios2/libpthread.abilist  |   4 -
 .../powerpc/powerpc32/libpthread.abilist      |  18 ---
 .../powerpc/powerpc64/be/libpthread.abilist   |  12 --
 .../powerpc/powerpc64/le/libpthread.abilist   |   5 -
 .../sysv/linux/riscv/rv32/libpthread.abilist  |   1 -
 .../sysv/linux/riscv/rv64/libpthread.abilist  |   4 -
 .../linux/s390/s390-32/libpthread.abilist     |  18 ---
 .../linux/s390/s390-64/libpthread.abilist     |  14 ---
 .../unix/sysv/linux/sh/be/libpthread.abilist  |  13 --
 .../unix/sysv/linux/sh/le/libpthread.abilist  |  13 --
 .../linux/sparc/sparc32/libpthread.abilist    |  17 ---
 .../linux/sparc/sparc64/libpthread.abilist    |  13 --
 .../sysv/linux/x86_64/64/libpthread.abilist   |  12 --
 .../sysv/linux/x86_64/x32/libpthread.abilist  |   5 -
 34 files changed, 16 insertions(+), 435 deletions(-)
 delete mode 100644 nptl/libpthread-compat.c
 create mode 100644 nptl/libpthread-stub.S
 delete mode 100644 sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/alpha/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/arc/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/arm/be/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/arm/le/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/csky/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/hppa/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/i386/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/ia64/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/nios2/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/sh/be/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/sh/le/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
 delete mode 100644 sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist

diff --git a/Makeconfig b/Makeconfig
index 3ef71cc02b..0021389771 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -586,6 +586,9 @@ $(common-objdir):$(subst $(empty) ,:,$(patsubst ../$(subdir),.,$(rpath-dirs:%=$(
 
 # See $(elf-stub-dso-files) in elf/Makefile.
 rpath-link-stubs=:$(common-objdir)/elf/stub-dsos
+ifeq ($(pthread-in-libc),yes)
+elf-stub-dsos += pthread
+endif
 
 else  # build-static
 link-libc = $(common-objpfx)libc.a $(otherlibs) $(gnulib) $(common-objpfx)libc.a $(gnulib)
diff --git a/nptl/Makefile b/nptl/Makefile
index 64cd0dcbf6..8ddefb1b61 100644
--- a/nptl/Makefile
+++ b/nptl/Makefile
@@ -25,8 +25,11 @@ include ../Makeconfig
 headers := pthread.h semaphore.h bits/semaphore.h \
 	   bits/struct_mutex.h bits/struct_rwlock.h
 
-extra-libs := libpthread
-extra-libs-others := $(extra-libs)
+# Install an empty libpthread.a, so that -lpthread will work, as
+# required by POSIX.
+install-lib := libpthread.a
+non-lib.a := libpthread.a
+extra-objs += libpthread.a
 
 routines = \
   alloca_cutoff \
@@ -207,9 +210,6 @@ routines = \
 shared-only-routines = forward
 static-only-routines = pthread_atfork
 
-libpthread-routines = libpthread-compat
-libpthread-shared-only-routines = libpthread-compat
-
 # Since cancellation handling is in large parts handled using exceptions
 # we have to compile some files with exception handling enabled, some
 # even with asynchronous unwind tables.
@@ -374,8 +374,6 @@ else
 tests-printers-libs := $(static-thread-library)
 endif
 
-LDFLAGS-pthread.so = -Wl,--enable-new-dtags,-z,nodelete
-
 tests += tst-cancelx7 tst-cancelx17
 
 ifeq ($(build-shared),yes)
@@ -469,6 +467,8 @@ ifeq (yes,$(build-shared))
 lib-noranlib: $(addprefix $(objpfx),$(extra-objs))
 endif
 
+$(objpfx)libpthread.a:
+	$(AR) cr $@
 
 # 'pthread_self' is a simple memory or register load.  Setting up the
 # stack frame is more work than the actual operation.  Disable the
@@ -548,35 +548,15 @@ else
 librt = $(common-objpfx)rt/librt.a
 endif
 
-# `make check' sometimes triggers a rebuild of librt.so using this Makefile,
-# which ignores librt's dependence on libpthread
-$(common-objpfx)rt/librt.so: $(shared-thread-library)
-
 $(objpfx)tst-cancel17: $(librt)
 $(objpfx)tst-cancelx17: $(librt)
 
 LDLIBS-tst-cancel24 = -Wl,--no-as-needed -lstdc++
 LDLIBS-tst-cancel24-static = $(LDLIBS-tst-cancel24)
 
-# Make sure we link with the thread library.
 ifeq ($(build-shared),yes)
-$(addprefix $(objpfx), \
-  $(filter-out $(tests-static) $(xtests-static) $(tests-reverse) \
-    $(tests-nolibpthread), \
-    $(tests) $(tests-internal) $(xtests) $(test-srcs) $(tests-container))): \
-	$(objpfx)libpthread.so
 $(objpfx)tst-unload: $(libdl)
-# $(objpfx)../libc.so is used instead of $(common-objpfx)libc.so,
-# since otherwise libpthread.so comes before libc.so when linking.
-$(addprefix $(objpfx), $(tests-reverse)): \
-  $(objpfx)../libc.so $(objpfx)libpthread.so
-$(objpfx)../libc.so: $(common-objpfx)libc.so ;
-$(addprefix $(objpfx),$(tests-static) $(xtests-static)): $(objpfx)libpthread.a
-else
-$(addprefix $(objpfx),$(tests) $(test-srcs)): $(objpfx)libpthread.a
-endif
 
-ifeq ($(build-shared),yes)
 generated += multidir.mk tst-tls6.out
 endif
 
diff --git a/nptl/libpthread-compat.c b/nptl/libpthread-compat.c
deleted file mode 100644
index fb336d0685..0000000000
--- a/nptl/libpthread-compat.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/* Placeholder definitions to pull in removed symbol versions.
-   Copyright (C) 2019-2021 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include <sys/cdefs.h>
-#include <shlib-compat.h>
-
-#ifdef SHARED
-void
-attribute_compat_text_section
-__attribute_used__
-__libpthread_version_placeholder_1 (void)
-{
-}
-#endif
-
-#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_34)
-compat_symbol (libpthread, __libpthread_version_placeholder_1,
-	       __libpthread_version_placeholder, GLIBC_2_0);
-#endif
-
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_1, GLIBC_2_2))
-compat_symbol (libpthread, __libpthread_version_placeholder_1,
-	       __libpthread_version_placeholder, GLIBC_2_1);
-#endif
-
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_1_1, GLIBC_2_1_2))
-compat_symbol (libpthread, __libpthread_version_placeholder_1,
-	       __libpthread_version_placeholder, GLIBC_2_1_1);
-#endif
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_2))
-compat_symbol (libpthread, __libpthread_version_placeholder_1,
-	       __libpthread_version_placeholder, GLIBC_2_1_2);
-#endif
-
-#if SHLIB_COMPAT (libpthread, GLIBC_2_2, GLIBC_2_3) \
-  && ABI_libpthread_GLIBC_2_2 != ABI_libpthread_GLIBC_2_0
-compat_symbol (libpthread, __libpthread_version_placeholder_1,
-	       __libpthread_version_placeholder, GLIBC_2_2);
-#endif
-
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_2_3, GLIBC_2_2_4))
-compat_symbol (libpthread, __libpthread_version_placeholder_1,
-	       __libpthread_version_placeholder, GLIBC_2_2_3);
-#endif
-
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_2_6, GLIBC_2_3))
-compat_symbol (libpthread, __libpthread_version_placeholder_1,
-	       __libpthread_version_placeholder, GLIBC_2_2_6);
-#endif
-
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_3_2, GLIBC_2_3_4))
-compat_symbol (libpthread, __libpthread_version_placeholder_1,
-	       __libpthread_version_placeholder, GLIBC_2_3_2);
-#endif
-
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_3_3, GLIBC_2_3_4))
-compat_symbol (libpthread, __libpthread_version_placeholder_1,
-	       __libpthread_version_placeholder, GLIBC_2_3_3);
-#endif
-
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_3_4, GLIBC_2_4))
-compat_symbol (libpthread, __libpthread_version_placeholder_1,
-	       __libpthread_version_placeholder, GLIBC_2_3_4);
-#endif
-
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_4, GLIBC_2_5))
-compat_symbol (libpthread, __libpthread_version_placeholder_1,
-	       __libpthread_version_placeholder, GLIBC_2_4);
-#endif
-
-#if SHLIB_COMPAT (libpthread, GLIBC_2_11, GLIBC_2_12)
-compat_symbol (libpthread, __libpthread_version_placeholder_1,
-	       __libpthread_version_placeholder, GLIBC_2_11);
-#endif
-
-#if SHLIB_COMPAT (libpthread, GLIBC_2_12, GLIBC_2_13)
-compat_symbol (libpthread, __libpthread_version_placeholder_1,
-	       __libpthread_version_placeholder, GLIBC_2_12);
-#endif
-
-#if SHLIB_COMPAT (libpthread, GLIBC_2_18, GLIBC_2_19)
-compat_symbol (libpthread, __libpthread_version_placeholder_1,
-	       __libpthread_version_placeholder, GLIBC_2_18);
-#endif
-
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_28, GLIBC_2_29))
-compat_symbol (libpthread, __libpthread_version_placeholder_1,
-	       __libpthread_version_placeholder, GLIBC_2_28);
-#endif
-
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_30, GLIBC_2_31))
-compat_symbol (libpthread, __libpthread_version_placeholder_1,
-	       __libpthread_version_placeholder, GLIBC_2_30);
-#endif
-
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_31, GLIBC_2_32))
-compat_symbol (libpthread, __libpthread_version_placeholder_1,
-	       __libpthread_version_placeholder, GLIBC_2_31);
-#endif
diff --git a/nptl/libpthread-stub.S b/nptl/libpthread-stub.S
new file mode 100644
index 0000000000..1fec0b30d6
--- /dev/null
+++ b/nptl/libpthread-stub.S
@@ -0,0 +1 @@
+# Empty file to generate stub libpthread.so.0.
diff --git a/sysdeps/nptl/Makeconfig b/sysdeps/nptl/Makeconfig
index 8757ec868b..bae3e75af3 100644
--- a/sysdeps/nptl/Makeconfig
+++ b/sysdeps/nptl/Makeconfig
@@ -21,7 +21,10 @@
 
 have-thread-library = yes
 
-shared-thread-library = $(common-objpfx)nptl/libpthread.so
-static-thread-library = $(common-objpfx)nptl/libpthread.a
+# The thread library is integrated.
+shared-thread-library =
+static-thread-library =
 
+# There is no libpthread.so file anymore, but some tests need this to
+# load their own test objects.
 rpath-dirs += nptl
diff --git a/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist b/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
deleted file mode 100644
index cebf7c6064..0000000000
--- a/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
+++ /dev/null
@@ -1,5 +0,0 @@
-GLIBC_2.17 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/alpha/libpthread.abilist b/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
deleted file mode 100644
index 051caff7c0..0000000000
--- a/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
+++ /dev/null
@@ -1,17 +0,0 @@
-GLIBC_2.0 __libpthread_version_placeholder F
-GLIBC_2.1 __libpthread_version_placeholder F
-GLIBC_2.1.1 __libpthread_version_placeholder F
-GLIBC_2.1.2 __libpthread_version_placeholder F
-GLIBC_2.11 __libpthread_version_placeholder F
-GLIBC_2.12 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2 __libpthread_version_placeholder F
-GLIBC_2.2.3 __libpthread_version_placeholder F
-GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.3.2 __libpthread_version_placeholder F
-GLIBC_2.3.3 __libpthread_version_placeholder F
-GLIBC_2.3.4 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/arc/libpthread.abilist b/sysdeps/unix/sysv/linux/arc/libpthread.abilist
deleted file mode 100644
index cd90b49787..0000000000
--- a/sysdeps/unix/sysv/linux/arc/libpthread.abilist
+++ /dev/null
@@ -1 +0,0 @@
-GLIBC_2.32 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/arm/be/libpthread.abilist b/sysdeps/unix/sysv/linux/arm/be/libpthread.abilist
deleted file mode 100644
index 1774f414c6..0000000000
--- a/sysdeps/unix/sysv/linux/arm/be/libpthread.abilist
+++ /dev/null
@@ -1,7 +0,0 @@
-GLIBC_2.11 __libpthread_version_placeholder F
-GLIBC_2.12 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/arm/le/libpthread.abilist b/sysdeps/unix/sysv/linux/arm/le/libpthread.abilist
deleted file mode 100644
index 1774f414c6..0000000000
--- a/sysdeps/unix/sysv/linux/arm/le/libpthread.abilist
+++ /dev/null
@@ -1,7 +0,0 @@
-GLIBC_2.11 __libpthread_version_placeholder F
-GLIBC_2.12 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/csky/libpthread.abilist b/sysdeps/unix/sysv/linux/csky/libpthread.abilist
deleted file mode 100644
index 8ce9efcbf8..0000000000
--- a/sysdeps/unix/sysv/linux/csky/libpthread.abilist
+++ /dev/null
@@ -1,3 +0,0 @@
-GLIBC_2.29 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/hppa/libpthread.abilist b/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
deleted file mode 100644
index 35b6df4615..0000000000
--- a/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
+++ /dev/null
@@ -1,13 +0,0 @@
-GLIBC_2.11 __libpthread_version_placeholder F
-GLIBC_2.12 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2 __libpthread_version_placeholder F
-GLIBC_2.2.3 __libpthread_version_placeholder F
-GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.3.2 __libpthread_version_placeholder F
-GLIBC_2.3.3 __libpthread_version_placeholder F
-GLIBC_2.3.4 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/i386/libpthread.abilist b/sysdeps/unix/sysv/linux/i386/libpthread.abilist
deleted file mode 100644
index 051caff7c0..0000000000
--- a/sysdeps/unix/sysv/linux/i386/libpthread.abilist
+++ /dev/null
@@ -1,17 +0,0 @@
-GLIBC_2.0 __libpthread_version_placeholder F
-GLIBC_2.1 __libpthread_version_placeholder F
-GLIBC_2.1.1 __libpthread_version_placeholder F
-GLIBC_2.1.2 __libpthread_version_placeholder F
-GLIBC_2.11 __libpthread_version_placeholder F
-GLIBC_2.12 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2 __libpthread_version_placeholder F
-GLIBC_2.2.3 __libpthread_version_placeholder F
-GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.3.2 __libpthread_version_placeholder F
-GLIBC_2.3.3 __libpthread_version_placeholder F
-GLIBC_2.3.4 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/ia64/libpthread.abilist b/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
deleted file mode 100644
index 35b6df4615..0000000000
--- a/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
+++ /dev/null
@@ -1,13 +0,0 @@
-GLIBC_2.11 __libpthread_version_placeholder F
-GLIBC_2.12 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2 __libpthread_version_placeholder F
-GLIBC_2.2.3 __libpthread_version_placeholder F
-GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.3.2 __libpthread_version_placeholder F
-GLIBC_2.3.3 __libpthread_version_placeholder F
-GLIBC_2.3.4 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
deleted file mode 100644
index 1774f414c6..0000000000
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
+++ /dev/null
@@ -1,7 +0,0 @@
-GLIBC_2.11 __libpthread_version_placeholder F
-GLIBC_2.12 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
deleted file mode 100644
index 051caff7c0..0000000000
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
+++ /dev/null
@@ -1,17 +0,0 @@
-GLIBC_2.0 __libpthread_version_placeholder F
-GLIBC_2.1 __libpthread_version_placeholder F
-GLIBC_2.1.1 __libpthread_version_placeholder F
-GLIBC_2.1.2 __libpthread_version_placeholder F
-GLIBC_2.11 __libpthread_version_placeholder F
-GLIBC_2.12 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2 __libpthread_version_placeholder F
-GLIBC_2.2.3 __libpthread_version_placeholder F
-GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.3.2 __libpthread_version_placeholder F
-GLIBC_2.3.3 __libpthread_version_placeholder F
-GLIBC_2.3.4 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist
deleted file mode 100644
index 419561d3ce..0000000000
--- a/sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist
+++ /dev/null
@@ -1,4 +0,0 @@
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist
deleted file mode 100644
index 419561d3ce..0000000000
--- a/sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist
+++ /dev/null
@@ -1,4 +0,0 @@
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
deleted file mode 100644
index eac5591410..0000000000
--- a/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
+++ /dev/null
@@ -1,14 +0,0 @@
-GLIBC_2.0 __libpthread_version_placeholder F
-GLIBC_2.11 __libpthread_version_placeholder F
-GLIBC_2.12 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2 __libpthread_version_placeholder F
-GLIBC_2.2.3 __libpthread_version_placeholder F
-GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.3.2 __libpthread_version_placeholder F
-GLIBC_2.3.3 __libpthread_version_placeholder F
-GLIBC_2.3.4 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
deleted file mode 100644
index eac5591410..0000000000
--- a/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
+++ /dev/null
@@ -1,14 +0,0 @@
-GLIBC_2.0 __libpthread_version_placeholder F
-GLIBC_2.11 __libpthread_version_placeholder F
-GLIBC_2.12 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2 __libpthread_version_placeholder F
-GLIBC_2.2.3 __libpthread_version_placeholder F
-GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.3.2 __libpthread_version_placeholder F
-GLIBC_2.3.3 __libpthread_version_placeholder F
-GLIBC_2.3.4 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/nios2/libpthread.abilist b/sysdeps/unix/sysv/linux/nios2/libpthread.abilist
deleted file mode 100644
index 714dfd90aa..0000000000
--- a/sysdeps/unix/sysv/linux/nios2/libpthread.abilist
+++ /dev/null
@@ -1,4 +0,0 @@
-GLIBC_2.21 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
deleted file mode 100644
index 5623c6a313..0000000000
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
+++ /dev/null
@@ -1,18 +0,0 @@
-GLIBC_2.0 __libpthread_version_placeholder F
-GLIBC_2.1 __libpthread_version_placeholder F
-GLIBC_2.1.1 __libpthread_version_placeholder F
-GLIBC_2.1.2 __libpthread_version_placeholder F
-GLIBC_2.11 __libpthread_version_placeholder F
-GLIBC_2.12 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2 __libpthread_version_placeholder F
-GLIBC_2.2.3 __libpthread_version_placeholder F
-GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.3.2 __libpthread_version_placeholder F
-GLIBC_2.3.3 __libpthread_version_placeholder F
-GLIBC_2.3.4 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __libpthread_version_placeholder F
-GLIBC_2.6 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
deleted file mode 100644
index 3246752fdd..0000000000
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
+++ /dev/null
@@ -1,12 +0,0 @@
-GLIBC_2.11 __libpthread_version_placeholder F
-GLIBC_2.12 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.3 __libpthread_version_placeholder F
-GLIBC_2.3.2 __libpthread_version_placeholder F
-GLIBC_2.3.3 __libpthread_version_placeholder F
-GLIBC_2.3.4 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __libpthread_version_placeholder F
-GLIBC_2.6 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
deleted file mode 100644
index cebf7c6064..0000000000
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
+++ /dev/null
@@ -1,5 +0,0 @@
-GLIBC_2.17 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist
deleted file mode 100644
index d8835698d8..0000000000
--- a/sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist
+++ /dev/null
@@ -1 +0,0 @@
-GLIBC_2.33 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
deleted file mode 100644
index fb241212a5..0000000000
--- a/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
+++ /dev/null
@@ -1,4 +0,0 @@
-GLIBC_2.27 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
deleted file mode 100644
index 40ce2f1fbd..0000000000
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
+++ /dev/null
@@ -1,18 +0,0 @@
-GLIBC_2.0 __libpthread_version_placeholder F
-GLIBC_2.1 __libpthread_version_placeholder F
-GLIBC_2.1.1 __libpthread_version_placeholder F
-GLIBC_2.1.2 __libpthread_version_placeholder F
-GLIBC_2.11 __libpthread_version_placeholder F
-GLIBC_2.12 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.19 __libpthread_version_placeholder F
-GLIBC_2.2 __libpthread_version_placeholder F
-GLIBC_2.2.3 __libpthread_version_placeholder F
-GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.3.2 __libpthread_version_placeholder F
-GLIBC_2.3.3 __libpthread_version_placeholder F
-GLIBC_2.3.4 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
deleted file mode 100644
index 08ef7c4283..0000000000
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
+++ /dev/null
@@ -1,14 +0,0 @@
-GLIBC_2.11 __libpthread_version_placeholder F
-GLIBC_2.12 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.19 __libpthread_version_placeholder F
-GLIBC_2.2 __libpthread_version_placeholder F
-GLIBC_2.2.3 __libpthread_version_placeholder F
-GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.3.2 __libpthread_version_placeholder F
-GLIBC_2.3.3 __libpthread_version_placeholder F
-GLIBC_2.3.4 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/sh/be/libpthread.abilist b/sysdeps/unix/sysv/linux/sh/be/libpthread.abilist
deleted file mode 100644
index 35b6df4615..0000000000
--- a/sysdeps/unix/sysv/linux/sh/be/libpthread.abilist
+++ /dev/null
@@ -1,13 +0,0 @@
-GLIBC_2.11 __libpthread_version_placeholder F
-GLIBC_2.12 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2 __libpthread_version_placeholder F
-GLIBC_2.2.3 __libpthread_version_placeholder F
-GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.3.2 __libpthread_version_placeholder F
-GLIBC_2.3.3 __libpthread_version_placeholder F
-GLIBC_2.3.4 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/sh/le/libpthread.abilist b/sysdeps/unix/sysv/linux/sh/le/libpthread.abilist
deleted file mode 100644
index 35b6df4615..0000000000
--- a/sysdeps/unix/sysv/linux/sh/le/libpthread.abilist
+++ /dev/null
@@ -1,13 +0,0 @@
-GLIBC_2.11 __libpthread_version_placeholder F
-GLIBC_2.12 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2 __libpthread_version_placeholder F
-GLIBC_2.2.3 __libpthread_version_placeholder F
-GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.3.2 __libpthread_version_placeholder F
-GLIBC_2.3.3 __libpthread_version_placeholder F
-GLIBC_2.3.4 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
deleted file mode 100644
index 051caff7c0..0000000000
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
+++ /dev/null
@@ -1,17 +0,0 @@
-GLIBC_2.0 __libpthread_version_placeholder F
-GLIBC_2.1 __libpthread_version_placeholder F
-GLIBC_2.1.1 __libpthread_version_placeholder F
-GLIBC_2.1.2 __libpthread_version_placeholder F
-GLIBC_2.11 __libpthread_version_placeholder F
-GLIBC_2.12 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2 __libpthread_version_placeholder F
-GLIBC_2.2.3 __libpthread_version_placeholder F
-GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.3.2 __libpthread_version_placeholder F
-GLIBC_2.3.3 __libpthread_version_placeholder F
-GLIBC_2.3.4 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
deleted file mode 100644
index 35b6df4615..0000000000
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
+++ /dev/null
@@ -1,13 +0,0 @@
-GLIBC_2.11 __libpthread_version_placeholder F
-GLIBC_2.12 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2 __libpthread_version_placeholder F
-GLIBC_2.2.3 __libpthread_version_placeholder F
-GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.3.2 __libpthread_version_placeholder F
-GLIBC_2.3.3 __libpthread_version_placeholder F
-GLIBC_2.3.4 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
deleted file mode 100644
index c94ae208cb..0000000000
--- a/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
+++ /dev/null
@@ -1,12 +0,0 @@
-GLIBC_2.11 __libpthread_version_placeholder F
-GLIBC_2.12 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.2.5 __libpthread_version_placeholder F
-GLIBC_2.2.6 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.3.2 __libpthread_version_placeholder F
-GLIBC_2.3.3 __libpthread_version_placeholder F
-GLIBC_2.3.4 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-GLIBC_2.4 __libpthread_version_placeholder F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
deleted file mode 100644
index 38308e4ca7..0000000000
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
+++ /dev/null
@@ -1,5 +0,0 @@
-GLIBC_2.16 __libpthread_version_placeholder F
-GLIBC_2.18 __libpthread_version_placeholder F
-GLIBC_2.28 __libpthread_version_placeholder F
-GLIBC_2.30 __libpthread_version_placeholder F
-GLIBC_2.31 __libpthread_version_placeholder F
-- 
2.31.1


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 06/10] nptl: Remove unused __libc_pthread_init function
  2021-05-18 14:25 ` [PATCH 06/10] nptl: Remove unused __libc_pthread_init function Florian Weimer
@ 2021-05-18 14:49   ` Andreas Schwab
  0 siblings, 0 replies; 47+ messages in thread
From: Andreas Schwab @ 2021-05-18 14:49 UTC (permalink / raw)
  To: Florian Weimer via Libc-alpha; +Cc: Florian Weimer

On Mai 18 2021, Florian Weimer via Libc-alpha wrote:

> Fixes commit 732139dabeda7ecce0d56200bc176251e759ccde
> ("Linux: Move __reclaim_stacks into the fork implementation in
> libc").

Ok.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-18 14:24 [PATCH 00/10] nptl: Complete libpthread removal Florian Weimer
                   ` (9 preceding siblings ...)
  2021-05-18 14:25 ` [PATCH 10/10] nptl: Stop building libpthread Florian Weimer
@ 2021-05-18 14:56 ` Andreas Schwab
  2021-05-18 15:04   ` Florian Weimer
  2021-05-19 11:57 ` Szabolcs Nagy
  11 siblings, 1 reply; 47+ messages in thread
From: Andreas Schwab @ 2021-05-18 14:56 UTC (permalink / raw)
  To: Florian Weimer via Libc-alpha; +Cc: Florian Weimer

On Mai 18 2021, Florian Weimer via Libc-alpha wrote:

> We need to provide libpthread.so.0 stub object for use with
> memusagestat, otherwise a system libpthread.so.0 might leak into the
> link.  Not loading libpthread.so.0 is hacked directly into the dynamic
> loader.

What would happen if the lpthread stub would be loaded?

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-18 14:56 ` [PATCH 00/10] nptl: Complete libpthread removal Andreas Schwab
@ 2021-05-18 15:04   ` Florian Weimer
  2021-05-18 15:26     ` Andreas Schwab
  0 siblings, 1 reply; 47+ messages in thread
From: Florian Weimer @ 2021-05-18 15:04 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: Florian Weimer via Libc-alpha

* Andreas Schwab:

> On Mai 18 2021, Florian Weimer via Libc-alpha wrote:
>
>> We need to provide libpthread.so.0 stub object for use with
>> memusagestat, otherwise a system libpthread.so.0 might leak into the
>> link.  Not loading libpthread.so.0 is hacked directly into the dynamic
>> loader.
>
> What would happen if the lpthread stub would be loaded?

I made sure that it crashes:

	/* Produce an invalid init function, so that loading the stub
	   crashes.  */
	.section .init_array,"a",%init_array
	.dc.a 4096

I tried adding an undefined symbol, but that make the stub unusable as a
stub, too.

Neither binutils nor glibc currently support DF_1_STUB, so that's not an
option.

Thanks,
Florian


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-18 15:04   ` Florian Weimer
@ 2021-05-18 15:26     ` Andreas Schwab
  2021-05-18 15:51       ` Florian Weimer
  0 siblings, 1 reply; 47+ messages in thread
From: Andreas Schwab @ 2021-05-18 15:26 UTC (permalink / raw)
  To: Florian Weimer; +Cc: Florian Weimer via Libc-alpha

On Mai 18 2021, Florian Weimer wrote:

> * Andreas Schwab:
>
>> On Mai 18 2021, Florian Weimer via Libc-alpha wrote:
>>
>>> We need to provide libpthread.so.0 stub object for use with
>>> memusagestat, otherwise a system libpthread.so.0 might leak into the
>>> link.  Not loading libpthread.so.0 is hacked directly into the dynamic
>>> loader.
>>
>> What would happen if the lpthread stub would be loaded?
>
> I made sure that it crashes:

What's wrong with providing an empty libpthread.so.0, and a no-op
libpthread.{so,a}?

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-18 15:26     ` Andreas Schwab
@ 2021-05-18 15:51       ` Florian Weimer
  2021-05-18 16:27         ` Andreas Schwab
  0 siblings, 1 reply; 47+ messages in thread
From: Florian Weimer @ 2021-05-18 15:51 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: Florian Weimer via Libc-alpha

* Andreas Schwab:

> On Mai 18 2021, Florian Weimer wrote:
>
>> * Andreas Schwab:
>>
>>> On Mai 18 2021, Florian Weimer via Libc-alpha wrote:
>>>
>>>> We need to provide libpthread.so.0 stub object for use with
>>>> memusagestat, otherwise a system libpthread.so.0 might leak into the
>>>> link.  Not loading libpthread.so.0 is hacked directly into the dynamic
>>>> loader.
>>>
>>> What would happen if the lpthread stub would be loaded?
>>
>> I made sure that it crashes:
>
> What's wrong with providing an empty libpthread.so.0, and a no-op
> libpthread.{so,a}?

I'm already adding a no-op libpthread.a, so that -lpthread keeps
working.  As far as I can tell, a libpthread.so.0 is not needed because
it's not an error for ld if it is missing despite a DT_NEEDED reference.
(The stub is not installed, it's only needed because non-cross builds
pick up libpng et al. from the system environment.)

Thanks,
Florian


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-18 15:51       ` Florian Weimer
@ 2021-05-18 16:27         ` Andreas Schwab
  2021-05-18 16:31           ` Florian Weimer
  0 siblings, 1 reply; 47+ messages in thread
From: Andreas Schwab @ 2021-05-18 16:27 UTC (permalink / raw)
  To: Florian Weimer; +Cc: Florian Weimer via Libc-alpha

On Mai 18 2021, Florian Weimer wrote:

> I'm already adding a no-op libpthread.a, so that -lpthread keeps
> working.  As far as I can tell, a libpthread.so.0 is not needed because
> it's not an error for ld if it is missing despite a DT_NEEDED reference.

Though you will get an annoying warning.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-18 16:27         ` Andreas Schwab
@ 2021-05-18 16:31           ` Florian Weimer
  2021-05-18 16:47             ` Andreas Schwab
  0 siblings, 1 reply; 47+ messages in thread
From: Florian Weimer @ 2021-05-18 16:31 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: Florian Weimer via Libc-alpha

* Andreas Schwab:

> On Mai 18 2021, Florian Weimer wrote:
>
>> I'm already adding a no-op libpthread.a, so that -lpthread keeps
>> working.  As far as I can tell, a libpthread.so.0 is not needed because
>> it's not an error for ld if it is missing despite a DT_NEEDED reference.
>
> Though you will get an annoying warning.

I don't think we can do anything about that.  The libpthread.so linker
script won't suppress it because it's not loaded implicitly, and as soon
we load libpthread.so.0 explicitly during the link, we also end up with
a DT_NEEDED reference, which I don't think we want.

Thanks,
Florian


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-18 16:31           ` Florian Weimer
@ 2021-05-18 16:47             ` Andreas Schwab
  2021-05-20 13:27               ` Florian Weimer
  0 siblings, 1 reply; 47+ messages in thread
From: Andreas Schwab @ 2021-05-18 16:47 UTC (permalink / raw)
  To: Florian Weimer; +Cc: Florian Weimer via Libc-alpha

On Mai 18 2021, Florian Weimer wrote:

> I don't think we can do anything about that.  The libpthread.so linker
> script won't suppress it because it's not loaded implicitly, and as soon
> we load libpthread.so.0 explicitly during the link, we also end up with
> a DT_NEEDED reference, which I don't think we want.

I don't think that would be such a bad thing.  It will vanish over time
when libraries are relinked.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-18 14:24 [PATCH 00/10] nptl: Complete libpthread removal Florian Weimer
                   ` (10 preceding siblings ...)
  2021-05-18 14:56 ` [PATCH 00/10] nptl: Complete libpthread removal Andreas Schwab
@ 2021-05-19 11:57 ` Szabolcs Nagy
  2021-05-19 12:35   ` Florian Weimer
  11 siblings, 1 reply; 47+ messages in thread
From: Szabolcs Nagy @ 2021-05-19 11:57 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha

The 05/18/2021 16:24, Florian Weimer via Libc-alpha wrote:
> This series finally removes libpthread for Linux/NPTL.

sorry i don't know when this started but in libc.a
now i see

cnd_wait.o:
0000000000000000 T __cnd_wait
0000000000000000 W cnd_wait
                 U __pthread_cond_wait

and __pthread_cond_wait is not defined anywhere.
(only a 3 _ prefix version)

(in cnd_wait.os i see
                 U __GI___pthread_cond_wait
which is a hidden symbol in libc.so now)

so now static linking code with cnd_wait fails.

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-19 11:57 ` Szabolcs Nagy
@ 2021-05-19 12:35   ` Florian Weimer
  2021-05-19 13:14     ` Szabolcs Nagy
  0 siblings, 1 reply; 47+ messages in thread
From: Florian Weimer @ 2021-05-19 12:35 UTC (permalink / raw)
  To: Szabolcs Nagy; +Cc: libc-alpha

* Szabolcs Nagy:

> The 05/18/2021 16:24, Florian Weimer via Libc-alpha wrote:
>> This series finally removes libpthread for Linux/NPTL.
>
> sorry i don't know when this started but in libc.a
> now i see
>
> cnd_wait.o:
> 0000000000000000 T __cnd_wait
> 0000000000000000 W cnd_wait
>                  U __pthread_cond_wait
>
> and __pthread_cond_wait is not defined anywhere.
> (only a 3 _ prefix version)
>
> (in cnd_wait.os i see
>                  U __GI___pthread_cond_wait
> which is a hidden symbol in libc.so now)
>
> so now static linking code with cnd_wait fails.

Ugh, I thought the linknamespace tests would cover that.

This is a generic issue related to how libc_hidden_ver is defined: It
does not create an alias as one might expect for the static libc, but
actually expands to nothing.  I hacked around this with an explicit
strong_alias in some places, but it looks like I missed a few cases.

Should we try to change the definition of libc_hidden_ver, or add more
strong_alias directives?

Thanks,
Florian


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-19 12:35   ` Florian Weimer
@ 2021-05-19 13:14     ` Szabolcs Nagy
  0 siblings, 0 replies; 47+ messages in thread
From: Szabolcs Nagy @ 2021-05-19 13:14 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha

The 05/19/2021 14:35, Florian Weimer wrote:
> * Szabolcs Nagy:
> > The 05/18/2021 16:24, Florian Weimer via Libc-alpha wrote:
> >> This series finally removes libpthread for Linux/NPTL.
> >
> > sorry i don't know when this started but in libc.a
> > now i see
> >
> > cnd_wait.o:
> > 0000000000000000 T __cnd_wait
> > 0000000000000000 W cnd_wait
> >                  U __pthread_cond_wait
> >
> > and __pthread_cond_wait is not defined anywhere.
> > (only a 3 _ prefix version)
> >
> > (in cnd_wait.os i see
> >                  U __GI___pthread_cond_wait
> > which is a hidden symbol in libc.so now)
> >
> > so now static linking code with cnd_wait fails.
> 
> Ugh, I thought the linknamespace tests would cover that.
> 
> This is a generic issue related to how libc_hidden_ver is defined: It
> does not create an alias as one might expect for the static libc, but
> actually expands to nothing.  I hacked around this with an explicit
> strong_alias in some places, but it looks like I missed a few cases.
> 
> Should we try to change the definition of libc_hidden_ver, or add more
> strong_alias directives?

there are quite a few libc_hidden_ver uses and i assume
now exists many

  some_alias (foo, bar)
  libc_hidden_ver (foo, bar)

even in target specific code, which has to be changed
and tested if libc_hidden_ver is changed.

but if we always want libc_hidden_ver to create an alias
for static linking then it would be nice to fix at some
point.

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-18 16:47             ` Andreas Schwab
@ 2021-05-20 13:27               ` Florian Weimer
  2021-05-20 13:50                 ` Andreas Schwab
  0 siblings, 1 reply; 47+ messages in thread
From: Florian Weimer @ 2021-05-20 13:27 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: Florian Weimer via Libc-alpha

* Andreas Schwab:

> On Mai 18 2021, Florian Weimer wrote:
>
>> I don't think we can do anything about that.  The libpthread.so linker
>> script won't suppress it because it's not loaded implicitly, and as soon
>> we load libpthread.so.0 explicitly during the link, we also end up with
>> a DT_NEEDED reference, which I don't think we want.
>
> I don't think that would be such a bad thing.  It will vanish over time
> when libraries are relinked.

Coming back to this, should we stop loading libpthread at all?  That is,
keep libpthread.so.0 around indefinitely (with the placeholder symbols
and symbol versions), and just wait until more and more binaries are
linked with the empty libpthread.a and no longer have a DT_NEEDED
dependency on libpthread.so.0?

Thanks,
Florian


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-20 13:27               ` Florian Weimer
@ 2021-05-20 13:50                 ` Andreas Schwab
  2021-05-20 13:54                   ` Florian Weimer
  0 siblings, 1 reply; 47+ messages in thread
From: Andreas Schwab @ 2021-05-20 13:50 UTC (permalink / raw)
  To: Florian Weimer; +Cc: Florian Weimer via Libc-alpha

On Mai 20 2021, Florian Weimer wrote:

> That is, keep libpthread.so.0 around indefinitely (with the
> placeholder symbols and symbol versions), and just wait until more and
> more binaries are linked with the empty libpthread.a and no longer
> have a DT_NEEDED dependency on libpthread.so.0?

I don't see any downsides with this approach.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-20 13:50                 ` Andreas Schwab
@ 2021-05-20 13:54                   ` Florian Weimer
  2021-05-20 14:01                     ` Andreas Schwab
  2021-05-20 15:09                     ` H.J. Lu
  0 siblings, 2 replies; 47+ messages in thread
From: Florian Weimer @ 2021-05-20 13:54 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: Florian Weimer via Libc-alpha

* Andreas Schwab:

> On Mai 20 2021, Florian Weimer wrote:
>
>> That is, keep libpthread.so.0 around indefinitely (with the
>> placeholder symbols and symbol versions), and just wait until more and
>> more binaries are linked with the empty libpthread.a and no longer
>> have a DT_NEEDED dependency on libpthread.so.0?
>
> I don't see any downsides with this approach.

There's a slight additional run-time overhead due to the loaded object.
But I don't feel strongly about this.

Do you think it's okay if we ship libpthread.a only, or should we
install a no-op libpthread.so as well?  -lpthread will use the .a file
for static and dynamic links, so I think that's sufficient.

Thanks,
Florian


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-20 13:54                   ` Florian Weimer
@ 2021-05-20 14:01                     ` Andreas Schwab
  2021-05-20 15:09                     ` H.J. Lu
  1 sibling, 0 replies; 47+ messages in thread
From: Andreas Schwab @ 2021-05-20 14:01 UTC (permalink / raw)
  To: Florian Weimer; +Cc: Florian Weimer via Libc-alpha

On Mai 20 2021, Florian Weimer wrote:

> Do you think it's okay if we ship libpthread.a only, or should we
> install a no-op libpthread.so as well?

I don't see any need for libpthread.so.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-20 13:54                   ` Florian Weimer
  2021-05-20 14:01                     ` Andreas Schwab
@ 2021-05-20 15:09                     ` H.J. Lu
  2021-05-20 15:13                       ` Florian Weimer
  2021-05-20 15:17                       ` Andreas Schwab
  1 sibling, 2 replies; 47+ messages in thread
From: H.J. Lu @ 2021-05-20 15:09 UTC (permalink / raw)
  To: Florian Weimer; +Cc: Andreas Schwab, Florian Weimer via Libc-alpha

On Thu, May 20, 2021 at 8:06 AM Florian Weimer via Libc-alpha
<libc-alpha@sourceware.org> wrote:
>
> * Andreas Schwab:
>
> > On Mai 20 2021, Florian Weimer wrote:
> >
> >> That is, keep libpthread.so.0 around indefinitely (with the
> >> placeholder symbols and symbol versions), and just wait until more and
> >> more binaries are linked with the empty libpthread.a and no longer
> >> have a DT_NEEDED dependency on libpthread.so.0?
> >
> > I don't see any downsides with this approach.
>
> There's a slight additional run-time overhead due to the loaded object.
> But I don't feel strongly about this.
>
> Do you think it's okay if we ship libpthread.a only, or should we
> install a no-op libpthread.so as well?  -lpthread will use the .a file
> for static and dynamic links, so I think that's sufficient.

Can we ship a dummy linker script for libpthread.so to just
satisfy -lpthread at link-time?

-- 
H.J.

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-20 15:09                     ` H.J. Lu
@ 2021-05-20 15:13                       ` Florian Weimer
  2021-05-20 15:17                       ` Andreas Schwab
  1 sibling, 0 replies; 47+ messages in thread
From: Florian Weimer @ 2021-05-20 15:13 UTC (permalink / raw)
  To: H.J. Lu; +Cc: Andreas Schwab, Florian Weimer via Libc-alpha

* H. J. Lu:

> On Thu, May 20, 2021 at 8:06 AM Florian Weimer via Libc-alpha
> <libc-alpha@sourceware.org> wrote:
>>
>> * Andreas Schwab:
>>
>> > On Mai 20 2021, Florian Weimer wrote:
>> >
>> >> That is, keep libpthread.so.0 around indefinitely (with the
>> >> placeholder symbols and symbol versions), and just wait until more and
>> >> more binaries are linked with the empty libpthread.a and no longer
>> >> have a DT_NEEDED dependency on libpthread.so.0?
>> >
>> > I don't see any downsides with this approach.
>>
>> There's a slight additional run-time overhead due to the loaded object.
>> But I don't feel strongly about this.
>>
>> Do you think it's okay if we ship libpthread.a only, or should we
>> install a no-op libpthread.so as well?  -lpthread will use the .a file
>> for static and dynamic links, so I think that's sufficient.
>
> Can we ship a dummy linker script for libpthread.so to just
> satisfy -lpthread at link-time?

An empty libpthread.a already does that.

Thanks,
Florian


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-20 15:09                     ` H.J. Lu
  2021-05-20 15:13                       ` Florian Weimer
@ 2021-05-20 15:17                       ` Andreas Schwab
  2021-05-20 15:35                         ` H.J. Lu
  1 sibling, 1 reply; 47+ messages in thread
From: Andreas Schwab @ 2021-05-20 15:17 UTC (permalink / raw)
  To: H.J. Lu; +Cc: Florian Weimer, Florian Weimer via Libc-alpha

On Mai 20 2021, H.J. Lu wrote:

> Can we ship a dummy linker script for libpthread.so to just
> satisfy -lpthread at link-time?

-lpthread will be satisfied by libpthread.a.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-20 15:17                       ` Andreas Schwab
@ 2021-05-20 15:35                         ` H.J. Lu
  2021-05-20 15:39                           ` Florian Weimer
  0 siblings, 1 reply; 47+ messages in thread
From: H.J. Lu @ 2021-05-20 15:35 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: Florian Weimer, Florian Weimer via Libc-alpha

On Thu, May 20, 2021 at 8:17 AM Andreas Schwab <schwab@linux-m68k.org> wrote:
>
> On Mai 20 2021, H.J. Lu wrote:
>
> > Can we ship a dummy linker script for libpthread.so to just
> > satisfy -lpthread at link-time?
>
> -lpthread will be satisfied by libpthread.a.
>
> Andreas.
>

What is the problem then?  We have to keep libpthread.so.0 for existing
binaries.  We just don't link against it for new binaries.


-- 
H.J.

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-20 15:35                         ` H.J. Lu
@ 2021-05-20 15:39                           ` Florian Weimer
  2021-05-20 15:57                             ` H.J. Lu
  0 siblings, 1 reply; 47+ messages in thread
From: Florian Weimer @ 2021-05-20 15:39 UTC (permalink / raw)
  To: H.J. Lu; +Cc: Andreas Schwab, Florian Weimer via Libc-alpha

* H. J. Lu:

> On Thu, May 20, 2021 at 8:17 AM Andreas Schwab <schwab@linux-m68k.org> wrote:
>>
>> On Mai 20 2021, H.J. Lu wrote:
>>
>> > Can we ship a dummy linker script for libpthread.so to just
>> > satisfy -lpthread at link-time?
>>
>> -lpthread will be satisfied by libpthread.a.
>>
>> Andreas.
>>
>
> What is the problem then?  We have to keep libpthread.so.0 for existing
> binaries.  We just don't link against it for new binaries.

I was a bit creative and patched the dynamic loader not to load
libpthread.so.0 ever (treating it as a reference to libc.so.6).  If we
don't want to do that (and the consensus is moving in that direction),
then we need to keep the DSO around as an actual file.

Thanks,
Florian


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 00/10] nptl: Complete libpthread removal
  2021-05-20 15:39                           ` Florian Weimer
@ 2021-05-20 15:57                             ` H.J. Lu
  0 siblings, 0 replies; 47+ messages in thread
From: H.J. Lu @ 2021-05-20 15:57 UTC (permalink / raw)
  To: Florian Weimer; +Cc: Andreas Schwab, Florian Weimer via Libc-alpha

On Thu, May 20, 2021 at 8:39 AM Florian Weimer <fweimer@redhat.com> wrote:
>
> * H. J. Lu:
>
> > On Thu, May 20, 2021 at 8:17 AM Andreas Schwab <schwab@linux-m68k.org> wrote:
> >>
> >> On Mai 20 2021, H.J. Lu wrote:
> >>
> >> > Can we ship a dummy linker script for libpthread.so to just
> >> > satisfy -lpthread at link-time?
> >>
> >> -lpthread will be satisfied by libpthread.a.
> >>
> >> Andreas.
> >>
> >
> > What is the problem then?  We have to keep libpthread.so.0 for existing
> > binaries.  We just don't link against it for new binaries.
>
> I was a bit creative and patched the dynamic loader not to load
> libpthread.so.0 ever (treating it as a reference to libc.so.6).  If we
> don't want to do that (and the consensus is moving in that direction),
> then we need to keep the DSO around as an actual file.

I think we should keep it as an actual DSO.


-- 
H.J.

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 01/10] nptl: Perform signal initialization upon pthread_create
  2021-05-18 14:24 ` [PATCH 01/10] nptl: Perform signal initialization upon pthread_create Florian Weimer
@ 2021-05-20 19:15   ` Adhemerval Zanella
  2021-05-20 19:41     ` Florian Weimer
  0 siblings, 1 reply; 47+ messages in thread
From: Adhemerval Zanella @ 2021-05-20 19:15 UTC (permalink / raw)
  To: Florian Weimer, libc-alpha



On 18/05/2021 11:24, Florian Weimer via Libc-alpha wrote:
> Install signal handlers and unblock signals before pthread_create
> creates the first thread.
> ---
>  nptl/Versions         |  5 ++-
>  nptl/nptl-init.c      | 75 ------------------------------------
>  nptl/pthreadP.h       |  6 +++
>  nptl/pthread_cancel.c | 88 ++++++++++++++++++++++++++++++++++++++-----
>  nptl/pthread_create.c | 45 +++++++++++++++++++++-
>  5 files changed, 131 insertions(+), 88 deletions(-)
> 
> diff --git a/nptl/Versions b/nptl/Versions
> index e7883cbb49..d96b830d05 100644
> --- a/nptl/Versions
> +++ b/nptl/Versions
> @@ -367,8 +367,6 @@ libc {
>      tss_set;
>    }
>    GLIBC_PRIVATE {
> -     __nptl_create_event;
> -     __nptl_death_event;
>      __default_pthread_attr;
>      __default_pthread_attr_lock;
>      __futex_abstimed_wait64;
> @@ -386,11 +384,14 @@ libc {
>      __lll_trylock_elision;
>      __lll_unlock_elision;
>      __mutex_aconf;
> +    __nptl_create_event;
>      __nptl_deallocate_stack;
>      __nptl_deallocate_tsd;
> +    __nptl_death_event;
>      __nptl_free_tcb;
>      __nptl_nthreads;
>      __nptl_setxid_sighandler;
> +    __nptl_sigcancel_handler;
>      __nptl_stack_list_add;
>      __nptl_stack_list_del;
>      __pthread_attr_copy;
> diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c
> index f4b86fbfaf..bc4831ac89 100644
> --- a/nptl/nptl-init.c
> +++ b/nptl/nptl-init.c
> @@ -44,84 +44,9 @@ size_t __static_tls_align_m1;
>  /* Version of the library, used in libthread_db to detect mismatches.  */
>  static const char nptl_version[] __attribute_used__ = VERSION;
>  
> -/* For asynchronous cancellation we use a signal.  This is the handler.  */
> -static void
> -sigcancel_handler (int sig, siginfo_t *si, void *ctx)
> -{
> -  /* Safety check.  It would be possible to call this function for
> -     other signals and send a signal from another process.  This is not
> -     correct and might even be a security problem.  Try to catch as
> -     many incorrect invocations as possible.  */
> -  if (sig != SIGCANCEL
> -      || si->si_pid != __getpid()
> -      || si->si_code != SI_TKILL)
> -    return;
> -
> -  struct pthread *self = THREAD_SELF;
> -
> -  int oldval = THREAD_GETMEM (self, cancelhandling);
> -  while (1)
> -    {
> -      /* We are canceled now.  When canceled by another thread this flag
> -	 is already set but if the signal is directly send (internally or
> -	 from another process) is has to be done here.  */
> -      int newval = oldval | CANCELING_BITMASK | CANCELED_BITMASK;
> -
> -      if (oldval == newval || (oldval & EXITING_BITMASK) != 0)
> -	/* Already canceled or exiting.  */
> -	break;
> -
> -      int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, newval,
> -					      oldval);
> -      if (curval == oldval)
> -	{
> -	  /* Set the return value.  */
> -	  THREAD_SETMEM (self, result, PTHREAD_CANCELED);
> -
> -	  /* Make sure asynchronous cancellation is still enabled.  */
> -	  if ((newval & CANCELTYPE_BITMASK) != 0)
> -	    /* Run the registered destructors and terminate the thread.  */
> -	    __do_cancel ();
> -
> -	  break;
> -	}
> -
> -      oldval = curval;
> -    }
> -}
> -
> -
> -/* When using __thread for this, we do it in libc so as not
> -   to give libpthread its own TLS segment just for this.  */
> -extern void **__libc_dl_error_tsd (void) __attribute__ ((const));
> -
> -
>  void
>  __pthread_initialize_minimal_internal (void)
>  {
> -  struct sigaction sa;
> -  __sigemptyset (&sa.sa_mask);
> -
> -  /* Install the cancellation signal handler.  If for some reason we
> -     cannot install the handler we do not abort.  Maybe we should, but
> -     it is only asynchronous cancellation which is affected.  */
> -  sa.sa_sigaction = sigcancel_handler;
> -  sa.sa_flags = SA_SIGINFO;
> -  (void) __libc_sigaction (SIGCANCEL, &sa, NULL);
> -
> -  /* Install the handle to change the threads' uid/gid.  */
> -  sa.sa_sigaction = __nptl_setxid_sighandler;
> -  sa.sa_flags = SA_SIGINFO | SA_RESTART;
> -  (void) __libc_sigaction (SIGSETXID, &sa, NULL);
> -
> -  /* The parent process might have left the signals blocked.  Just in
> -     case, unblock it.  We reuse the signal mask in the sigaction
> -     structure.  It is already cleared.  */
> -  __sigaddset (&sa.sa_mask, SIGCANCEL);
> -  __sigaddset (&sa.sa_mask, SIGSETXID);
> -  INTERNAL_SYSCALL_CALL (rt_sigprocmask, SIG_UNBLOCK, &sa.sa_mask,
> -			 NULL, __NSIG_BYTES);
> -
>    /* Get the size of the static and alignment requirements for the TLS
>       block.  */
>    size_t static_tls_align;
> diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
> index f93806e540..497c2ad3d9 100644
> --- a/nptl/pthreadP.h
> +++ b/nptl/pthreadP.h
> @@ -571,6 +571,12 @@ libc_hidden_proto (__pthread_attr_setsigmask_internal)
>  extern __typeof (pthread_attr_getsigmask_np) __pthread_attr_getsigmask_np;
>  libc_hidden_proto (__pthread_attr_getsigmask_np)
>  
> +/* The cancellation signal handler defined alongside with
> +   pthread_cancel.  This is included in statically linked binaries
> +   only if pthread_cancel is linked in.  */
> +void __nptl_sigcancel_handler (int sig, siginfo_t *si, void *ctx);
> +libc_hidden_proto (__nptl_sigcancel_handler)
> +
>  /* Special versions which use non-exported functions.  */
>  extern void __pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer,
>  				    void (*routine) (void *), void *arg);
> diff --git a/nptl/pthread_cancel.c b/nptl/pthread_cancel.c
> index e4ad602900..802c691874 100644
> --- a/nptl/pthread_cancel.c
> +++ b/nptl/pthread_cancel.c
> @@ -26,6 +26,63 @@
>  #include <unwind-link.h>
>  #include <stdio.h>
>  #include <gnu/lib-names.h>
> +#include <sys/single_threaded.h>
> +
> +/* For asynchronous cancellation we use a signal.  This is the core
> +   logic of the signal handler.  */
> +static void
> +sigcancel_handler (void)
> +{
> +  struct pthread *self = THREAD_SELF;
> +
> +  int oldval = THREAD_GETMEM (self, cancelhandling);
> +  while (1)
> +    {
> +      /* We are canceled now.  When canceled by another thread this flag
> +	 is already set but if the signal is directly send (internally or
> +	 from another process) is has to be done here.  */
> +      int newval = oldval | CANCELING_BITMASK | CANCELED_BITMASK;
> +
> +      if (oldval == newval || (oldval & EXITING_BITMASK) != 0)
> +	/* Already canceled or exiting.  */
> +	break;
> +
> +      int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, newval,
> +					      oldval);
> +      if (curval == oldval)
> +	{
> +	  /* Set the return value.  */
> +	  THREAD_SETMEM (self, result, PTHREAD_CANCELED);
> +
> +	  /* Make sure asynchronous cancellation is still enabled.  */
> +	  if ((newval & CANCELTYPE_BITMASK) != 0)
> +	    /* Run the registered destructors and terminate the thread.  */
> +	    __do_cancel ();
> +
> +	  break;
> +	}
> +
> +      oldval = curval;
> +    }
> +}
> +
> +/* This is the actually installed SIGCANCEL handler.  It adds some
> +   safety checks before performing the cancellation.  */
> +void
> +__nptl_sigcancel_handler (int sig, siginfo_t *si, void *ctx)
> +{
> +  /* Safety check.  It would be possible to call this function for
> +     other signals and send a signal from another process.  This is not
> +     correct and might even be a security problem.  Try to catch as
> +     many incorrect invocations as possible.  */
> +  if (sig != SIGCANCEL
> +      || si->si_pid != __getpid()
> +      || si->si_code != SI_TKILL)
> +    return;
> +
> +  sigcancel_handler ();
> +}
> +libc_hidden_def (__nptl_sigcancel_handler)
>  
>  int
>  __pthread_cancel (pthread_t th)
> @@ -72,14 +129,23 @@ __pthread_cancel (pthread_t th)
>  						    oldval))
>  	    goto again;
>  
> -	  /* The cancellation handler will take care of marking the
> -	     thread as canceled.  */
> -	  pid_t pid = __getpid ();
> -
> -	  int val = INTERNAL_SYSCALL_CALL (tgkill, pid, pd->tid,
> -					   SIGCANCEL);
> -	  if (INTERNAL_SYSCALL_ERROR_P (val))
> -	    result = INTERNAL_SYSCALL_ERRNO (val);
> +	  if (pd == THREAD_SELF)
> +	    /* This is not merely an optimization: An application may
> +	       call pthread_cancel (pthread_self ()) without calling
> +	       pthread_create, so the signal handler may not have been
> +	       set up for a self-cancel.  */
> +	    sigcancel_handler ();

I think it would be simple to just call __pthread_exit (PTHREAD_CANCELED)
here, it won't require to split the cancellation handler, it already
unwind if cancel state is enabled and asynchronous, and it does not
require add another PTHREAD_STATIC_FN_REQUIRE hack. 

It would require an extra __libc_unwind_link_get call, but I think we
can optimize it later (I am working on a patch to simplify it).

> +	  else
> +	    {
> +	      /* The cancellation handler will take care of marking the
> +		 thread as canceled.  */
> +	      pid_t pid = __getpid ();
> +
> +	      int val = INTERNAL_SYSCALL_CALL (tgkill, pid, pd->tid,
> +					       SIGCANCEL);
> +	      if (INTERNAL_SYSCALL_ERROR_P (val))
> +		result = INTERNAL_SYSCALL_ERRNO (val);
> +	    }
>  
>  	  break;
>  	}
> @@ -106,4 +172,8 @@ versioned_symbol (libc, __pthread_cancel, pthread_cancel, GLIBC_2_34);
>  compat_symbol (libpthread, __pthread_cancel, pthread_cancel, GLIBC_2_0);
>  #endif
>  
> -PTHREAD_STATIC_FN_REQUIRE (__pthread_create)
> +/* Ensure that the unwinder is always linked in (the __pthread_unwind
> +   reference from __do_cancel is weak).  Use ___pthread_unwind_next
> +   (three underscores) to produce a strong reference to the same
> +   file.  */
> +PTHREAD_STATIC_FN_REQUIRE (___pthread_unwind_next)
> diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c
> index 770656453d..772b5efcc6 100644
> --- a/nptl/pthread_create.c
> +++ b/nptl/pthread_create.c
> @@ -56,6 +56,43 @@ static struct rtld_global *__nptl_rtld_global __attribute_used__
>    = &_rtld_global;
>  #endif
>  
> +/* This performs the initialization necessary when going from
> +   single-threaded to multi-threaded mode for the first time.  */
> +static void
> +late_init (void)
> +{
> +  struct sigaction sa;
> +  __sigemptyset (&sa.sa_mask);
> +
> +  /* Install the cancellation signal handler (in static builds only if
> +     pthread_cancel has been linked in).  If for some reason we cannot
> +     install the handler we do not abort.  Maybe we should, but it is
> +     only asynchronous cancellation which is affected.  */
> +#ifndef SHARED
> +  extern __typeof (__nptl_sigcancel_handler) __nptl_sigcancel_handler
> +    __attribute__ ((weak));
> +  if (__nptl_sigcancel_handler != NULL)
> +#endif

This weak symbol can be avoided if we move the cancellation setup
on pthread_cancel instead.  I still think this is best approach,
it disentangle the cancellation handling.

> +    {
> +      sa.sa_sigaction = __nptl_sigcancel_handler;
> +      sa.sa_flags = SA_SIGINFO;
> +      (void) __libc_sigaction (SIGCANCEL, &sa, NULL);
> +    }
> +
> +  /* Install the handle to change the threads' uid/gid.  */
> +  sa.sa_sigaction = __nptl_setxid_sighandler;
> +  sa.sa_flags = SA_SIGINFO | SA_RESTART;
> +  (void) __libc_sigaction (SIGSETXID, &sa, NULL);
> +
> +  /* The parent process might have left the signals blocked.  Just in
> +     case, unblock it.  We reuse the signal mask in the sigaction
> +     structure.  It is already cleared.  */
> +  __sigaddset (&sa.sa_mask, SIGCANCEL);
> +  __sigaddset (&sa.sa_mask, SIGSETXID);
> +  INTERNAL_SYSCALL_CALL (rt_sigprocmask, SIG_UNBLOCK, &sa.sa_mask,
> +			 NULL, __NSIG_BYTES);
> +}
> +
>  /* Code to allocate and deallocate a stack.  */
>  #include "allocatestack.c"
>  
> @@ -459,9 +496,13 @@ __pthread_create_2_1 (pthread_t *newthread, const pthread_attr_t *attr,
>  {
>    STACK_VARIABLES;
>  
> -  /* Avoid a data race in the multi-threaded case.  */
> +  /* Avoid a data race in the multi-threaded case, and call the
> +     deferred initialization only once.  */
>    if (__libc_single_threaded)
> -    __libc_single_threaded = 0;
> +    {
> +      late_init ();
> +      __libc_single_threaded = 0;
> +    }
>  
>    const struct pthread_attr *iattr = (struct pthread_attr *) attr;
>    union pthread_attr_transparent default_attr;
> 

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 01/10] nptl: Perform signal initialization upon pthread_create
  2021-05-20 19:15   ` Adhemerval Zanella
@ 2021-05-20 19:41     ` Florian Weimer
  2021-05-20 19:57       ` Adhemerval Zanella
  0 siblings, 1 reply; 47+ messages in thread
From: Florian Weimer @ 2021-05-20 19:41 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha

* Adhemerval Zanella:

>>  int
>>  __pthread_cancel (pthread_t th)
>> @@ -72,14 +129,23 @@ __pthread_cancel (pthread_t th)
>>  						    oldval))
>>  	    goto again;
>>  
>> -	  /* The cancellation handler will take care of marking the
>> -	     thread as canceled.  */
>> -	  pid_t pid = __getpid ();
>> -
>> -	  int val = INTERNAL_SYSCALL_CALL (tgkill, pid, pd->tid,
>> -					   SIGCANCEL);
>> -	  if (INTERNAL_SYSCALL_ERROR_P (val))
>> -	    result = INTERNAL_SYSCALL_ERRNO (val);
>> +	  if (pd == THREAD_SELF)
>> +	    /* This is not merely an optimization: An application may
>> +	       call pthread_cancel (pthread_self ()) without calling
>> +	       pthread_create, so the signal handler may not have been
>> +	       set up for a self-cancel.  */
>> +	    sigcancel_handler ();
>
> I think it would be simple to just call __pthread_exit (PTHREAD_CANCELED)
> here, it won't require to split the cancellation handler, it already
> unwind if cancel state is enabled and asynchronous, and it does not
> require add another PTHREAD_STATIC_FN_REQUIRE hack. 
>
> It would require an extra __libc_unwind_link_get call, but I think we
> can optimize it later (I am working on a patch to simplify it).

It would be correct, I think.  pthread_cancel is not a cancellation
point.

#include <stdio.h>
#include <pthread.h>

int
main (void)
{
  pthread_cancel (pthread_self ());
  puts ("about to exit");
}

This should print “about to exit”.

>> +/* This performs the initialization necessary when going from
>> +   single-threaded to multi-threaded mode for the first time.  */
>> +static void
>> +late_init (void)
>> +{
>> +  struct sigaction sa;
>> +  __sigemptyset (&sa.sa_mask);
>> +
>> +  /* Install the cancellation signal handler (in static builds only if
>> +     pthread_cancel has been linked in).  If for some reason we cannot
>> +     install the handler we do not abort.  Maybe we should, but it is
>> +     only asynchronous cancellation which is affected.  */
>> +#ifndef SHARED
>> +  extern __typeof (__nptl_sigcancel_handler) __nptl_sigcancel_handler
>> +    __attribute__ ((weak));
>> +  if (__nptl_sigcancel_handler != NULL)
>> +#endif
>
> This weak symbol can be avoided if we move the cancellation setup
> on pthread_cancel instead.  I still think this is best approach,
> it disentangle the cancellation handling.

But then we either have to introduce yet another global flag or install
the signal handler unconditionally before every cancel operation.  I do
not think this results in a simplification.

Thanks,
Florian


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 01/10] nptl: Perform signal initialization upon pthread_create
  2021-05-20 19:41     ` Florian Weimer
@ 2021-05-20 19:57       ` Adhemerval Zanella
  2021-05-20 20:05         ` Florian Weimer
  0 siblings, 1 reply; 47+ messages in thread
From: Adhemerval Zanella @ 2021-05-20 19:57 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha



On 20/05/2021 16:41, Florian Weimer wrote:
> * Adhemerval Zanella:
> 
>>>  int
>>>  __pthread_cancel (pthread_t th)
>>> @@ -72,14 +129,23 @@ __pthread_cancel (pthread_t th)
>>>  						    oldval))
>>>  	    goto again;
>>>  
>>> -	  /* The cancellation handler will take care of marking the
>>> -	     thread as canceled.  */
>>> -	  pid_t pid = __getpid ();
>>> -
>>> -	  int val = INTERNAL_SYSCALL_CALL (tgkill, pid, pd->tid,
>>> -					   SIGCANCEL);
>>> -	  if (INTERNAL_SYSCALL_ERROR_P (val))
>>> -	    result = INTERNAL_SYSCALL_ERRNO (val);
>>> +	  if (pd == THREAD_SELF)
>>> +	    /* This is not merely an optimization: An application may
>>> +	       call pthread_cancel (pthread_self ()) without calling
>>> +	       pthread_create, so the signal handler may not have been
>>> +	       set up for a self-cancel.  */
>>> +	    sigcancel_handler ();
>>
>> I think it would be simple to just call __pthread_exit (PTHREAD_CANCELED)
>> here, it won't require to split the cancellation handler, it already
>> unwind if cancel state is enabled and asynchronous, and it does not
>> require add another PTHREAD_STATIC_FN_REQUIRE hack. 
>>
>> It would require an extra __libc_unwind_link_get call, but I think we
>> can optimize it later (I am working on a patch to simplify it).
> 
> It would be correct, I think.  pthread_cancel is not a cancellation
> point.
> 
> #include <stdio.h>
> #include <pthread.h>
> 
> int
> main (void)
> {
>   pthread_cancel (pthread_self ());
>   puts ("about to exit");
> }
> 
> This should print “about to exit”.

Yes, this is essentially sysdeps/pthread/tst-cancel-self.c.

> 
>>> +/* This performs the initialization necessary when going from
>>> +   single-threaded to multi-threaded mode for the first time.  */
>>> +static void
>>> +late_init (void)
>>> +{
>>> +  struct sigaction sa;
>>> +  __sigemptyset (&sa.sa_mask);
>>> +
>>> +  /* Install the cancellation signal handler (in static builds only if
>>> +     pthread_cancel has been linked in).  If for some reason we cannot
>>> +     install the handler we do not abort.  Maybe we should, but it is
>>> +     only asynchronous cancellation which is affected.  */
>>> +#ifndef SHARED
>>> +  extern __typeof (__nptl_sigcancel_handler) __nptl_sigcancel_handler
>>> +    __attribute__ ((weak));
>>> +  if (__nptl_sigcancel_handler != NULL)
>>> +#endif
>>
>> This weak symbol can be avoided if we move the cancellation setup
>> on pthread_cancel instead.  I still think this is best approach,
>> it disentangle the cancellation handling.
> 
> But then we either have to introduce yet another global flag or install
> the signal handler unconditionally before every cancel operation.  I do
> not think this results in a simplification.

The flag will be just a static bool or int only define on pthread_cancel,
something like:

  int
  __pthread_cancel (pthread_t th) 
  {
    [...]
    static int init = 0;
    if (atomic_load_relaxed (&init) == 0)
      {
        install_sighandler ();
        init = 1;
      }
    [...]
  }

Bu the main advantage is to move the cancellation code logically when
it is actually used, and it is small improvement on both static
linking (since the static code will be used solely is cancellation is
used) and on runtime (since sigaction will be set only if pthread_cancel
is called).

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 01/10] nptl: Perform signal initialization upon pthread_create
  2021-05-20 19:57       ` Adhemerval Zanella
@ 2021-05-20 20:05         ` Florian Weimer
  2021-05-20 20:32           ` Adhemerval Zanella
  0 siblings, 1 reply; 47+ messages in thread
From: Florian Weimer @ 2021-05-20 20:05 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha

* Adhemerval Zanella:

> On 20/05/2021 16:41, Florian Weimer wrote:
>> * Adhemerval Zanella:
>> 
>>>>  int
>>>>  __pthread_cancel (pthread_t th)
>>>> @@ -72,14 +129,23 @@ __pthread_cancel (pthread_t th)
>>>>  						    oldval))
>>>>  	    goto again;
>>>>  
>>>> -	  /* The cancellation handler will take care of marking the
>>>> -	     thread as canceled.  */
>>>> -	  pid_t pid = __getpid ();
>>>> -
>>>> -	  int val = INTERNAL_SYSCALL_CALL (tgkill, pid, pd->tid,
>>>> -					   SIGCANCEL);
>>>> -	  if (INTERNAL_SYSCALL_ERROR_P (val))
>>>> -	    result = INTERNAL_SYSCALL_ERRNO (val);
>>>> +	  if (pd == THREAD_SELF)
>>>> +	    /* This is not merely an optimization: An application may
>>>> +	       call pthread_cancel (pthread_self ()) without calling
>>>> +	       pthread_create, so the signal handler may not have been
>>>> +	       set up for a self-cancel.  */
>>>> +	    sigcancel_handler ();
>>>
>>> I think it would be simple to just call __pthread_exit (PTHREAD_CANCELED)
>>> here, it won't require to split the cancellation handler, it already
>>> unwind if cancel state is enabled and asynchronous, and it does not
>>> require add another PTHREAD_STATIC_FN_REQUIRE hack. 
>>>
>>> It would require an extra __libc_unwind_link_get call, but I think we
>>> can optimize it later (I am working on a patch to simplify it).
>> 
>> It would be correct, I think.  pthread_cancel is not a cancellation
>> point.
>> 
>> #include <stdio.h>
>> #include <pthread.h>
>> 
>> int
>> main (void)
>> {
>>   pthread_cancel (pthread_self ());
>>   puts ("about to exit");
>> }
>> 
>> This should print “about to exit”.
>
> Yes, this is essentially sysdeps/pthread/tst-cancel-self.c.

But surely this won't work if we call pthread_exit (PTHREAD_CANCELED)
because that exits the main thread at that point, and not at the next
cancellation point.

>>>> +/* This performs the initialization necessary when going from
>>>> +   single-threaded to multi-threaded mode for the first time.  */
>>>> +static void
>>>> +late_init (void)
>>>> +{
>>>> +  struct sigaction sa;
>>>> +  __sigemptyset (&sa.sa_mask);
>>>> +
>>>> +  /* Install the cancellation signal handler (in static builds only if
>>>> +     pthread_cancel has been linked in).  If for some reason we cannot
>>>> +     install the handler we do not abort.  Maybe we should, but it is
>>>> +     only asynchronous cancellation which is affected.  */
>>>> +#ifndef SHARED
>>>> +  extern __typeof (__nptl_sigcancel_handler) __nptl_sigcancel_handler
>>>> +    __attribute__ ((weak));
>>>> +  if (__nptl_sigcancel_handler != NULL)
>>>> +#endif
>>>
>>> This weak symbol can be avoided if we move the cancellation setup
>>> on pthread_cancel instead.  I still think this is best approach,
>>> it disentangle the cancellation handling.
>> 
>> But then we either have to introduce yet another global flag or install
>> the signal handler unconditionally before every cancel operation.  I do
>> not think this results in a simplification.
>
> The flag will be just a static bool or int only define on pthread_cancel,
> something like:
>
>   int
>   __pthread_cancel (pthread_t th) 
>   {
>     [...]
>     static int init = 0;
>     if (atomic_load_relaxed (&init) == 0)
>       {
>         install_sighandler ();
>         init = 1;
>       }
>     [...]
>   }
>
> Bu the main advantage is to move the cancellation code logically when
> it is actually used, and it is small improvement on both static
> linking (since the static code will be used solely is cancellation is
> used) and on runtime (since sigaction will be set only if pthread_cancel
> is called).

Okay, I can prepare a version along these lines.  But in general, I
consider less data and fewer conditionals an improvement.

Thanks,
Florian


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 01/10] nptl: Perform signal initialization upon pthread_create
  2021-05-20 20:05         ` Florian Weimer
@ 2021-05-20 20:32           ` Adhemerval Zanella
  2021-05-21  9:58             ` Florian Weimer
  0 siblings, 1 reply; 47+ messages in thread
From: Adhemerval Zanella @ 2021-05-20 20:32 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha



On 20/05/2021 17:05, Florian Weimer wrote:
> * Adhemerval Zanella:
> 
>> On 20/05/2021 16:41, Florian Weimer wrote:
>>> * Adhemerval Zanella:
>>>
>>>>>  int
>>>>>  __pthread_cancel (pthread_t th)
>>>>> @@ -72,14 +129,23 @@ __pthread_cancel (pthread_t th)
>>>>>  						    oldval))
>>>>>  	    goto again;
>>>>>  
>>>>> -	  /* The cancellation handler will take care of marking the
>>>>> -	     thread as canceled.  */
>>>>> -	  pid_t pid = __getpid ();
>>>>> -
>>>>> -	  int val = INTERNAL_SYSCALL_CALL (tgkill, pid, pd->tid,
>>>>> -					   SIGCANCEL);
>>>>> -	  if (INTERNAL_SYSCALL_ERROR_P (val))
>>>>> -	    result = INTERNAL_SYSCALL_ERRNO (val);
>>>>> +	  if (pd == THREAD_SELF)
>>>>> +	    /* This is not merely an optimization: An application may
>>>>> +	       call pthread_cancel (pthread_self ()) without calling
>>>>> +	       pthread_create, so the signal handler may not have been
>>>>> +	       set up for a self-cancel.  */
>>>>> +	    sigcancel_handler ();
>>>>
>>>> I think it would be simple to just call __pthread_exit (PTHREAD_CANCELED)
>>>> here, it won't require to split the cancellation handler, it already
>>>> unwind if cancel state is enabled and asynchronous, and it does not
>>>> require add another PTHREAD_STATIC_FN_REQUIRE hack. 
>>>>
>>>> It would require an extra __libc_unwind_link_get call, but I think we
>>>> can optimize it later (I am working on a patch to simplify it).
>>>
>>> It would be correct, I think.  pthread_cancel is not a cancellation
>>> point.
>>>
>>> #include <stdio.h>
>>> #include <pthread.h>
>>>
>>> int
>>> main (void)
>>> {
>>>   pthread_cancel (pthread_self ());
>>>   puts ("about to exit");
>>> }
>>>
>>> This should print “about to exit”.
>>
>> Yes, this is essentially sysdeps/pthread/tst-cancel-self.c.
> 
> But surely this won't work if we call pthread_exit (PTHREAD_CANCELED)
> because that exits the main thread at that point, and not at the next
> cancellation point.

But you need to use the same condition as the other places:

  if (CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS (...)
    __pthread_exit (PTHREAD_CANCELLED);

I really hope to once we get the libpthread move done to simplify
the whole cancellation code.

> 
>>>>> +/* This performs the initialization necessary when going from
>>>>> +   single-threaded to multi-threaded mode for the first time.  */
>>>>> +static void
>>>>> +late_init (void)
>>>>> +{
>>>>> +  struct sigaction sa;
>>>>> +  __sigemptyset (&sa.sa_mask);
>>>>> +
>>>>> +  /* Install the cancellation signal handler (in static builds only if
>>>>> +     pthread_cancel has been linked in).  If for some reason we cannot
>>>>> +     install the handler we do not abort.  Maybe we should, but it is
>>>>> +     only asynchronous cancellation which is affected.  */
>>>>> +#ifndef SHARED
>>>>> +  extern __typeof (__nptl_sigcancel_handler) __nptl_sigcancel_handler
>>>>> +    __attribute__ ((weak));
>>>>> +  if (__nptl_sigcancel_handler != NULL)
>>>>> +#endif
>>>>
>>>> This weak symbol can be avoided if we move the cancellation setup
>>>> on pthread_cancel instead.  I still think this is best approach,
>>>> it disentangle the cancellation handling.
>>>
>>> But then we either have to introduce yet another global flag or install
>>> the signal handler unconditionally before every cancel operation.  I do
>>> not think this results in a simplification.
>>
>> The flag will be just a static bool or int only define on pthread_cancel,
>> something like:
>>
>>   int
>>   __pthread_cancel (pthread_t th) 
>>   {
>>     [...]
>>     static int init = 0;
>>     if (atomic_load_relaxed (&init) == 0)
>>       {
>>         install_sighandler ();
>>         init = 1;
>>       }
>>     [...]
>>   }
>>
>> Bu the main advantage is to move the cancellation code logically when
>> it is actually used, and it is small improvement on both static
>> linking (since the static code will be used solely is cancellation is
>> used) and on runtime (since sigaction will be set only if pthread_cancel
>> is called).
> 
> Okay, I can prepare a version along these lines.  But in general, I
> consider less data and fewer conditionals an improvement.

Thanks.

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 04/10] elf: Use custom NODELETE DSO for tst-dlopenfail, tst-dlopenfail-2
  2021-05-18 14:25 ` [PATCH 04/10] elf: Use custom NODELETE DSO for tst-dlopenfail, tst-dlopenfail-2 Florian Weimer
@ 2021-05-20 20:36   ` Adhemerval Zanella
  0 siblings, 0 replies; 47+ messages in thread
From: Adhemerval Zanella @ 2021-05-20 20:36 UTC (permalink / raw)
  To: Florian Weimer, libc-alpha



On 18/05/2021 11:25, Florian Weimer via Libc-alpha wrote:
> Once libpthread is removed, it no longer can be used for testing.

Looks good in general, just some comments below regarding the test
change.

> ---
>  elf/Makefile                 | 11 +++++++--
>  elf/tst-dlopenfail-2.c       |  5 +---
>  elf/tst-dlopenfail.c         | 44 ++++++++++++++----------------------
>  elf/tst-dlopenfailmod2.c     |  6 ++---
>  elf/tst-dlopenfailnodelmod.c | 29 ++++++++++++++++++++++++
>  5 files changed, 59 insertions(+), 36 deletions(-)
>  create mode 100644 elf/tst-dlopenfailnodelmod.c
> 
> diff --git a/elf/Makefile b/elf/Makefile
> index 5e809dbfaa..834ec858a8 100644
> --- a/elf/Makefile
> +++ b/elf/Makefile
> @@ -334,7 +334,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
>  		tst-auditmanymod7 tst-auditmanymod8 tst-auditmanymod9 \
>  		tst-initlazyfailmod tst-finilazyfailmod \
>  		tst-dlopenfailmod1 tst-dlopenfaillinkmod tst-dlopenfailmod2 \
> -		tst-dlopenfailmod3 tst-ldconfig-ld-mod \
> +		tst-dlopenfailmod3 tst-dlopenfailnodelmod tst-ldconfig-ld-mod \
>  		tst-filterobj-flt tst-filterobj-aux tst-filterobj-filtee \
>  		tst-auditlogmod-1 tst-auditlogmod-2 tst-auditlogmod-3 \
>  		tst-single_threaded-mod1 tst-single_threaded-mod2 \
> @@ -1733,11 +1733,18 @@ LDFLAGS-tst-dlopenfailmod1.so = -Wl,--no-as-needed
>  $(objpfx)tst-dlopenfailmod1.so: \
>    $(shared-thread-library) $(objpfx)tst-dlopenfaillinkmod.so
>  LDFLAGS-tst-dlopenfaillinkmod.so = -Wl,-soname,tst-dlopenfail-missingmod.so
> -$(objpfx)tst-dlopenfailmod2.so: $(shared-thread-library)
> +$(objpfx)tst-dlopenfailmod2.so: $(objpfx)tst-dlopenfailnodelmod.so
>  $(objpfx)tst-dlopenfail-2: $(libdl)
>  $(objpfx)tst-dlopenfail-2.out: \
>    $(objpfx)tst-dlopenfailmod1.so $(objpfx)tst-dlopenfailmod2.so \
>    $(objpfx)tst-dlopenfailmod3.so

Ok.

> +# tst-dlopenfailnodelmod.so emulates how libpthread was linked.
> +$(objpfx)tst-dlopenfailnodelmod.so: $(libsupport)
> +LDFLAGS-tst-dlopenfailnodelmod.so = \
> +  -Wl,--enable-new-dtags,-z,nodelete,-z,initfirst
> +# tst-dlopenfail should export the libsupport symbols, so that
> +# tst-dlopenfailnodelmod.so uses them for error reporting.
> +LDFLAGS-tst-dlopenfail = -Wl,-E
>  
>  $(objpfx)tst-dlopen-nodelete-reloc: $(libdl)
>  $(objpfx)tst-dlopen-nodelete-reloc.out: \

Ok.

> diff --git a/elf/tst-dlopenfail-2.c b/elf/tst-dlopenfail-2.c
> index 50eed81cb0..168c4b2c7f 100644
> --- a/elf/tst-dlopenfail-2.c
> +++ b/elf/tst-dlopenfail-2.c
> @@ -28,10 +28,7 @@
>  static int
>  do_test (void)
>  {
> -  /* This test uses libpthread as the canonical NODELETE module.  If
> -     libpthread is no longer NODELETE because it has been merged into
> -     libc, the test needs to be updated.  */
> -  TEST_VERIFY (dlsym (NULL, "pthread_create") == NULL);
> +  TEST_VERIFY (dlsym (NULL, "no_delete_mod_function") == NULL);
>  
>    /* This is expected to fail because of the missing dependency.  */
>    puts ("info: attempting to load tst-dlopenfailmod1.so");

Ok.

> diff --git a/elf/tst-dlopenfail.c b/elf/tst-dlopenfail.c
> index db2b41f9b5..990e28dbce 100644
> --- a/elf/tst-dlopenfail.c
> +++ b/elf/tst-dlopenfail.c
> @@ -18,7 +18,6 @@
>  
>  #include <dlfcn.h>
>  #include <errno.h>
> -#include <gnu/lib-names.h>
>  #include <stddef.h>
>  #include <stdio.h>
>  #include <string.h>
> @@ -28,10 +27,7 @@
>  static int
>  do_test (void)
>  {
> -  /* This test uses libpthread as the canonical NODELETE module.  If
> -     libpthread is no longer NODELETE because it has been merged into
> -     libc, the test needs to be updated.  */
> -  TEST_VERIFY (dlsym (NULL, "pthread_create") == NULL);
> +  TEST_VERIFY (dlsym (NULL, "no_delete_mod_function") == NULL);
>  
>    /* This is expected to fail because of the missing dependency.  */
>    puts ("info: attempting to load tst-dlopenfailmod1.so");

Ok.

> @@ -42,36 +38,30 @@ do_test (void)
>                         " cannot open shared object file:"
>                         " No such file or directory");
>  
> -  /* Do not probe for the presence of libpthread at this point because
> -     that might trigger relocation if bug 20839 is present, obscuring
> -     a subsequent crash.  */
> +  /* Do not probe for the presence of the tst-dlopenfailnodelmod.so at
> +     this point because that might trigger relocation if bug 20839 is
> +     present, obscuring a subsequent crash.  */
>  
>    /* This is expected to succeed.  */
>    puts ("info: loading tst-dlopenfailmod2.so");
>    void *handle = xdlopen ("tst-dlopenfailmod2.so", RTLD_NOW);
> +  xdlsym (handle, "no_delete_mod_function");
>    xdlclose (handle);
>  
> -  /* libpthread should remain loaded.  */
> -  TEST_VERIFY (dlopen (LIBPTHREAD_SO, RTLD_LAZY | RTLD_NOLOAD) != NULL);
> -  TEST_VERIFY (dlsym (NULL, "pthread_create") == NULL);
> +  /* The NODELETE module should remain loaded.  */
> +  xdlopen ("tst-dlopenfailnodelmod.so", RTLD_LAZY | RTLD_NOLOAD);
> +  /* But the symbol is not in the global scope.  */

No sure if this is an improvement, the failure message will be triggered 
in the libsupport not in the test itself.

> +  TEST_VERIFY (dlsym (NULL, "no_delete_mod_function") == NULL);
>  
> -  /* We can make libpthread global, and then the symbol should become
> -     available.  */
> -  TEST_VERIFY (dlopen (LIBPTHREAD_SO, RTLD_LAZY | RTLD_GLOBAL) != NULL);
> -  TEST_VERIFY (dlsym (NULL, "pthread_create") != NULL);
> +  /* We can make tst-dlopenfailnodelmod.so global, and then the symbol
> +     should become available.  */
> +  xdlopen ("tst-dlopenfailnodelmod.so", RTLD_LAZY | RTLD_GLOBAL);
> +  void (*no_delete_mod_function) (void)
> +    = xdlsym (NULL, "no_delete_mod_function");
>  

Same as before.

> -  /* sem_open is sufficiently complex to depend on relocations.  */
> -  void *(*sem_open_ptr) (const char *, int flag, ...)
> -    = dlsym (NULL, "sem_open");
> -  if (sem_open_ptr == NULL)
> -    /* Hurd does not implement sem_open.  */
> -    puts ("warning: sem_open not found, further testing not possible");
> -  else
> -    {
> -      errno = 0;
> -      TEST_VERIFY (sem_open_ptr ("/", 0) == NULL);
> -      TEST_COMPARE (errno, EINVAL);
> -    }
> +  /* Hopefully, no_delete_mod_function is sufficiently complex to
> +     depend on relocations.  */
> +  no_delete_mod_function ();
>  
>    return 0;
>  }

Ok.

> diff --git a/elf/tst-dlopenfailmod2.c b/elf/tst-dlopenfailmod2.c
> index cd6f9cf56b..ed353f9a3c 100644
> --- a/elf/tst-dlopenfailmod2.c
> +++ b/elf/tst-dlopenfailmod2.c
> @@ -16,11 +16,11 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>  
> -#include <pthread.h>
>  #include <stdio.h>
>  
> -/* Force linking against libpthread.  */
> -void *pthread_create_reference = pthread_create;
> +/* Force linking against tst-dlopenfailnodelmod.so.  */
> +void no_delete_mod_function (void);
> +void *function_reference = no_delete_mod_function;
>  
>  static void __attribute__ ((constructor))
>  init (void)

Ok.

> diff --git a/elf/tst-dlopenfailnodelmod.c b/elf/tst-dlopenfailnodelmod.c
> new file mode 100644
> index 0000000000..c4347b7591
> --- /dev/null
> +++ b/elf/tst-dlopenfailnodelmod.c
> @@ -0,0 +1,29 @@
> +/* NODELETE module for tst-dlopenfail, tst-dlopenfail-2.
> +   Copyright (C) 2021 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <support/check.h>
> +
> +/* Introduce some relocation dependencies.  */
> +const char test_string[] = "test string";
> +const char *test_string_ptr = test_string;
> +
> +void
> +no_delete_mod_function (void)
> +{
> +  TEST_COMPARE_STRING (test_string, test_string_ptr);
> +}
> 

Ok.

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 05/10] nptl: Move pthread_create, thrd_create into libc
  2021-05-18 14:25 ` [PATCH 05/10] nptl: Move pthread_create, thrd_create into libc Florian Weimer
@ 2021-05-20 20:44   ` Adhemerval Zanella
  0 siblings, 0 replies; 47+ messages in thread
From: Adhemerval Zanella @ 2021-05-20 20:44 UTC (permalink / raw)
  To: Florian Weimer, libc-alpha



On 18/05/2021 11:25, Florian Weimer via Libc-alpha wrote:
> The symbols were moved using scripts/move-symbol-to-libc.py.
> 
> The libpthread placeholder symbols need some changes because some
> symbol versions have gone away completely.  But
> __errno_location@@GLIBC_2.0 still exists, so the GLIBC_2.0 version
> is still there.
> 
> The internal __pthread_create symbol now points to the correct
> function, so the sysdeps/nptl/thrd_create.c override is no longer
> necessary.
> 
> There was an issue how the hidden alias of pthread_getattr_default_np
> was defined, so this commit cleans up that aspects and removes the
> GLIBC_PRIVATE export altogether.

LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

> ---
>  include/libc-internal.h                       |  6 ++++-
>  nptl/Makefile                                 |  2 +-
>  nptl/Versions                                 | 14 +++++++----
>  nptl/libpthread-compat.c                      | 24 +++++++++----------
>  nptl/pthreadP.h                               |  7 +++---
>  nptl/pthread_create.c                         | 11 +++++++--
>  nptl/pthread_getattr_default_np.c             |  6 +++--
>  nptl_db/Makefile                              |  2 +-
>  nptl_db/structs.def                           | 10 ++++----
>  sysdeps/nptl/thrd_create.c                    |  2 --
>  sysdeps/pthread/Makefile                      |  3 +--
>  sysdeps/pthread/thrd_create.c                 | 11 ++++++++-
>  sysdeps/unix/sysv/linux/aarch64/libc.abilist  |  4 ++++
>  .../sysv/linux/aarch64/libpthread.abilist     |  3 +--
>  sysdeps/unix/sysv/linux/alpha/libc.abilist    |  5 ++++
>  .../unix/sysv/linux/alpha/libpthread.abilist  |  5 ++--
>  sysdeps/unix/sysv/linux/arc/libc.abilist      |  4 ++++
>  .../unix/sysv/linux/arc/libpthread.abilist    |  2 --
>  sysdeps/unix/sysv/linux/arm/be/libc.abilist   |  4 ++++
>  .../unix/sysv/linux/arm/be/libpthread.abilist |  3 +--
>  sysdeps/unix/sysv/linux/arm/le/libc.abilist   |  4 ++++
>  .../unix/sysv/linux/arm/le/libpthread.abilist |  3 +--
>  sysdeps/unix/sysv/linux/csky/libc.abilist     |  4 ++++
>  .../unix/sysv/linux/csky/libpthread.abilist   |  2 --
>  sysdeps/unix/sysv/linux/hppa/libc.abilist     |  4 ++++
>  .../unix/sysv/linux/hppa/libpthread.abilist   |  3 +--
>  sysdeps/unix/sysv/linux/i386/libc.abilist     |  5 ++++
>  .../unix/sysv/linux/i386/libpthread.abilist   |  5 ++--
>  sysdeps/unix/sysv/linux/ia64/libc.abilist     |  4 ++++
>  .../unix/sysv/linux/ia64/libpthread.abilist   |  3 +--
>  .../sysv/linux/m68k/coldfire/libc.abilist     |  4 ++++
>  .../linux/m68k/coldfire/libpthread.abilist    |  3 +--
>  .../unix/sysv/linux/m68k/m680x0/libc.abilist  |  5 ++++
>  .../sysv/linux/m68k/m680x0/libpthread.abilist |  5 ++--
>  .../sysv/linux/microblaze/be/libc.abilist     |  4 ++++
>  .../linux/microblaze/be/libpthread.abilist    |  3 +--
>  .../sysv/linux/microblaze/le/libc.abilist     |  4 ++++
>  .../linux/microblaze/le/libpthread.abilist    |  3 +--
>  .../sysv/linux/mips/mips32/fpu/libc.abilist   |  5 ++++
>  .../sysv/linux/mips/mips32/libpthread.abilist |  5 ++--
>  .../sysv/linux/mips/mips32/nofpu/libc.abilist |  5 ++++
>  .../sysv/linux/mips/mips64/libpthread.abilist |  5 ++--
>  .../sysv/linux/mips/mips64/n32/libc.abilist   |  5 ++++
>  .../sysv/linux/mips/mips64/n64/libc.abilist   |  5 ++++
>  sysdeps/unix/sysv/linux/nios2/libc.abilist    |  4 ++++
>  .../unix/sysv/linux/nios2/libpthread.abilist  |  3 +--
>  .../linux/powerpc/powerpc32/fpu/libc.abilist  |  5 ++++
>  .../powerpc/powerpc32/libpthread.abilist      |  5 ++--
>  .../powerpc/powerpc32/nofpu/libc.abilist      |  5 ++++
>  .../linux/powerpc/powerpc64/be/libc.abilist   |  4 ++++
>  .../powerpc/powerpc64/be/libpthread.abilist   |  3 +--
>  .../linux/powerpc/powerpc64/le/libc.abilist   |  4 ++++
>  .../powerpc/powerpc64/le/libpthread.abilist   |  3 +--
>  .../unix/sysv/linux/riscv/rv32/libc.abilist   |  4 ++++
>  .../sysv/linux/riscv/rv32/libpthread.abilist  |  2 --
>  .../unix/sysv/linux/riscv/rv64/libc.abilist   |  4 ++++
>  .../sysv/linux/riscv/rv64/libpthread.abilist  |  3 +--
>  .../unix/sysv/linux/s390/s390-32/libc.abilist |  5 ++++
>  .../linux/s390/s390-32/libpthread.abilist     |  5 ++--
>  .../unix/sysv/linux/s390/s390-64/libc.abilist |  4 ++++
>  .../linux/s390/s390-64/libpthread.abilist     |  3 +--
>  sysdeps/unix/sysv/linux/sh/be/libc.abilist    |  4 ++++
>  .../unix/sysv/linux/sh/be/libpthread.abilist  |  3 +--
>  sysdeps/unix/sysv/linux/sh/le/libc.abilist    |  4 ++++
>  .../unix/sysv/linux/sh/le/libpthread.abilist  |  3 +--
>  .../sysv/linux/sparc/sparc32/libc.abilist     |  5 ++++
>  .../linux/sparc/sparc32/libpthread.abilist    |  5 ++--
>  .../sysv/linux/sparc/sparc64/libc.abilist     |  4 ++++
>  .../linux/sparc/sparc64/libpthread.abilist    |  3 +--
>  .../unix/sysv/linux/x86_64/64/libc.abilist    |  4 ++++
>  .../sysv/linux/x86_64/64/libpthread.abilist   |  3 +--
>  .../unix/sysv/linux/x86_64/x32/libc.abilist   |  4 ++++
>  .../sysv/linux/x86_64/x32/libpthread.abilist  |  3 +--
>  73 files changed, 233 insertions(+), 104 deletions(-)
>  delete mode 100644 sysdeps/nptl/thrd_create.c
> 
> diff --git a/include/libc-internal.h b/include/libc-internal.h
> index 5b18c7c9f2..749dfb919c 100644
> --- a/include/libc-internal.h
> +++ b/include/libc-internal.h
> @@ -38,7 +38,11 @@ extern void __libc_freeres (void);
>  libc_hidden_proto (__libc_freeres)
>  
>  /* Free resources stored in thread-local variables on thread exit.  */
> -extern void __libc_thread_freeres (void);
> +extern void __libc_thread_freeres (void)
> +#if PTHREAD_IN_LIBC
> +  attribute_hidden
> +#endif
> +  ;
>  
>  /* Define and initialize `__progname' et. al.  */

Ok.

>  extern void __init_misc (int, char **, char **) attribute_hidden;
> diff --git a/nptl/Makefile b/nptl/Makefile
> index bd5a9ce51f..7426997a83 100644
> --- a/nptl/Makefile
> +++ b/nptl/Makefile
> @@ -109,6 +109,7 @@ routines = \
>    pthread_condattr_init \
>    pthread_condattr_setclock \
>    pthread_condattr_setpshared \
> +  pthread_create \
>    pthread_detach \
>    pthread_equal \
>    pthread_exit \
> @@ -211,7 +212,6 @@ libpthread-routines = \
>    libpthread-compat \
>    nptl-init \
>    pt-interp \
> -  pthread_create \
>    version \
>  
>  libpthread-shared-only-routines = \

Ok.

> diff --git a/nptl/Versions b/nptl/Versions
> index 845001847b..0db56bce29 100644
> --- a/nptl/Versions
> +++ b/nptl/Versions
> @@ -38,6 +38,7 @@ libc {
>      pthread_cond_wait;
>      pthread_condattr_destroy;
>      pthread_condattr_init;
> +    pthread_create;
>      pthread_detach;
>      pthread_equal;
>      pthread_exit;
> @@ -80,6 +81,7 @@ libc {
>      pthread_attr_setguardsize;
>      pthread_attr_setstackaddr;
>      pthread_attr_setstacksize;
> +    pthread_create;
>      pthread_getconcurrency;
>      pthread_mutexattr_gettype;
>      pthread_mutexattr_settype;
> @@ -217,6 +219,7 @@ libc {
>      mtx_trylock;
>      mtx_unlock;
>      thrd_current;
> +    thrd_create;
>      thrd_detach;
>      thrd_equal;
>      thrd_exit;
> @@ -358,6 +361,7 @@ libc {
>      sem_trywait;
>      sem_unlink;
>      sem_wait;
> +    thrd_create;
>      thrd_detach;
>      thrd_exit;
>      thrd_join;

Ok.

> @@ -409,8 +413,6 @@ libc {
>      __pthread_enable_asynccancel;
>      __pthread_force_elision;
>      __pthread_get_minstack;
> -    __pthread_getattr_default_np;
> -    __pthread_getattr_default_np;
>      __pthread_keys;
>      __pthread_mutex_unlock_usercnt;
>      __pthread_setcancelstate;

Ok.

> @@ -438,7 +440,7 @@ libpthread {
>    }
>  
>    GLIBC_2.1 {
> -    pthread_create;
> +    __libpthread_version_placeholder;
>    }
>  
>    GLIBC_2.1.1 {
> @@ -495,9 +497,11 @@ libpthread {
>    GLIBC_2.19 {
>    }
>  
> -  # C11 thread symbols.
>    GLIBC_2.28 {
> -    thrd_create;
> +    __libpthread_version_placeholder;
> +  }
> +
> +  GLIBC_2.29 {
>    }
>  
>    GLIBC_2.30 {

Ok.

> diff --git a/nptl/libpthread-compat.c b/nptl/libpthread-compat.c
> index 7e3e7aa0c3..2dcf175f3f 100644
> --- a/nptl/libpthread-compat.c
> +++ b/nptl/libpthread-compat.c
> @@ -28,14 +28,11 @@ __libpthread_version_placeholder_1 (void)
>  }
>  #endif
>  
> -/* This is an unused compatibility symbol definition, to prevent ld
> -   from creating a weak version definition for GLIBC_2.1.2.  (__vfork
> -   used to be defined at that version, but it is now provided by libc,
> -   and there are no versions left in libpthread for that symbol
> -   version.)  If the ABI baseline for glibc is the GLIBC_2.2 symbol
> -   version or later, the placeholder symbol is not needed because
> -   there are plenty of other symbols which populate those later
> -   versions.  */
> +#if (SHLIB_COMPAT (libpthread, GLIBC_2_1, GLIBC_2_2))
> +compat_symbol (libpthread, __libpthread_version_placeholder_1,
> +	       __libpthread_version_placeholder, GLIBC_2_1);
> +#endif
> +
>  #if (SHLIB_COMPAT (libpthread, GLIBC_2_1_1, GLIBC_2_1_2))
>  compat_symbol (libpthread, __libpthread_version_placeholder_1,
>  	       __libpthread_version_placeholder, GLIBC_2_1_1);

Ok.

> @@ -45,12 +42,8 @@ compat_symbol (libpthread, __libpthread_version_placeholder_1,
>  	       __libpthread_version_placeholder, GLIBC_2_1_2);
>  #endif
>  
> -/* Do not create the placeholder symbol version if there are other
> -   symbols left that keep the version around (because GLIBC_2.0 got
> -   promoted to GLIBC_2.2).  */
>  #if SHLIB_COMPAT (libpthread, GLIBC_2_2, GLIBC_2_2_3) \
> -  && ABI_libpthread_GLIBC_2_2 != ABI_libpthread_GLIBC_2_0 \
> -  && ABI_libpthread_GLIBC_2_2 != ABI_libpthread_GLIBC_2_1_3
> +  && ABI_libpthread_GLIBC_2_2 != ABI_libpthread_GLIBC_2_0
>  compat_symbol (libpthread, __libpthread_version_placeholder_1,
>  	       __libpthread_version_placeholder, GLIBC_2_2);
>  #endif

Ok.

> @@ -101,6 +94,11 @@ compat_symbol (libpthread, __libpthread_version_placeholder_1,
>  	       __libpthread_version_placeholder, GLIBC_2_18);
>  #endif
>  
> +#if (SHLIB_COMPAT (libpthread, GLIBC_2_28, GLIBC_2_29))
> +compat_symbol (libpthread, __libpthread_version_placeholder_1,
> +	       __libpthread_version_placeholder, GLIBC_2_28);
> +#endif
> +
>  #if (SHLIB_COMPAT (libpthread, GLIBC_2_30, GLIBC_2_31))
>  compat_symbol (libpthread, __libpthread_version_placeholder_1,
>  	       __libpthread_version_placeholder, GLIBC_2_30);

Ok.

> diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
> index 3151842891..05f2bae521 100644
> --- a/nptl/pthreadP.h
> +++ b/nptl/pthreadP.h
> @@ -314,9 +314,10 @@ libc_hidden_proto (__pthread_cleanup_upto)
>  
>  
>  /* Functions with versioned interfaces.  */
> -extern int __pthread_create_2_1 (pthread_t *newthread,
> -				 const pthread_attr_t *attr,
> -				 void *(*start_routine) (void *), void *arg);
> +extern int __pthread_create (pthread_t *newthread,
> +			     const pthread_attr_t *attr,
> +			     void *(*start_routine) (void *), void *arg);
> +libc_hidden_proto (__pthread_create)
>  extern int __pthread_create_2_0 (pthread_t *newthread,
>  				 const pthread_attr_t *attr,
>  				 void *(*start_routine) (void *), void *arg);

Ok.

> diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c
> index 438b8a7ae1..5680687efe 100644
> --- a/nptl/pthread_create.c
> +++ b/nptl/pthread_create.c
> @@ -762,10 +762,17 @@ __pthread_create_2_1 (pthread_t *newthread, const pthread_attr_t *attr,
>  
>    return retval;
>  }
> -versioned_symbol (libpthread, __pthread_create_2_1, pthread_create, GLIBC_2_1);
> +versioned_symbol (libc, __pthread_create_2_1, pthread_create, GLIBC_2_34);
> +libc_hidden_ver (__pthread_create_2_1, __pthread_create)
> +#ifndef SHARED
> +strong_alias (__pthread_create_2_1, __pthread_create)
> +#endif
>  
> +#if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_1, GLIBC_2_34)
> +compat_symbol (libpthread, __pthread_create_2_1, pthread_create, GLIBC_2_1);
> +#endif
>  
> -#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)
> +#if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_1)
>  int
>  __pthread_create_2_0 (pthread_t *newthread, const pthread_attr_t *attr,
>  		      void *(*start_routine) (void *), void *arg)

Ok.

> diff --git a/nptl/pthread_getattr_default_np.c b/nptl/pthread_getattr_default_np.c
> index f38f687431..ad10a27339 100644
> --- a/nptl/pthread_getattr_default_np.c
> +++ b/nptl/pthread_getattr_default_np.c
> @@ -29,8 +29,10 @@ ___pthread_getattr_default_np (pthread_attr_t *out)
>  }
>  versioned_symbol (libc, ___pthread_getattr_default_np,
>                    pthread_getattr_default_np, GLIBC_2_34);
> -versioned_symbol (libc, ___pthread_getattr_default_np,
> -                  __pthread_getattr_default_np, GLIBC_PRIVATE);
> +libc_hidden_ver (___pthread_getattr_default_np, __pthread_getattr_default_np)
> +#ifndef SHARED
> +strong_alias (___pthread_getattr_default_np, __pthread_getattr_default_np)
> +#endif
>  
>  #if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_18, GLIBC_2_34)
>  compat_symbol (libpthread, ___pthread_getattr_default_np,

Ok.

> diff --git a/nptl_db/Makefile b/nptl_db/Makefile
> index 8873a0a0ee..ea721c1dcf 100644
> --- a/nptl_db/Makefile
> +++ b/nptl_db/Makefile
> @@ -56,7 +56,7 @@ tests-special += $(objpfx)db-symbols.out
>  include ../Rules
>  
>  $(objpfx)db-symbols.out: $(objpfx)db-symbols.v.i \
> -			 $(common-objpfx)nptl/libpthread.so
> +			 $(common-objpfx)libc.so
>  	LC_ALL=C $(READELF) -W -s $(filter %.so,$^) | $(AWK) -f $< > $@; \
>  	$(evaluate-test)
>  

Ok.

> diff --git a/nptl_db/structs.def b/nptl_db/structs.def
> index 71c9f7bfc2..6a726f207e 100644
> --- a/nptl_db/structs.def
> +++ b/nptl_db/structs.def
> @@ -1,4 +1,4 @@
> -/* List of types and symbols in libpthread examined by libthread_db.
> +/* List of types and symbols in libc examined by libthread_db.
>     Copyright (C) 2003-2021 Free Software Foundation, Inc.
>     This file is part of the GNU C Library.
>  
> @@ -27,7 +27,7 @@
>  #endif
>  
>  /* DB_MAIN_VARIABLE, DB_MAIN_SYMBOL, DB_MAIN_ARRAY_VARIABLE are not
> -   covered by the libpthread symbol check in db-symbols.awk.  */
> +   covered by the libc symbol check in db-symbols.awk.  */
>  #ifndef DB_MAIN_VARIABLE
>  # define DB_MAIN_VARIABLE(name) DB_VARIABLE (name)
>  #endif
> @@ -39,7 +39,7 @@
>  #endif
>  
>  #ifndef DB_RTLD_GLOBAL_FIELD
> -# if !IS_IN (libpthread)
> +# if !IS_IN (libc)
>  #  define DB_RTLD_GLOBAL_FIELD(field)		\
>    DB_STRUCT_FIELD (rtld_global, _##field)	\
>    DB_MAIN_VARIABLE (_##field)

Ok.

> @@ -103,11 +103,11 @@ DB_STRUCT_ARRAY_FIELD (dtv, dtv)
>  #define pointer_val pointer.val /* Field of anonymous struct in dtv_t.  */
>  DB_STRUCT_FIELD (dtv_t, pointer_val)
>  DB_STRUCT_FIELD (dtv_t, counter)
> -#if !IS_IN (libpthread) || TLS_TCB_AT_TP
> +#if !IS_IN (libc) || TLS_TCB_AT_TP
>  DB_STRUCT_FIELD (pthread, dtvp)
>  #endif
>  
> -#if !(IS_IN (libpthread) && !defined SHARED)
> +#if !(IS_IN (libc) && !defined SHARED)
>  DB_VARIABLE (__nptl_rtld_global)
>  #endif
>  DB_RTLD_GLOBAL_FIELD (dl_tls_dtv_slotinfo_list)

Ok.

> diff --git a/sysdeps/nptl/thrd_create.c b/sysdeps/nptl/thrd_create.c
> deleted file mode 100644
> index 596a7ba588..0000000000
> --- a/sysdeps/nptl/thrd_create.c
> +++ /dev/null
> @@ -1,2 +0,0 @@
> -#define __pthread_create __pthread_create_2_1
> -#include <sysdeps/pthread/thrd_create.c>

Ok.

> diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile
> index b15d085f51..bca642f438 100644
> --- a/sysdeps/pthread/Makefile
> +++ b/sysdeps/pthread/Makefile
> @@ -31,8 +31,6 @@ headers += threads.h
>  
>  routines += thrd_current thrd_equal thrd_sleep thrd_yield
>  
> -libpthread-routines += thrd_create
> -
>  $(libpthread-routines-var) += \
>    call_once \
>    cnd_broadcast \
> @@ -47,6 +45,7 @@ $(libpthread-routines-var) += \
>    mtx_timedlock \
>    mtx_trylock \
>    mtx_unlock \
> +  thrd_create \
>    thrd_detach \
>    thrd_exit \
>    thrd_join \

Ok.

> diff --git a/sysdeps/pthread/thrd_create.c b/sysdeps/pthread/thrd_create.c
> index 07848c0aab..3cb9f1cefb 100644
> --- a/sysdeps/pthread/thrd_create.c
> +++ b/sysdeps/pthread/thrd_create.c
> @@ -17,9 +17,10 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include "thrd_priv.h"
> +#include <shlib-compat.h>
>  
>  int
> -thrd_create (thrd_t *thr, thrd_start_t func, void *arg)
> +__thrd_create (thrd_t *thr, thrd_start_t func, void *arg)
>  {
>    _Static_assert (sizeof (thrd_t) == sizeof (pthread_t),
>  		  "sizeof (thrd_t) != sizeof (pthread_t)");
> @@ -28,3 +29,11 @@ thrd_create (thrd_t *thr, thrd_start_t func, void *arg)
>  				   (void* (*) (void*))func, arg);
>    return thrd_err_map (err_code);
>  }
> +#if PTHREAD_IN_LIBC
> +versioned_symbol (libc, __thrd_create, thrd_create, GLIBC_2_34);
> +# if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_28, GLIBC_2_34)
> +compat_symbol (libc, __thrd_create, thrd_create, GLIBC_2_28);
> +# endif
> +#else /* !PTHREAD_IN_LIBC */
> +strong_alias (__thrd_create, thrd_create)
> +#endif

Ok.

> diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> index bc051ba9f5..d22c7da7ef 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> @@ -1488,6 +1488,7 @@ GLIBC_2.17 pthread_condattr_getpshared F
>  GLIBC_2.17 pthread_condattr_init F
>  GLIBC_2.17 pthread_condattr_setclock F
>  GLIBC_2.17 pthread_condattr_setpshared F
> +GLIBC_2.17 pthread_create F
>  GLIBC_2.17 pthread_detach F
>  GLIBC_2.17 pthread_equal F
>  GLIBC_2.17 pthread_exit F
> @@ -2277,6 +2278,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2370,6 +2372,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2442,6 +2445,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist b/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
> index 3c03fcc17b..14ada15a35 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
> @@ -1,6 +1,5 @@
>  GLIBC_2.17 __errno_location F
> -GLIBC_2.17 pthread_create F
>  GLIBC_2.18 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
>  GLIBC_2.31 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> index 3bea473d00..cefff3bf36 100644
> --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> @@ -898,6 +898,7 @@ GLIBC_2.0 pthread_cond_timedwait F
>  GLIBC_2.0 pthread_cond_wait F
>  GLIBC_2.0 pthread_condattr_destroy F
>  GLIBC_2.0 pthread_condattr_init F
> +GLIBC_2.0 pthread_create F
>  GLIBC_2.0 pthread_detach F
>  GLIBC_2.0 pthread_equal F
>  GLIBC_2.0 pthread_exit F
> @@ -1620,6 +1621,7 @@ GLIBC_2.1 pthread_attr_init F
>  GLIBC_2.1 pthread_attr_setguardsize F
>  GLIBC_2.1 pthread_attr_setstackaddr F
>  GLIBC_2.1 pthread_attr_setstacksize F
> +GLIBC_2.1 pthread_create F
>  GLIBC_2.1 pthread_getconcurrency F
>  GLIBC_2.1 pthread_mutexattr_gettype F
>  GLIBC_2.1 pthread_mutexattr_settype F
> @@ -2166,6 +2168,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2461,6 +2464,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2533,6 +2537,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/alpha/libpthread.abilist b/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
> index c8f065b787..47cbcf3baf 100644
> --- a/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
> @@ -1,6 +1,5 @@
>  GLIBC_2.0 __errno_location F
> -GLIBC_2.0 pthread_create F
> -GLIBC_2.1 pthread_create F
> +GLIBC_2.1 __libpthread_version_placeholder F
>  GLIBC_2.1.1 __libpthread_version_placeholder F
>  GLIBC_2.1.2 __libpthread_version_placeholder F
>  GLIBC_2.11 __libpthread_version_placeholder F
> @@ -9,7 +8,7 @@ GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.2 __libpthread_version_placeholder F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.3.2 __libpthread_version_placeholder F
>  GLIBC_2.3.3 __libpthread_version_placeholder F
>  GLIBC_2.3.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/arc/libc.abilist b/sysdeps/unix/sysv/linux/arc/libc.abilist
> index 3461527c5a..91a90f8ca4 100644
> --- a/sysdeps/unix/sysv/linux/arc/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arc/libc.abilist
> @@ -1429,6 +1429,7 @@ GLIBC_2.32 pthread_condattr_getpshared F
>  GLIBC_2.32 pthread_condattr_init F
>  GLIBC_2.32 pthread_condattr_setclock F
>  GLIBC_2.32 pthread_condattr_setpshared F
> +GLIBC_2.32 pthread_create F
>  GLIBC_2.32 pthread_detach F
>  GLIBC_2.32 pthread_equal F
>  GLIBC_2.32 pthread_exit F
> @@ -1889,6 +1890,7 @@ GLIBC_2.32 tempnam F
>  GLIBC_2.32 textdomain F
>  GLIBC_2.32 tfind F
>  GLIBC_2.32 tgkill F
> +GLIBC_2.32 thrd_create F
>  GLIBC_2.32 thrd_current F
>  GLIBC_2.32 thrd_detach F
>  GLIBC_2.32 thrd_equal F
> @@ -2129,6 +2131,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2201,6 +2204,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/arc/libpthread.abilist b/sysdeps/unix/sysv/linux/arc/libpthread.abilist
> index 1d363aa47f..c4264810e6 100644
> --- a/sysdeps/unix/sysv/linux/arc/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/arc/libpthread.abilist
> @@ -1,3 +1 @@
>  GLIBC_2.32 __errno_location F
> -GLIBC_2.32 pthread_create F
> -GLIBC_2.32 thrd_create F
> diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> index 7c3029a7e5..120288d766 100644
> --- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> @@ -140,6 +140,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -236,6 +237,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -308,6 +310,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> @@ -1740,6 +1743,7 @@ GLIBC_2.4 pthread_condattr_getpshared F
>  GLIBC_2.4 pthread_condattr_init F
>  GLIBC_2.4 pthread_condattr_setclock F
>  GLIBC_2.4 pthread_condattr_setpshared F
> +GLIBC_2.4 pthread_create F
>  GLIBC_2.4 pthread_detach F
>  GLIBC_2.4 pthread_equal F
>  GLIBC_2.4 pthread_exit F
> diff --git a/sysdeps/unix/sysv/linux/arm/be/libpthread.abilist b/sysdeps/unix/sysv/linux/arm/be/libpthread.abilist
> index 0ad6524820..f8ebb4cae2 100644
> --- a/sysdeps/unix/sysv/linux/arm/be/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/be/libpthread.abilist
> @@ -1,9 +1,8 @@
>  GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
>  GLIBC_2.31 __libpthread_version_placeholder F
>  GLIBC_2.4 __errno_location F
>  GLIBC_2.4 __libpthread_version_placeholder F
> -GLIBC_2.4 pthread_create F
> diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> index 24f5b202e8..be987da77e 100644
> --- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> @@ -140,6 +140,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -233,6 +234,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -305,6 +307,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> @@ -1737,6 +1740,7 @@ GLIBC_2.4 pthread_condattr_getpshared F
>  GLIBC_2.4 pthread_condattr_init F
>  GLIBC_2.4 pthread_condattr_setclock F
>  GLIBC_2.4 pthread_condattr_setpshared F
> +GLIBC_2.4 pthread_create F
>  GLIBC_2.4 pthread_detach F
>  GLIBC_2.4 pthread_equal F
>  GLIBC_2.4 pthread_exit F
> diff --git a/sysdeps/unix/sysv/linux/arm/le/libpthread.abilist b/sysdeps/unix/sysv/linux/arm/le/libpthread.abilist
> index 0ad6524820..f8ebb4cae2 100644
> --- a/sysdeps/unix/sysv/linux/arm/le/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/le/libpthread.abilist
> @@ -1,9 +1,8 @@
>  GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
>  GLIBC_2.31 __libpthread_version_placeholder F
>  GLIBC_2.4 __errno_location F
>  GLIBC_2.4 __libpthread_version_placeholder F
> -GLIBC_2.4 pthread_create F
> diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist
> index 85851c5fca..adb4e15cb8 100644
> --- a/sysdeps/unix/sysv/linux/csky/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/csky/libc.abilist
> @@ -1488,6 +1488,7 @@ GLIBC_2.29 pthread_condattr_getpshared F
>  GLIBC_2.29 pthread_condattr_init F
>  GLIBC_2.29 pthread_condattr_setclock F
>  GLIBC_2.29 pthread_condattr_setpshared F
> +GLIBC_2.29 pthread_create F
>  GLIBC_2.29 pthread_detach F
>  GLIBC_2.29 pthread_equal F
>  GLIBC_2.29 pthread_exit F
> @@ -1979,6 +1980,7 @@ GLIBC_2.29 telldir F
>  GLIBC_2.29 tempnam F
>  GLIBC_2.29 textdomain F
>  GLIBC_2.29 tfind F
> +GLIBC_2.29 thrd_create F
>  GLIBC_2.29 thrd_current F
>  GLIBC_2.29 thrd_detach F
>  GLIBC_2.29 thrd_equal F
> @@ -2313,6 +2315,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2385,6 +2388,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/csky/libpthread.abilist b/sysdeps/unix/sysv/linux/csky/libpthread.abilist
> index d2f66f45ff..f7649b87b2 100644
> --- a/sysdeps/unix/sysv/linux/csky/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/csky/libpthread.abilist
> @@ -1,5 +1,3 @@
>  GLIBC_2.29 __errno_location F
> -GLIBC_2.29 pthread_create F
> -GLIBC_2.29 thrd_create F
>  GLIBC_2.30 __libpthread_version_placeholder F
>  GLIBC_2.31 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> index ede69c7ed5..bd022276e8 100644
> --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> @@ -1312,6 +1312,7 @@ GLIBC_2.2 pthread_condattr_destroy F
>  GLIBC_2.2 pthread_condattr_getpshared F
>  GLIBC_2.2 pthread_condattr_init F
>  GLIBC_2.2 pthread_condattr_setpshared F
> +GLIBC_2.2 pthread_create F
>  GLIBC_2.2 pthread_detach F
>  GLIBC_2.2 pthread_equal F
>  GLIBC_2.2 pthread_exit F
> @@ -1999,6 +2000,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2266,6 +2268,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2338,6 +2341,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/hppa/libpthread.abilist b/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
> index cc941573b6..f1adf37ff2 100644
> --- a/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
> @@ -2,10 +2,9 @@ GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.2 __errno_location F
> -GLIBC_2.2 pthread_create F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.3.2 __libpthread_version_placeholder F
>  GLIBC_2.3.3 __libpthread_version_placeholder F
>  GLIBC_2.3.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
> index c883dc08bc..9e37e1cb38 100644
> --- a/sysdeps/unix/sysv/linux/i386/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
> @@ -875,6 +875,7 @@ GLIBC_2.0 pthread_cond_timedwait F
>  GLIBC_2.0 pthread_cond_wait F
>  GLIBC_2.0 pthread_condattr_destroy F
>  GLIBC_2.0 pthread_condattr_init F
> +GLIBC_2.0 pthread_create F
>  GLIBC_2.0 pthread_detach F
>  GLIBC_2.0 pthread_equal F
>  GLIBC_2.0 pthread_exit F
> @@ -1588,6 +1589,7 @@ GLIBC_2.1 pthread_attr_init F
>  GLIBC_2.1 pthread_attr_setguardsize F
>  GLIBC_2.1 pthread_attr_setstackaddr F
>  GLIBC_2.1 pthread_attr_setstacksize F
> +GLIBC_2.1 pthread_create F
>  GLIBC_2.1 pthread_getconcurrency F
>  GLIBC_2.1 pthread_mutexattr_gettype F
>  GLIBC_2.1 pthread_mutexattr_settype F
> @@ -2179,6 +2181,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2449,6 +2452,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2521,6 +2525,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/i386/libpthread.abilist b/sysdeps/unix/sysv/linux/i386/libpthread.abilist
> index c8f065b787..47cbcf3baf 100644
> --- a/sysdeps/unix/sysv/linux/i386/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/i386/libpthread.abilist
> @@ -1,6 +1,5 @@
>  GLIBC_2.0 __errno_location F
> -GLIBC_2.0 pthread_create F
> -GLIBC_2.1 pthread_create F
> +GLIBC_2.1 __libpthread_version_placeholder F
>  GLIBC_2.1.1 __libpthread_version_placeholder F
>  GLIBC_2.1.2 __libpthread_version_placeholder F
>  GLIBC_2.11 __libpthread_version_placeholder F
> @@ -9,7 +8,7 @@ GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.2 __libpthread_version_placeholder F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.3.2 __libpthread_version_placeholder F
>  GLIBC_2.3.3 __libpthread_version_placeholder F
>  GLIBC_2.3.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> index 38fb02e32b..b8089b0b0c 100644
> --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> @@ -1333,6 +1333,7 @@ GLIBC_2.2 pthread_condattr_destroy F
>  GLIBC_2.2 pthread_condattr_getpshared F
>  GLIBC_2.2 pthread_condattr_init F
>  GLIBC_2.2 pthread_condattr_setpshared F
> +GLIBC_2.2 pthread_create F
>  GLIBC_2.2 pthread_detach F
>  GLIBC_2.2 pthread_equal F
>  GLIBC_2.2 pthread_exit F
> @@ -2034,6 +2035,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2302,6 +2304,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2374,6 +2377,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/ia64/libpthread.abilist b/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
> index cc941573b6..f1adf37ff2 100644
> --- a/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
> @@ -2,10 +2,9 @@ GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.2 __errno_location F
> -GLIBC_2.2 pthread_create F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.3.2 __libpthread_version_placeholder F
>  GLIBC_2.3.3 __libpthread_version_placeholder F
>  GLIBC_2.3.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> index 8ee9648828..093854ad85 100644
> --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> @@ -141,6 +141,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -237,6 +238,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -309,6 +311,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> @@ -1720,6 +1723,7 @@ GLIBC_2.4 pthread_condattr_getpshared F
>  GLIBC_2.4 pthread_condattr_init F
>  GLIBC_2.4 pthread_condattr_setclock F
>  GLIBC_2.4 pthread_condattr_setpshared F
> +GLIBC_2.4 pthread_create F
>  GLIBC_2.4 pthread_detach F
>  GLIBC_2.4 pthread_equal F
>  GLIBC_2.4 pthread_exit F
> diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
> index 0ad6524820..f8ebb4cae2 100644
> --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
> @@ -1,9 +1,8 @@
>  GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
>  GLIBC_2.31 __libpthread_version_placeholder F
>  GLIBC_2.4 __errno_location F
>  GLIBC_2.4 __libpthread_version_placeholder F
> -GLIBC_2.4 pthread_create F
> diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> index 1c51cb41ec..87554f1468 100644
> --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> @@ -874,6 +874,7 @@ GLIBC_2.0 pthread_cond_timedwait F
>  GLIBC_2.0 pthread_cond_wait F
>  GLIBC_2.0 pthread_condattr_destroy F
>  GLIBC_2.0 pthread_condattr_init F
> +GLIBC_2.0 pthread_create F
>  GLIBC_2.0 pthread_detach F
>  GLIBC_2.0 pthread_equal F
>  GLIBC_2.0 pthread_exit F
> @@ -1584,6 +1585,7 @@ GLIBC_2.1 pthread_attr_init F
>  GLIBC_2.1 pthread_attr_setguardsize F
>  GLIBC_2.1 pthread_attr_setstackaddr F
>  GLIBC_2.1 pthread_attr_setstacksize F
> +GLIBC_2.1 pthread_create F
>  GLIBC_2.1 pthread_getconcurrency F
>  GLIBC_2.1 pthread_mutexattr_gettype F
>  GLIBC_2.1 pthread_mutexattr_settype F
> @@ -2122,6 +2124,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2392,6 +2395,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2464,6 +2468,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
> index c8f065b787..47cbcf3baf 100644
> --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
> @@ -1,6 +1,5 @@
>  GLIBC_2.0 __errno_location F
> -GLIBC_2.0 pthread_create F
> -GLIBC_2.1 pthread_create F
> +GLIBC_2.1 __libpthread_version_placeholder F
>  GLIBC_2.1.1 __libpthread_version_placeholder F
>  GLIBC_2.1.2 __libpthread_version_placeholder F
>  GLIBC_2.11 __libpthread_version_placeholder F
> @@ -9,7 +8,7 @@ GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.2 __libpthread_version_placeholder F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.3.2 __libpthread_version_placeholder F
>  GLIBC_2.3.3 __libpthread_version_placeholder F
>  GLIBC_2.3.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> index f8b67cd170..e9340671c5 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> @@ -1490,6 +1490,7 @@ GLIBC_2.18 pthread_condattr_getpshared F
>  GLIBC_2.18 pthread_condattr_init F
>  GLIBC_2.18 pthread_condattr_setclock F
>  GLIBC_2.18 pthread_condattr_setpshared F
> +GLIBC_2.18 pthread_create F
>  GLIBC_2.18 pthread_detach F
>  GLIBC_2.18 pthread_equal F
>  GLIBC_2.18 pthread_exit F
> @@ -2268,6 +2269,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2364,6 +2366,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2436,6 +2439,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist
> index 921e604dbe..c99c8b026c 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist
> @@ -1,5 +1,4 @@
>  GLIBC_2.18 __errno_location F
> -GLIBC_2.18 pthread_create F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
>  GLIBC_2.31 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> index edac4a1bb4..6ddc0e90cf 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> @@ -1490,6 +1490,7 @@ GLIBC_2.18 pthread_condattr_getpshared F
>  GLIBC_2.18 pthread_condattr_init F
>  GLIBC_2.18 pthread_condattr_setclock F
>  GLIBC_2.18 pthread_condattr_setpshared F
> +GLIBC_2.18 pthread_create F
>  GLIBC_2.18 pthread_detach F
>  GLIBC_2.18 pthread_equal F
>  GLIBC_2.18 pthread_exit F
> @@ -2268,6 +2269,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2361,6 +2363,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2433,6 +2436,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist
> index 921e604dbe..c99c8b026c 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist
> @@ -1,5 +1,4 @@
>  GLIBC_2.18 __errno_location F
> -GLIBC_2.18 pthread_create F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
>  GLIBC_2.31 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> index db900c89ab..8582c9c371 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> @@ -871,6 +871,7 @@ GLIBC_2.0 pthread_cond_timedwait F
>  GLIBC_2.0 pthread_cond_wait F
>  GLIBC_2.0 pthread_condattr_destroy F
>  GLIBC_2.0 pthread_condattr_init F
> +GLIBC_2.0 pthread_create F
>  GLIBC_2.0 pthread_detach F
>  GLIBC_2.0 pthread_equal F
>  GLIBC_2.0 pthread_exit F
> @@ -1869,6 +1870,7 @@ GLIBC_2.2 pthread_barrierattr_init F
>  GLIBC_2.2 pthread_barrierattr_setpshared F
>  GLIBC_2.2 pthread_condattr_getpshared F
>  GLIBC_2.2 pthread_condattr_setpshared F
> +GLIBC_2.2 pthread_create F
>  GLIBC_2.2 pthread_getconcurrency F
>  GLIBC_2.2 pthread_getcpuclockid F
>  GLIBC_2.2 pthread_mutex_timedlock F
> @@ -2092,6 +2094,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2357,6 +2360,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2429,6 +2433,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
> index a5f3d5ce2a..2d0b9e3542 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
> @@ -1,12 +1,11 @@
>  GLIBC_2.0 __errno_location F
> -GLIBC_2.0 pthread_create F
>  GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
> -GLIBC_2.2 pthread_create F
> +GLIBC_2.2 __libpthread_version_placeholder F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.3.2 __libpthread_version_placeholder F
>  GLIBC_2.3.3 __libpthread_version_placeholder F
>  GLIBC_2.3.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> index 4e15f48b6c..b0849bec98 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> @@ -871,6 +871,7 @@ GLIBC_2.0 pthread_cond_timedwait F
>  GLIBC_2.0 pthread_cond_wait F
>  GLIBC_2.0 pthread_condattr_destroy F
>  GLIBC_2.0 pthread_condattr_init F
> +GLIBC_2.0 pthread_create F
>  GLIBC_2.0 pthread_detach F
>  GLIBC_2.0 pthread_equal F
>  GLIBC_2.0 pthread_exit F
> @@ -1867,6 +1868,7 @@ GLIBC_2.2 pthread_barrierattr_init F
>  GLIBC_2.2 pthread_barrierattr_setpshared F
>  GLIBC_2.2 pthread_condattr_getpshared F
>  GLIBC_2.2 pthread_condattr_setpshared F
> +GLIBC_2.2 pthread_create F
>  GLIBC_2.2 pthread_getconcurrency F
>  GLIBC_2.2 pthread_getcpuclockid F
>  GLIBC_2.2 pthread_mutex_timedlock F
> @@ -2090,6 +2092,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2355,6 +2358,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2427,6 +2431,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
> index a5f3d5ce2a..2d0b9e3542 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
> @@ -1,12 +1,11 @@
>  GLIBC_2.0 __errno_location F
> -GLIBC_2.0 pthread_create F
>  GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
> -GLIBC_2.2 pthread_create F
> +GLIBC_2.2 __libpthread_version_placeholder F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.3.2 __libpthread_version_placeholder F
>  GLIBC_2.3.3 __libpthread_version_placeholder F
>  GLIBC_2.3.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> index 616a6076f1..386660a5a1 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> @@ -871,6 +871,7 @@ GLIBC_2.0 pthread_cond_timedwait F
>  GLIBC_2.0 pthread_cond_wait F
>  GLIBC_2.0 pthread_condattr_destroy F
>  GLIBC_2.0 pthread_condattr_init F
> +GLIBC_2.0 pthread_create F
>  GLIBC_2.0 pthread_detach F
>  GLIBC_2.0 pthread_equal F
>  GLIBC_2.0 pthread_exit F
> @@ -1867,6 +1868,7 @@ GLIBC_2.2 pthread_barrierattr_init F
>  GLIBC_2.2 pthread_barrierattr_setpshared F
>  GLIBC_2.2 pthread_condattr_getpshared F
>  GLIBC_2.2 pthread_condattr_setpshared F
> +GLIBC_2.2 pthread_create F
>  GLIBC_2.2 pthread_getconcurrency F
>  GLIBC_2.2 pthread_getcpuclockid F
>  GLIBC_2.2 pthread_mutex_timedlock F
> @@ -2098,6 +2100,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2363,6 +2366,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2435,6 +2439,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> index 59a353d306..4d05128f21 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> @@ -869,6 +869,7 @@ GLIBC_2.0 pthread_cond_timedwait F
>  GLIBC_2.0 pthread_cond_wait F
>  GLIBC_2.0 pthread_condattr_destroy F
>  GLIBC_2.0 pthread_condattr_init F
> +GLIBC_2.0 pthread_create F
>  GLIBC_2.0 pthread_detach F
>  GLIBC_2.0 pthread_equal F
>  GLIBC_2.0 pthread_exit F
> @@ -1863,6 +1864,7 @@ GLIBC_2.2 pthread_barrierattr_init F
>  GLIBC_2.2 pthread_barrierattr_setpshared F
>  GLIBC_2.2 pthread_condattr_getpshared F
>  GLIBC_2.2 pthread_condattr_setpshared F
> +GLIBC_2.2 pthread_create F
>  GLIBC_2.2 pthread_getconcurrency F
>  GLIBC_2.2 pthread_getcpuclockid F
>  GLIBC_2.2 pthread_mutex_timedlock F
> @@ -2093,6 +2095,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2357,6 +2360,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2429,6 +2433,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> index 0fc42897aa..bd305f440f 100644
> --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> @@ -1533,6 +1533,7 @@ GLIBC_2.21 pthread_condattr_getpshared F
>  GLIBC_2.21 pthread_condattr_init F
>  GLIBC_2.21 pthread_condattr_setclock F
>  GLIBC_2.21 pthread_condattr_setpshared F
> +GLIBC_2.21 pthread_create F
>  GLIBC_2.21 pthread_detach F
>  GLIBC_2.21 pthread_equal F
>  GLIBC_2.21 pthread_exit F
> @@ -2310,6 +2311,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2403,6 +2405,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2475,6 +2478,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/nios2/libpthread.abilist b/sysdeps/unix/sysv/linux/nios2/libpthread.abilist
> index f36733746e..4d8ff6a262 100644
> --- a/sysdeps/unix/sysv/linux/nios2/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/nios2/libpthread.abilist
> @@ -1,5 +1,4 @@
>  GLIBC_2.21 __errno_location F
> -GLIBC_2.21 pthread_create F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
>  GLIBC_2.31 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> index 553ecdabc9..c2665624aa 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> @@ -882,6 +882,7 @@ GLIBC_2.0 pthread_cond_timedwait F
>  GLIBC_2.0 pthread_cond_wait F
>  GLIBC_2.0 pthread_condattr_destroy F
>  GLIBC_2.0 pthread_condattr_init F
> +GLIBC_2.0 pthread_create F
>  GLIBC_2.0 pthread_detach F
>  GLIBC_2.0 pthread_equal F
>  GLIBC_2.0 pthread_exit F
> @@ -1592,6 +1593,7 @@ GLIBC_2.1 pthread_attr_init F
>  GLIBC_2.1 pthread_attr_setguardsize F
>  GLIBC_2.1 pthread_attr_setstackaddr F
>  GLIBC_2.1 pthread_attr_setstacksize F
> +GLIBC_2.1 pthread_create F
>  GLIBC_2.1 pthread_getconcurrency F
>  GLIBC_2.1 pthread_mutexattr_gettype F
>  GLIBC_2.1 pthread_mutexattr_settype F
> @@ -2126,6 +2128,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2419,6 +2422,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2491,6 +2495,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
> index 84a1592904..e545bcc56c 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
> @@ -1,6 +1,5 @@
>  GLIBC_2.0 __errno_location F
> -GLIBC_2.0 pthread_create F
> -GLIBC_2.1 pthread_create F
> +GLIBC_2.1 __libpthread_version_placeholder F
>  GLIBC_2.1.1 __libpthread_version_placeholder F
>  GLIBC_2.1.2 __libpthread_version_placeholder F
>  GLIBC_2.11 __libpthread_version_placeholder F
> @@ -9,7 +8,7 @@ GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.2 __libpthread_version_placeholder F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.3.2 __libpthread_version_placeholder F
>  GLIBC_2.3.3 __libpthread_version_placeholder F
>  GLIBC_2.3.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> index 7ec438f7b4..13ef6ef39e 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> @@ -882,6 +882,7 @@ GLIBC_2.0 pthread_cond_timedwait F
>  GLIBC_2.0 pthread_cond_wait F
>  GLIBC_2.0 pthread_condattr_destroy F
>  GLIBC_2.0 pthread_condattr_init F
> +GLIBC_2.0 pthread_create F
>  GLIBC_2.0 pthread_detach F
>  GLIBC_2.0 pthread_equal F
>  GLIBC_2.0 pthread_exit F
> @@ -1592,6 +1593,7 @@ GLIBC_2.1 pthread_attr_init F
>  GLIBC_2.1 pthread_attr_setguardsize F
>  GLIBC_2.1 pthread_attr_setstackaddr F
>  GLIBC_2.1 pthread_attr_setstacksize F
> +GLIBC_2.1 pthread_create F
>  GLIBC_2.1 pthread_getconcurrency F
>  GLIBC_2.1 pthread_mutexattr_gettype F
>  GLIBC_2.1 pthread_mutexattr_settype F
> @@ -2130,6 +2132,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2452,6 +2455,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2524,6 +2528,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> index f382e3e296..b21072e313 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> @@ -140,6 +140,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -1437,6 +1438,7 @@ GLIBC_2.3 pthread_condattr_destroy F
>  GLIBC_2.3 pthread_condattr_getpshared F
>  GLIBC_2.3 pthread_condattr_init F
>  GLIBC_2.3 pthread_condattr_setpshared F
> +GLIBC_2.3 pthread_create F
>  GLIBC_2.3 pthread_detach F
>  GLIBC_2.3 pthread_equal F
>  GLIBC_2.3 pthread_exit F
> @@ -2267,6 +2269,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2339,6 +2342,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
> index b66279a352..e10c836946 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
> @@ -1,9 +1,8 @@
>  GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.3 __errno_location F
> -GLIBC_2.3 pthread_create F
>  GLIBC_2.3.2 __libpthread_version_placeholder F
>  GLIBC_2.3.3 __libpthread_version_placeholder F
>  GLIBC_2.3.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> index 97ff951418..62af65536c 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> @@ -1576,6 +1576,7 @@ GLIBC_2.17 pthread_condattr_getpshared F
>  GLIBC_2.17 pthread_condattr_init F
>  GLIBC_2.17 pthread_condattr_setclock F
>  GLIBC_2.17 pthread_condattr_setpshared F
> +GLIBC_2.17 pthread_create F
>  GLIBC_2.17 pthread_detach F
>  GLIBC_2.17 pthread_equal F
>  GLIBC_2.17 pthread_exit F
> @@ -2367,6 +2368,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2566,6 +2568,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2638,6 +2641,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
> index 3c03fcc17b..14ada15a35 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
> @@ -1,6 +1,5 @@
>  GLIBC_2.17 __errno_location F
> -GLIBC_2.17 pthread_create F
>  GLIBC_2.18 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
>  GLIBC_2.31 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> index 5bde5bb508..a63aec3379 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> @@ -1431,6 +1431,7 @@ GLIBC_2.33 pthread_condattr_getpshared F
>  GLIBC_2.33 pthread_condattr_init F
>  GLIBC_2.33 pthread_condattr_setclock F
>  GLIBC_2.33 pthread_condattr_setpshared F
> +GLIBC_2.33 pthread_create F
>  GLIBC_2.33 pthread_detach F
>  GLIBC_2.33 pthread_equal F
>  GLIBC_2.33 pthread_exit F
> @@ -1899,6 +1900,7 @@ GLIBC_2.33 tempnam F
>  GLIBC_2.33 textdomain F
>  GLIBC_2.33 tfind F
>  GLIBC_2.33 tgkill F
> +GLIBC_2.33 thrd_create F
>  GLIBC_2.33 thrd_current F
>  GLIBC_2.33 thrd_detach F
>  GLIBC_2.33 thrd_equal F
> @@ -2131,6 +2133,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2203,6 +2206,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist
> index e9cded0b3c..73188776b6 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist
> @@ -1,3 +1 @@
>  GLIBC_2.33 __errno_location F
> -GLIBC_2.33 pthread_create F
> -GLIBC_2.33 thrd_create F
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> index 42f6d52e13..b52efaf5ee 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> @@ -1478,6 +1478,7 @@ GLIBC_2.27 pthread_condattr_getpshared F
>  GLIBC_2.27 pthread_condattr_init F
>  GLIBC_2.27 pthread_condattr_setclock F
>  GLIBC_2.27 pthread_condattr_setpshared F
> +GLIBC_2.27 pthread_create F
>  GLIBC_2.27 pthread_detach F
>  GLIBC_2.27 pthread_equal F
>  GLIBC_2.27 pthread_exit F
> @@ -2238,6 +2239,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2331,6 +2333,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2403,6 +2406,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
> index 07a3c7f01d..35a6a20935 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
> @@ -1,5 +1,4 @@
>  GLIBC_2.27 __errno_location F
> -GLIBC_2.27 pthread_create F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
>  GLIBC_2.31 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> index 2274342208..b699dedcc1 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> @@ -873,6 +873,7 @@ GLIBC_2.0 pthread_cond_timedwait F
>  GLIBC_2.0 pthread_cond_wait F
>  GLIBC_2.0 pthread_condattr_destroy F
>  GLIBC_2.0 pthread_condattr_init F
> +GLIBC_2.0 pthread_create F
>  GLIBC_2.0 pthread_detach F
>  GLIBC_2.0 pthread_equal F
>  GLIBC_2.0 pthread_exit F
> @@ -1584,6 +1585,7 @@ GLIBC_2.1 pthread_attr_init F
>  GLIBC_2.1 pthread_attr_setguardsize F
>  GLIBC_2.1 pthread_attr_setstackaddr F
>  GLIBC_2.1 pthread_attr_setstacksize F
> +GLIBC_2.1 pthread_create F
>  GLIBC_2.1 pthread_getconcurrency F
>  GLIBC_2.1 pthread_mutexattr_gettype F
>  GLIBC_2.1 pthread_mutexattr_settype F
> @@ -2135,6 +2137,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2417,6 +2420,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2489,6 +2493,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
> index faae6bcf76..ac212e942a 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
> @@ -1,6 +1,5 @@
>  GLIBC_2.0 __errno_location F
> -GLIBC_2.0 pthread_create F
> -GLIBC_2.1 pthread_create F
> +GLIBC_2.1 __libpthread_version_placeholder F
>  GLIBC_2.1.1 __libpthread_version_placeholder F
>  GLIBC_2.1.2 __libpthread_version_placeholder F
>  GLIBC_2.11 __libpthread_version_placeholder F
> @@ -10,7 +9,7 @@ GLIBC_2.19 __libpthread_version_placeholder F
>  GLIBC_2.2 __libpthread_version_placeholder F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.3.2 __libpthread_version_placeholder F
>  GLIBC_2.3.3 __libpthread_version_placeholder F
>  GLIBC_2.3.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> index 14d1c5e7f8..94209858b1 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> @@ -1330,6 +1330,7 @@ GLIBC_2.2 pthread_condattr_destroy F
>  GLIBC_2.2 pthread_condattr_getpshared F
>  GLIBC_2.2 pthread_condattr_init F
>  GLIBC_2.2 pthread_condattr_setpshared F
> +GLIBC_2.2 pthread_create F
>  GLIBC_2.2 pthread_detach F
>  GLIBC_2.2 pthread_equal F
>  GLIBC_2.2 pthread_exit F
> @@ -2026,6 +2027,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2304,6 +2306,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2376,6 +2379,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
> index ac3a2834dc..e0feab34d5 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
> @@ -3,10 +3,9 @@ GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.19 __libpthread_version_placeholder F
>  GLIBC_2.2 __errno_location F
> -GLIBC_2.2 pthread_create F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.3.2 __libpthread_version_placeholder F
>  GLIBC_2.3.3 __libpthread_version_placeholder F
>  GLIBC_2.3.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> index 97942ff01a..0fab90e1e3 100644
> --- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> @@ -1316,6 +1316,7 @@ GLIBC_2.2 pthread_condattr_destroy F
>  GLIBC_2.2 pthread_condattr_getpshared F
>  GLIBC_2.2 pthread_condattr_init F
>  GLIBC_2.2 pthread_condattr_setpshared F
> +GLIBC_2.2 pthread_create F
>  GLIBC_2.2 pthread_detach F
>  GLIBC_2.2 pthread_equal F
>  GLIBC_2.2 pthread_exit F
> @@ -2003,6 +2004,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2273,6 +2275,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2345,6 +2348,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/sh/be/libpthread.abilist b/sysdeps/unix/sysv/linux/sh/be/libpthread.abilist
> index cc941573b6..f1adf37ff2 100644
> --- a/sysdeps/unix/sysv/linux/sh/be/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/be/libpthread.abilist
> @@ -2,10 +2,9 @@ GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.2 __errno_location F
> -GLIBC_2.2 pthread_create F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.3.2 __libpthread_version_placeholder F
>  GLIBC_2.3.3 __libpthread_version_placeholder F
>  GLIBC_2.3.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> index 617b673620..2f3a64b580 100644
> --- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> @@ -1316,6 +1316,7 @@ GLIBC_2.2 pthread_condattr_destroy F
>  GLIBC_2.2 pthread_condattr_getpshared F
>  GLIBC_2.2 pthread_condattr_init F
>  GLIBC_2.2 pthread_condattr_setpshared F
> +GLIBC_2.2 pthread_create F
>  GLIBC_2.2 pthread_detach F
>  GLIBC_2.2 pthread_equal F
>  GLIBC_2.2 pthread_exit F
> @@ -2003,6 +2004,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2270,6 +2272,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2342,6 +2345,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/sh/le/libpthread.abilist b/sysdeps/unix/sysv/linux/sh/le/libpthread.abilist
> index cc941573b6..f1adf37ff2 100644
> --- a/sysdeps/unix/sysv/linux/sh/le/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/le/libpthread.abilist
> @@ -2,10 +2,9 @@ GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.2 __errno_location F
> -GLIBC_2.2 pthread_create F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.3.2 __libpthread_version_placeholder F
>  GLIBC_2.3.3 __libpthread_version_placeholder F
>  GLIBC_2.3.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> index 3c6559bb4f..e6fe453f50 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> @@ -876,6 +876,7 @@ GLIBC_2.0 pthread_cond_timedwait F
>  GLIBC_2.0 pthread_cond_wait F
>  GLIBC_2.0 pthread_condattr_destroy F
>  GLIBC_2.0 pthread_condattr_init F
> +GLIBC_2.0 pthread_create F
>  GLIBC_2.0 pthread_detach F
>  GLIBC_2.0 pthread_equal F
>  GLIBC_2.0 pthread_exit F
> @@ -1585,6 +1586,7 @@ GLIBC_2.1 pthread_attr_init F
>  GLIBC_2.1 pthread_attr_setguardsize F
>  GLIBC_2.1 pthread_attr_setstackaddr F
>  GLIBC_2.1 pthread_attr_setstacksize F
> +GLIBC_2.1 pthread_create F
>  GLIBC_2.1 pthread_getconcurrency F
>  GLIBC_2.1 pthread_mutexattr_gettype F
>  GLIBC_2.1 pthread_mutexattr_settype F
> @@ -2129,6 +2131,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2410,6 +2413,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2482,6 +2486,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
> index c8f065b787..47cbcf3baf 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
> @@ -1,6 +1,5 @@
>  GLIBC_2.0 __errno_location F
> -GLIBC_2.0 pthread_create F
> -GLIBC_2.1 pthread_create F
> +GLIBC_2.1 __libpthread_version_placeholder F
>  GLIBC_2.1.1 __libpthread_version_placeholder F
>  GLIBC_2.1.2 __libpthread_version_placeholder F
>  GLIBC_2.11 __libpthread_version_placeholder F
> @@ -9,7 +8,7 @@ GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.2 __libpthread_version_placeholder F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.3.2 __libpthread_version_placeholder F
>  GLIBC_2.3.3 __libpthread_version_placeholder F
>  GLIBC_2.3.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> index 77f54bb23b..4327cf5eb3 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> @@ -1359,6 +1359,7 @@ GLIBC_2.2 pthread_condattr_destroy F
>  GLIBC_2.2 pthread_condattr_getpshared F
>  GLIBC_2.2 pthread_condattr_init F
>  GLIBC_2.2 pthread_condattr_setpshared F
> +GLIBC_2.2 pthread_create F
>  GLIBC_2.2 pthread_detach F
>  GLIBC_2.2 pthread_equal F
>  GLIBC_2.2 pthread_exit F
> @@ -2056,6 +2057,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2323,6 +2325,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2395,6 +2398,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
> index cc941573b6..f1adf37ff2 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
> @@ -2,10 +2,9 @@ GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.2 __errno_location F
> -GLIBC_2.2 pthread_create F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.3.2 __libpthread_version_placeholder F
>  GLIBC_2.3.3 __libpthread_version_placeholder F
>  GLIBC_2.3.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> index 4035841a1e..318a6d50f9 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> @@ -1326,6 +1326,7 @@ GLIBC_2.2.5 pthread_condattr_destroy F
>  GLIBC_2.2.5 pthread_condattr_getpshared F
>  GLIBC_2.2.5 pthread_condattr_init F
>  GLIBC_2.2.5 pthread_condattr_setpshared F
> +GLIBC_2.2.5 pthread_create F
>  GLIBC_2.2.5 pthread_detach F
>  GLIBC_2.2.5 pthread_equal F
>  GLIBC_2.2.5 pthread_exit F
> @@ -2015,6 +2016,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2282,6 +2284,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2354,6 +2357,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
> index d3abfb7d11..ec4e3c0ecd 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
> @@ -2,9 +2,8 @@ GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.2.5 __errno_location F
> -GLIBC_2.2.5 pthread_create F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.3.2 __libpthread_version_placeholder F
>  GLIBC_2.3.3 __libpthread_version_placeholder F
>  GLIBC_2.3.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> index 61ac187db9..0bcf898d4d 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> @@ -1495,6 +1495,7 @@ GLIBC_2.16 pthread_condattr_getpshared F
>  GLIBC_2.16 pthread_condattr_init F
>  GLIBC_2.16 pthread_condattr_setclock F
>  GLIBC_2.16 pthread_condattr_setpshared F
> +GLIBC_2.16 pthread_create F
>  GLIBC_2.16 pthread_detach F
>  GLIBC_2.16 pthread_equal F
>  GLIBC_2.16 pthread_exit F
> @@ -2290,6 +2291,7 @@ GLIBC_2.28 mtx_trylock F
>  GLIBC_2.28 mtx_unlock F
>  GLIBC_2.28 renameat2 F
>  GLIBC_2.28 statx F
> +GLIBC_2.28 thrd_create F
>  GLIBC_2.28 thrd_current F
>  GLIBC_2.28 thrd_detach F
>  GLIBC_2.28 thrd_equal F
> @@ -2385,6 +2387,7 @@ GLIBC_2.34 pthread_condattr_getclock F
>  GLIBC_2.34 pthread_condattr_getpshared F
>  GLIBC_2.34 pthread_condattr_setclock F
>  GLIBC_2.34 pthread_condattr_setpshared F
> +GLIBC_2.34 pthread_create F
>  GLIBC_2.34 pthread_detach F
>  GLIBC_2.34 pthread_getattr_default_np F
>  GLIBC_2.34 pthread_getconcurrency F
> @@ -2457,6 +2460,7 @@ GLIBC_2.34 sem_timedwait F
>  GLIBC_2.34 sem_trywait F
>  GLIBC_2.34 sem_unlink F
>  GLIBC_2.34 sem_wait F
> +GLIBC_2.34 thrd_create F
>  GLIBC_2.34 thrd_detach F
>  GLIBC_2.34 thrd_exit F
>  GLIBC_2.34 thrd_join F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
> index af42dea518..cc6e073a11 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
> @@ -1,6 +1,5 @@
>  GLIBC_2.16 __errno_location F
> -GLIBC_2.16 pthread_create F
>  GLIBC_2.18 __libpthread_version_placeholder F
> -GLIBC_2.28 thrd_create F
> +GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
>  GLIBC_2.31 __libpthread_version_placeholder F
> 

Ok.

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 07/10] nptl: Remove remaining code from libpthread
  2021-05-18 14:25 ` [PATCH 07/10] nptl: Remove remaining code from libpthread Florian Weimer
@ 2021-05-20 20:49   ` Adhemerval Zanella
  0 siblings, 0 replies; 47+ messages in thread
From: Adhemerval Zanella @ 2021-05-20 20:49 UTC (permalink / raw)
  To: Florian Weimer, libc-alpha



On 18/05/2021 11:25, Florian Weimer via Libc-alpha wrote:
> Only the placeholder compatibility symbols are left now.
> 
> The __errno_location symbol was removed (moved) using
> scripts/move-symbol-to-libc.py.

LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

> ---
>  nptl/Makefile                                 | 46 ++---------------
>  nptl/Versions                                 | 12 +----
>  nptl/libpthread-compat.c                      | 10 ++--
>  nptl/nptl-init.c                              | 46 -----------------
>  nptl/pt-crti.S                                | 50 -------------------
>  nptl/pt-interp.c                              |  1 -
>  nptl/version.c                                | 41 ---------------
>  sysdeps/arm/nptl-aeabi_unwind_cpp_pr1.c       |  1 -
>  sysdeps/arm/nptl/Makefile                     |  3 --
>  sysdeps/ia64/nptl/Makefile                    |  5 --
>  sysdeps/mips/Makefile                         |  5 --
>  sysdeps/mips/nptl/Makefile                    |  5 --
>  sysdeps/mips/nptl/nptl-sysdep.S               |  2 -
>  sysdeps/nptl/Makefile                         |  4 --
>  sysdeps/riscv/nptl/Makefile                   |  5 --
>  sysdeps/riscv/nptl/nptl-sysdep.S              |  2 -
>  sysdeps/s390/nptl/Makefile                    |  5 --
>  sysdeps/sparc/Makefile                        |  4 --
>  sysdeps/sparc/nptl/Makefile                   |  5 --
>  .../sysv/linux/aarch64/libpthread.abilist     |  2 +-
>  sysdeps/unix/sysv/linux/alpha/Makefile        |  6 ---
>  .../unix/sysv/linux/alpha/libpthread.abilist  |  2 +-
>  .../unix/sysv/linux/arc/libpthread.abilist    |  2 +-
>  sysdeps/unix/sysv/linux/arm/Makefile          |  5 --
>  .../unix/sysv/linux/arm/be/libpthread.abilist |  1 -
>  .../unix/sysv/linux/arm/le/libpthread.abilist |  1 -
>  .../unix/sysv/linux/csky/libpthread.abilist   |  2 +-
>  .../unix/sysv/linux/hppa/libpthread.abilist   |  2 +-
>  sysdeps/unix/sysv/linux/i386/Makefile         | 11 ----
>  .../unix/sysv/linux/i386/libpthread.abilist   |  2 +-
>  .../unix/sysv/linux/ia64/libpthread.abilist   |  2 +-
>  .../linux/m68k/coldfire/libpthread.abilist    |  1 -
>  .../sysv/linux/m68k/m680x0/libpthread.abilist |  2 +-
>  sysdeps/unix/sysv/linux/microblaze/Makefile   |  6 ---
>  .../linux/microblaze/be/libpthread.abilist    |  2 +-
>  .../linux/microblaze/le/libpthread.abilist    |  2 +-
>  .../sysv/linux/mips/mips32/libpthread.abilist |  2 +-
>  .../sysv/linux/mips/mips64/libpthread.abilist |  2 +-
>  .../unix/sysv/linux/nios2/libpthread.abilist  |  2 +-
>  sysdeps/unix/sysv/linux/powerpc/Makefile      |  5 --
>  .../powerpc/powerpc32/libpthread.abilist      |  2 +-
>  .../powerpc/powerpc64/be/libpthread.abilist   |  2 +-
>  .../powerpc/powerpc64/le/libpthread.abilist   |  2 +-
>  .../sysv/linux/riscv/rv32/libpthread.abilist  |  2 +-
>  .../sysv/linux/riscv/rv64/libpthread.abilist  |  2 +-
>  .../linux/s390/s390-32/libpthread.abilist     |  2 +-
>  .../linux/s390/s390-64/libpthread.abilist     |  2 +-
>  .../unix/sysv/linux/sh/be/libpthread.abilist  |  2 +-
>  .../unix/sysv/linux/sh/le/libpthread.abilist  |  2 +-
>  sysdeps/unix/sysv/linux/sparc/Makefile        |  6 ---
>  .../linux/sparc/sparc32/libpthread.abilist    |  2 +-
>  .../linux/sparc/sparc64/libpthread.abilist    |  2 +-
>  .../sysv/linux/x86_64/64/libpthread.abilist   |  2 +-
>  .../sysv/linux/x86_64/x32/libpthread.abilist  |  2 +-
>  54 files changed, 37 insertions(+), 309 deletions(-)
>  delete mode 100644 nptl/nptl-init.c
>  delete mode 100644 nptl/pt-crti.S
>  delete mode 100644 nptl/pt-interp.c
>  delete mode 100644 nptl/version.c
>  delete mode 100644 sysdeps/arm/nptl-aeabi_unwind_cpp_pr1.c
>  delete mode 100644 sysdeps/mips/nptl/nptl-sysdep.S
>  delete mode 100644 sysdeps/riscv/nptl/nptl-sysdep.S
> 
> diff --git a/nptl/Makefile b/nptl/Makefile
> index a6e3b615a8..64cd0dcbf6 100644
> --- a/nptl/Makefile
> +++ b/nptl/Makefile
> @@ -207,16 +207,8 @@ routines = \
>  shared-only-routines = forward
>  static-only-routines = pthread_atfork
>  
> -libpthread-routines = \
> -  libpthread-compat \
> -  nptl-init \
> -  pt-interp \
> -  version \
> -
> -libpthread-shared-only-routines = \
> -  pt-allocrtsig \
> -  pt-interp \
> -  version \
> +libpthread-routines = libpthread-compat
> +libpthread-shared-only-routines = libpthread-compat
>  
>  # Since cancellation handling is in large parts handled using exceptions
>  # we have to compile some files with exception handling enabled, some

Ok.

> @@ -382,7 +374,7 @@ else
>  tests-printers-libs := $(static-thread-library)
>  endif
>  
> -LDFLAGS-pthread.so = -Wl,--enable-new-dtags,-z,nodelete,-z,initfirst
> +LDFLAGS-pthread.so = -Wl,--enable-new-dtags,-z,nodelete
>  
>  tests += tst-cancelx7 tst-cancelx17
>  

Ok.

> @@ -432,17 +424,6 @@ $(objpfx)multidir.mk: $(common-objpfx)config.make
>  	echo "multidir := $$dir" > $@T
>  	mv -f $@T $@
>  
> -crti-objs := crti.o
> -crtn-objs := crtn.o
> -ifneq (,$(patsubst .,,$(multidir)))
> -generated-dirs += $(firstword $(subst /, , $(multidir)))
> -crti-objs += $(multidir)/crti.o
> -crtn-objs += $(multidir)/crtn.o
> -$(objpfx)$(multidir):
> -	mkdir -p $@
> -endif
> -extra-objs += $(crti-objs) $(crtn-objs)
> -extra-objs += pt-crti.o
>  endif
>  
>  CFLAGS-ftrylockfile.c += $(libio-mtsafe)

Ok.

> @@ -577,11 +558,6 @@ $(objpfx)tst-cancelx17: $(librt)
>  LDLIBS-tst-cancel24 = -Wl,--no-as-needed -lstdc++
>  LDLIBS-tst-cancel24-static = $(LDLIBS-tst-cancel24)
>  
> -extra-B-pthread.so = -B$(common-objpfx)nptl/
> -$(objpfx)libpthread.so: $(addprefix $(objpfx),$(crti-objs) $(crtn-objs))
> -$(objpfx)libpthread.so: +preinit += $(addprefix $(objpfx),$(crti-objs))
> -$(objpfx)libpthread.so: +postinit += $(addprefix $(objpfx),$(crtn-objs))
> -
>  # Make sure we link with the thread library.
>  ifeq ($(build-shared),yes)
>  $(addprefix $(objpfx), \


Ok.

> @@ -601,23 +577,7 @@ $(addprefix $(objpfx),$(tests) $(test-srcs)): $(objpfx)libpthread.a
>  endif
>  
>  ifeq ($(build-shared),yes)
> -$(objpfx)crti.o: $(objpfx)pt-crti.o
> -	ln -f $< $@
> -
> -ifneq ($(multidir),.)
> -$(objpfx)$(multidir)/crti.o: $(objpfx)crti.o $(objpfx)$(multidir)/
> -	ln -f $< $@
> -
> -$(objpfx)$(multidir)/crtn.o: $(objpfx)crtn.o $(objpfx)$(multidir)/
> -	ln -f $< $@
> -endif
> -
>  generated += multidir.mk tst-tls6.out
> -
> -# Give libpthread.so an entry point and make it directly runnable itself.
> -LDFLAGS-pthread.so += -e __nptl_main
> -# pt-interp.c exists just to get the runtime linker path into libpthread.so.
> -$(objpfx)pt-interp.os: $(common-objpfx)runtime-linker.h
>  endif
>  
>  tst-exec4-ARGS = $(host-test-program-cmd)

Ok.

> diff --git a/nptl/Versions b/nptl/Versions
> index 0db56bce29..af62a47cca 100644
> --- a/nptl/Versions
> +++ b/nptl/Versions
> @@ -426,17 +426,7 @@ libc {
>  
>  libpthread {
>    GLIBC_2.0 {
> -    _Exit;
> -    _IO_flockfile;
> -    _IO_ftrylockfile;
> -    _IO_funlockfile;
> -    __errno_location;
> -    _exit;
> -    flockfile;
> -    ftrylockfile;
> -    funlockfile;
> -    pthread_create;
> -    pthread_sigmask;
> +    __libpthread_version_placeholder;
>    }
>  
>    GLIBC_2.1 {

Ok.

> diff --git a/nptl/libpthread-compat.c b/nptl/libpthread-compat.c
> index 2dcf175f3f..fb336d0685 100644
> --- a/nptl/libpthread-compat.c
> +++ b/nptl/libpthread-compat.c
> @@ -28,6 +28,11 @@ __libpthread_version_placeholder_1 (void)
>  }
>  #endif
>  
> +#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_34)
> +compat_symbol (libpthread, __libpthread_version_placeholder_1,
> +	       __libpthread_version_placeholder, GLIBC_2_0);
> +#endif
> +
>  #if (SHLIB_COMPAT (libpthread, GLIBC_2_1, GLIBC_2_2))
>  compat_symbol (libpthread, __libpthread_version_placeholder_1,
>  	       __libpthread_version_placeholder, GLIBC_2_1);
> @@ -42,7 +47,7 @@ compat_symbol (libpthread, __libpthread_version_placeholder_1,
>  	       __libpthread_version_placeholder, GLIBC_2_1_2);
>  #endif
>  
> -#if SHLIB_COMPAT (libpthread, GLIBC_2_2, GLIBC_2_2_3) \
> +#if SHLIB_COMPAT (libpthread, GLIBC_2_2, GLIBC_2_3) \
>    && ABI_libpthread_GLIBC_2_2 != ABI_libpthread_GLIBC_2_0
>  compat_symbol (libpthread, __libpthread_version_placeholder_1,
>  	       __libpthread_version_placeholder, GLIBC_2_2);
> @@ -88,8 +93,7 @@ compat_symbol (libpthread, __libpthread_version_placeholder_1,
>  	       __libpthread_version_placeholder, GLIBC_2_12);
>  #endif
>  
> -#if SHLIB_COMPAT (libpthread, GLIBC_2_18, GLIBC_2_19) \
> -  && ABI_libpthread_GLIBC_2_18 != ABI_libpthread_GLIBC_2_0
> +#if SHLIB_COMPAT (libpthread, GLIBC_2_18, GLIBC_2_19)
>  compat_symbol (libpthread, __libpthread_version_placeholder_1,
>  	       __libpthread_version_placeholder, GLIBC_2_18);
>  #endif

Ok.

> diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c
> deleted file mode 100644
> index 5a460aedba..0000000000
> --- a/nptl/nptl-init.c
> +++ /dev/null
> @@ -1,46 +0,0 @@
> -/* Copyright (C) 2002-2021 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library; if not, see
> -   <https://www.gnu.org/licenses/>.  */
> -
> -#include <assert.h>
> -#include <errno.h>
> -#include <limits.h>
> -#include <signal.h>
> -#include <stdlib.h>
> -#include <unistd.h>
> -#include <sys/param.h>
> -#include <sys/resource.h>
> -#include <pthreadP.h>
> -#include <atomic.h>
> -#include <ldsodefs.h>
> -#include <tls.h>
> -#include <list.h>
> -#include <version.h>
> -#include <shlib-compat.h>
> -#include <lowlevellock.h>
> -#include <futex-internal.h>
> -#include <kernel-features.h>
> -#include <libc-pointer-arith.h>
> -#include <pthread_mutex_conf.h>
> -#include <nptl-stack.h>
> -
> -void
> -__pthread_initialize_minimal_internal (void)
> -{
> -}
> -strong_alias (__pthread_initialize_minimal_internal,
> -	      __pthread_initialize_minimal)

Ok.

> diff --git a/nptl/pt-crti.S b/nptl/pt-crti.S
> deleted file mode 100644
> index e618986f98..0000000000
> --- a/nptl/pt-crti.S
> +++ /dev/null
> @@ -1,50 +0,0 @@
> -/* Special .init and .fini section support for libpthread.
> -   Copyright (C) 2012-2021 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   In addition to the permissions in the GNU Lesser General Public
> -   License, the Free Software Foundation gives you unlimited
> -   permission to link the compiled version of this file with other
> -   programs, and to distribute those programs without any restriction
> -   coming from the use of this file. (The GNU Lesser General Public
> -   License restrictions do apply in other respects; for example, they
> -   cover modification of the file, and distribution when not linked
> -   into another program.)
> -
> -   Note that people who make modified versions of this file are not
> -   obligated to grant this special exception for their modified
> -   versions; it is their choice whether to do so. The GNU Lesser
> -   General Public License gives permission to release a modified
> -   version without this exception; this exception also makes it
> -   possible to release a modified version which carries forward this
> -   exception.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library; if not, see
> -   <https://www.gnu.org/licenses/>.  */
> -
> -#include <elf-initfini.h>
> -
> -/* Arrange for __pthread_initialize_minimal_internal to be called at
> -   libpthread startup, instead of conditionally calling
> -   __gmon_start__.  */
> -
> -#if ELF_INITFINI
> -# define PREINIT_FUNCTION __pthread_initialize_minimal_internal
> -# define PREINIT_FUNCTION_WEAK 0
> -
> -# include <crti.S>
> -#else
> -	.section .init_array,"a",%init_array
> -	.dc.a __pthread_initialize_minimal_internal
> -#endif

Ok.

> diff --git a/nptl/pt-interp.c b/nptl/pt-interp.c
> deleted file mode 100644
> index ecf1fe70df..0000000000
> --- a/nptl/pt-interp.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <elf/interp.c>

Ok.

> diff --git a/nptl/version.c b/nptl/version.c
> deleted file mode 100644
> index 25e3a0c872..0000000000
> --- a/nptl/version.c
> +++ /dev/null
> @@ -1,41 +0,0 @@
> -/* Entry point for libpthread DSO.
> -   Copyright (C) 2002-2021 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library; if not, see
> -   <https://www.gnu.org/licenses/>.  */
> -
> -#include <unistd.h>
> -#include <sysdep.h>
> -
> -
> -static const char banner[] =
> -"Native POSIX Threads Library\n\
> -Copyright (C) 2021 Free Software Foundation, Inc.\n\
> -This is free software; see the source for copying conditions.\n\
> -There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n\
> -PARTICULAR PURPOSE.\n"
> -"Forced unwind support included.\n"
> -;
> -
> -
> -/* This is made the e_entry of libpthread.so by LDFLAGS-pthread.so.  */
> -__attribute__ ((noreturn))
> -void
> -__nptl_main (void)
> -{
> -  write (STDOUT_FILENO, banner, sizeof banner - 1);
> -  _exit (0);
> -}


Ok.

> diff --git a/sysdeps/arm/nptl-aeabi_unwind_cpp_pr1.c b/sysdeps/arm/nptl-aeabi_unwind_cpp_pr1.c
> deleted file mode 100644
> index 7b83522437..0000000000
> --- a/sysdeps/arm/nptl-aeabi_unwind_cpp_pr1.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <aeabi_unwind_cpp_pr1.c>

Ok.

> diff --git a/sysdeps/arm/nptl/Makefile b/sysdeps/arm/nptl/Makefile
> index 5e4905df2f..44154bff37 100644
> --- a/sysdeps/arm/nptl/Makefile
> +++ b/sysdeps/arm/nptl/Makefile
> @@ -20,9 +20,6 @@ gen-as-const-headers += tcb-offsets.sym
>  endif
>  
>  ifeq ($(subdir),nptl)
> -libpthread-sysdep_routines += nptl-aeabi_unwind_cpp_pr1
> -libpthread-shared-only-routines += nptl-aeabi_unwind_cpp_pr1
> -
>  # This test relies on compiling part of the binary with EH information,
>  # part without, and unwinding through.  The .ARM.exidx tables have
>  # start addresses for EH regions, but no end addresses.  Every

Ok.

> diff --git a/sysdeps/ia64/nptl/Makefile b/sysdeps/ia64/nptl/Makefile
> index d8a8fc44fe..d99cfd5b34 100644
> --- a/sysdeps/ia64/nptl/Makefile
> +++ b/sysdeps/ia64/nptl/Makefile
> @@ -18,8 +18,3 @@
>  ifeq ($(subdir),csu)
>  gen-as-const-headers += tcb-offsets.sym
>  endif
> -
> -ifeq ($(subdir),nptl)
> -libpthread-routines += sysdep
> -libpthread-shared-only-routines += sysdep
> -endif

Ok.

> diff --git a/sysdeps/mips/Makefile b/sysdeps/mips/Makefile
> index 6ad69e9ef9..19e6a57622 100644
> --- a/sysdeps/mips/Makefile
> +++ b/sysdeps/mips/Makefile
> @@ -17,11 +17,6 @@ CPPFLAGS-crti.S += $(pic-ccflag)
>  CPPFLAGS-crtn.S += $(pic-ccflag)
>  endif
>  
> -ifeq ($(subdir),nptl)
> -CPPFLAGS-pt-crti.S += $(pic-ccflag)
> -CPPFLAGS-crtn.S += $(pic-ccflag)
> -endif
> -
>  ASFLAGS-.os += $(pic-ccflag)
>  # libc.a and libc_p.a must be compiled with -fPIE/-fpie for static PIE.
>  ASFLAGS-.o += $(pie-default)

Ok.

> diff --git a/sysdeps/mips/nptl/Makefile b/sysdeps/mips/nptl/Makefile
> index 87ba580ec2..329a57a473 100644
> --- a/sysdeps/mips/nptl/Makefile
> +++ b/sysdeps/mips/nptl/Makefile
> @@ -18,8 +18,3 @@
>  ifeq ($(subdir),csu)
>  gen-as-const-headers += tcb-offsets.sym
>  endif
> -
> -ifeq ($(subdir),nptl)
> -libpthread-sysdep_routines += nptl-sysdep
> -libpthread-shared-only-routines += nptl-sysdep
> -endif

Ok.

> diff --git a/sysdeps/mips/nptl/nptl-sysdep.S b/sysdeps/mips/nptl/nptl-sysdep.S
> deleted file mode 100644
> index 3f5c2a364a..0000000000
> --- a/sysdeps/mips/nptl/nptl-sysdep.S
> +++ /dev/null
> @@ -1,2 +0,0 @@
> -/* Pull in __syscall_error.  */
> -#include <sysdep.S>

Ok.

> diff --git a/sysdeps/nptl/Makefile b/sysdeps/nptl/Makefile
> index 632cd3686b..0707f130eb 100644
> --- a/sysdeps/nptl/Makefile
> +++ b/sysdeps/nptl/Makefile
> @@ -16,10 +16,6 @@
>  # License along with the GNU C Library; if not, see
>  # <https://www.gnu.org/licenses/>.
>  
> -ifeq ($(subdir),nptl)
> -libpthread-sysdep_routines += errno-loc
> -endif
> -
>  ifeq ($(subdir),rt)
>  librt-sysdep_routines += timer_routines
>  

Ok.

> diff --git a/sysdeps/riscv/nptl/Makefile b/sysdeps/riscv/nptl/Makefile
> index 85ef9cf691..cca67db324 100644
> --- a/sysdeps/riscv/nptl/Makefile
> +++ b/sysdeps/riscv/nptl/Makefile
> @@ -19,8 +19,3 @@
>  ifeq ($(subdir),csu)
>  gen-as-const-headers += tcb-offsets.sym
>  endif
> -
> -ifeq ($(subdir),nptl)
> -libpthread-sysdep_routines += nptl-sysdep
> -libpthread-shared-only-routines += nptl-sysdep
> -endif

Ok.

> diff --git a/sysdeps/riscv/nptl/nptl-sysdep.S b/sysdeps/riscv/nptl/nptl-sysdep.S
> deleted file mode 100644
> index 3f5c2a364a..0000000000
> --- a/sysdeps/riscv/nptl/nptl-sysdep.S
> +++ /dev/null
> @@ -1,2 +0,0 @@
> -/* Pull in __syscall_error.  */
> -#include <sysdep.S>

Ok.

> diff --git a/sysdeps/s390/nptl/Makefile b/sysdeps/s390/nptl/Makefile
> index d8a8fc44fe..d99cfd5b34 100644
> --- a/sysdeps/s390/nptl/Makefile
> +++ b/sysdeps/s390/nptl/Makefile
> @@ -18,8 +18,3 @@
>  ifeq ($(subdir),csu)
>  gen-as-const-headers += tcb-offsets.sym
>  endif
> -
> -ifeq ($(subdir),nptl)
> -libpthread-routines += sysdep
> -libpthread-shared-only-routines += sysdep
> -endif

Ok.

> diff --git a/sysdeps/sparc/Makefile b/sysdeps/sparc/Makefile
> index c123b527b5..1be9a3db2c 100644
> --- a/sysdeps/sparc/Makefile
> +++ b/sysdeps/sparc/Makefile
> @@ -30,9 +30,5 @@ ifeq ($(subdir),nscd)
>  routines += cpu_relax
>  endif
>  
> -ifeq ($(subdir), nptl)
> -libpthread-routines += cpu_relax
> -endif
> -
>  # The assembler on SPARC needs the -fPIC flag even when it's assembler code.
>  ASFLAGS-.os += -fPIC

Ok.

> diff --git a/sysdeps/sparc/nptl/Makefile b/sysdeps/sparc/nptl/Makefile
> index 5372867dbd..81bddf688c 100644
> --- a/sysdeps/sparc/nptl/Makefile
> +++ b/sysdeps/sparc/nptl/Makefile
> @@ -1,8 +1,3 @@
>  ifeq ($(subdir),csu)
>  gen-as-const-headers += tcb-offsets.sym
>  endif
> -
> -ifeq ($(subdir),nptl)
> -CPPFLAGS-pt-crti.S += -fPIC
> -CPPFLAGS-crtn.S += -fPIC
> -endif

Ok.

> diff --git a/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist b/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
> index 14ada15a35..cebf7c6064 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
> @@ -1,4 +1,4 @@
> -GLIBC_2.17 __errno_location F
> +GLIBC_2.17 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/alpha/Makefile b/sysdeps/unix/sysv/linux/alpha/Makefile
> index 92484bbe65..d7c7d7fc16 100644
> --- a/sysdeps/unix/sysv/linux/alpha/Makefile
> +++ b/sysdeps/unix/sysv/linux/alpha/Makefile
> @@ -30,12 +30,6 @@ ifeq ($(subdir),math)
>  libm-routines += multc3 divtc3
>  endif   # math
>  
> -ifeq ($(subdir),nptl)
> -# pull in __syscall_error routine, sigaction stubs.
> -libpthread-routines += sysdep rt_sigaction
> -libpthread-shared-only-routines += sysdep rt_sigaction
> -endif
> -
>  ifeq ($(subdir),conform)
>  # For bug 21260.
>  conformtest-xfail-conds += alpha-linux

Ok.

> diff --git a/sysdeps/unix/sysv/linux/alpha/libpthread.abilist b/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
> index 47cbcf3baf..051caff7c0 100644
> --- a/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
> @@ -1,4 +1,4 @@
> -GLIBC_2.0 __errno_location F
> +GLIBC_2.0 __libpthread_version_placeholder F
>  GLIBC_2.1 __libpthread_version_placeholder F
>  GLIBC_2.1.1 __libpthread_version_placeholder F
>  GLIBC_2.1.2 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/arc/libpthread.abilist b/sysdeps/unix/sysv/linux/arc/libpthread.abilist
> index c4264810e6..cd90b49787 100644
> --- a/sysdeps/unix/sysv/linux/arc/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/arc/libpthread.abilist
> @@ -1 +1 @@
> -GLIBC_2.32 __errno_location F
> +GLIBC_2.32 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/arm/Makefile b/sysdeps/unix/sysv/linux/arm/Makefile
> index abdf01f00c..32db854cbd 100644
> --- a/sysdeps/unix/sysv/linux/arm/Makefile
> +++ b/sysdeps/unix/sysv/linux/arm/Makefile
> @@ -26,11 +26,6 @@ librt-sysdep_routines += libc-do-syscall
>  librt-shared-only-routines += libc-do-syscall
>  endif
>  
> -ifeq ($(subdir),nptl)
> -libpthread-sysdep_routines += libc-do-syscall
> -libpthread-shared-only-routines += libc-do-syscall
> -endif
> -
>  ifeq ($(subdir),resolv)
>  libanl-sysdep_routines += libc-do-syscall
>  libanl-shared-only-routines += libc-do-syscall

Ok.

> diff --git a/sysdeps/unix/sysv/linux/arm/be/libpthread.abilist b/sysdeps/unix/sysv/linux/arm/be/libpthread.abilist
> index f8ebb4cae2..1774f414c6 100644
> --- a/sysdeps/unix/sysv/linux/arm/be/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/be/libpthread.abilist
> @@ -4,5 +4,4 @@ GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
>  GLIBC_2.31 __libpthread_version_placeholder F
> -GLIBC_2.4 __errno_location F
>  GLIBC_2.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/arm/le/libpthread.abilist b/sysdeps/unix/sysv/linux/arm/le/libpthread.abilist
> index f8ebb4cae2..1774f414c6 100644
> --- a/sysdeps/unix/sysv/linux/arm/le/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/le/libpthread.abilist
> @@ -4,5 +4,4 @@ GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
>  GLIBC_2.31 __libpthread_version_placeholder F
> -GLIBC_2.4 __errno_location F
>  GLIBC_2.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/csky/libpthread.abilist b/sysdeps/unix/sysv/linux/csky/libpthread.abilist
> index f7649b87b2..8ce9efcbf8 100644
> --- a/sysdeps/unix/sysv/linux/csky/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/csky/libpthread.abilist
> @@ -1,3 +1,3 @@
> -GLIBC_2.29 __errno_location F
> +GLIBC_2.29 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
>  GLIBC_2.31 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/hppa/libpthread.abilist b/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
> index f1adf37ff2..35b6df4615 100644
> --- a/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
> @@ -1,7 +1,7 @@
>  GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
> -GLIBC_2.2 __errno_location F
> +GLIBC_2.2 __libpthread_version_placeholder F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
>  GLIBC_2.28 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/i386/Makefile b/sysdeps/unix/sysv/linux/i386/Makefile
> index da716e2c1b..26e0a8852b 100644
> --- a/sysdeps/unix/sysv/linux/i386/Makefile
> +++ b/sysdeps/unix/sysv/linux/i386/Makefile
> @@ -18,11 +18,6 @@ ifeq ($(subdir),io)
>  sysdep_routines += libc-do-syscall
>  endif
>  
> -ifeq ($(subdir),nptl)
> -libpthread-sysdep_routines += libc-do-syscall
> -libpthread-shared-only-routines += libc-do-syscall
> -endif
> -
>  ifeq ($(subdir),stdlib)
>  gen-as-const-headers += ucontext_i.sym
>  endif

Ok.

> @@ -36,12 +31,6 @@ CPPFLAGS-divdi3.c = -Din_divdi3_c
>  endif
>  endif
>  
> -ifeq ($(subdir),nptl)
> -# pull in __syscall_error routine
> -libpthread-routines += sysdep
> -libpthread-shared-only-routines += sysdep
> -endif
> -
>  ifeq ($(subdir),rt)
>  # pull in __syscall_error routine
>  librt-routines += sysdep

Ok.

> diff --git a/sysdeps/unix/sysv/linux/i386/libpthread.abilist b/sysdeps/unix/sysv/linux/i386/libpthread.abilist
> index 47cbcf3baf..051caff7c0 100644
> --- a/sysdeps/unix/sysv/linux/i386/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/i386/libpthread.abilist
> @@ -1,4 +1,4 @@
> -GLIBC_2.0 __errno_location F
> +GLIBC_2.0 __libpthread_version_placeholder F
>  GLIBC_2.1 __libpthread_version_placeholder F
>  GLIBC_2.1.1 __libpthread_version_placeholder F
>  GLIBC_2.1.2 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/ia64/libpthread.abilist b/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
> index f1adf37ff2..35b6df4615 100644
> --- a/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
> @@ -1,7 +1,7 @@
>  GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
> -GLIBC_2.2 __errno_location F
> +GLIBC_2.2 __libpthread_version_placeholder F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
>  GLIBC_2.28 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
> index f8ebb4cae2..1774f414c6 100644
> --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
> @@ -4,5 +4,4 @@ GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
>  GLIBC_2.31 __libpthread_version_placeholder F
> -GLIBC_2.4 __errno_location F
>  GLIBC_2.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
> index 47cbcf3baf..051caff7c0 100644
> --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
> @@ -1,4 +1,4 @@
> -GLIBC_2.0 __errno_location F
> +GLIBC_2.0 __libpthread_version_placeholder F
>  GLIBC_2.1 __libpthread_version_placeholder F
>  GLIBC_2.1.1 __libpthread_version_placeholder F
>  GLIBC_2.1.2 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/Makefile b/sysdeps/unix/sysv/linux/microblaze/Makefile
> index d178bc6f34..614553204f 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/Makefile
> +++ b/sysdeps/unix/sysv/linux/microblaze/Makefile
> @@ -1,9 +1,3 @@
>  ifeq ($(subdir),resource)
>  sysdep_routines += backtrace_linux
>  endif
> -
> -ifeq ($(subdir),nptl)
> -# pull in __syscall_error routine
> -libpthread-routines += sysdep
> -libpthread-shared-only-routines += sysdep
> -endif

Ok.

> diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist
> index c99c8b026c..419561d3ce 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist
> @@ -1,4 +1,4 @@
> -GLIBC_2.18 __errno_location F
> +GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
>  GLIBC_2.31 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist
> index c99c8b026c..419561d3ce 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist
> @@ -1,4 +1,4 @@
> -GLIBC_2.18 __errno_location F
> +GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
>  GLIBC_2.31 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
> index 2d0b9e3542..eac5591410 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
> @@ -1,4 +1,4 @@
> -GLIBC_2.0 __errno_location F
> +GLIBC_2.0 __libpthread_version_placeholder F
>  GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
> index 2d0b9e3542..eac5591410 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
> @@ -1,4 +1,4 @@
> -GLIBC_2.0 __errno_location F
> +GLIBC_2.0 __libpthread_version_placeholder F
>  GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/nios2/libpthread.abilist b/sysdeps/unix/sysv/linux/nios2/libpthread.abilist
> index 4d8ff6a262..714dfd90aa 100644
> --- a/sysdeps/unix/sysv/linux/nios2/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/nios2/libpthread.abilist
> @@ -1,4 +1,4 @@
> -GLIBC_2.21 __errno_location F
> +GLIBC_2.21 __libpthread_version_placeholder F
>  GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
>  GLIBC_2.31 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/Makefile b/sysdeps/unix/sysv/linux/powerpc/Makefile
> index 06f1328fab..733557ba13 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/Makefile
> +++ b/sysdeps/unix/sysv/linux/powerpc/Makefile
> @@ -25,8 +25,3 @@ tests += $(tests-static)
>  tests += test-gettimebasefreq
>  tests += test-powerpc-linux-sysconf
>  endif
> -
> -ifeq ($(subdir),nptl)
> -libpthread-routines += sysdep
> -libpthread-shared-only-routines += sysdep
> -endif

Ok.

> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
> index e545bcc56c..5623c6a313 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
> @@ -1,4 +1,4 @@
> -GLIBC_2.0 __errno_location F
> +GLIBC_2.0 __libpthread_version_placeholder F
>  GLIBC_2.1 __libpthread_version_placeholder F
>  GLIBC_2.1.1 __libpthread_version_placeholder F
>  GLIBC_2.1.2 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
> index e10c836946..3246752fdd 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
> @@ -2,7 +2,7 @@ GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.28 __libpthread_version_placeholder F
> -GLIBC_2.3 __errno_location F
> +GLIBC_2.3 __libpthread_version_placeholder F
>  GLIBC_2.3.2 __libpthread_version_placeholder F
>  GLIBC_2.3.3 __libpthread_version_placeholder F
>  GLIBC_2.3.4 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
> index 14ada15a35..cebf7c6064 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
> @@ -1,4 +1,4 @@
> -GLIBC_2.17 __errno_location F
> +GLIBC_2.17 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist
> index 73188776b6..d8835698d8 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv32/libpthread.abilist
> @@ -1 +1 @@
> -GLIBC_2.33 __errno_location F
> +GLIBC_2.33 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
> index 35a6a20935..fb241212a5 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
> @@ -1,4 +1,4 @@
> -GLIBC_2.27 __errno_location F
> +GLIBC_2.27 __libpthread_version_placeholder F
>  GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
>  GLIBC_2.31 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
> index ac212e942a..40ce2f1fbd 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
> @@ -1,4 +1,4 @@
> -GLIBC_2.0 __errno_location F
> +GLIBC_2.0 __libpthread_version_placeholder F
>  GLIBC_2.1 __libpthread_version_placeholder F
>  GLIBC_2.1.1 __libpthread_version_placeholder F
>  GLIBC_2.1.2 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
> index e0feab34d5..08ef7c4283 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
> @@ -2,7 +2,7 @@ GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.19 __libpthread_version_placeholder F
> -GLIBC_2.2 __errno_location F
> +GLIBC_2.2 __libpthread_version_placeholder F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
>  GLIBC_2.28 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/sh/be/libpthread.abilist b/sysdeps/unix/sysv/linux/sh/be/libpthread.abilist
> index f1adf37ff2..35b6df4615 100644
> --- a/sysdeps/unix/sysv/linux/sh/be/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/be/libpthread.abilist
> @@ -1,7 +1,7 @@
>  GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
> -GLIBC_2.2 __errno_location F
> +GLIBC_2.2 __libpthread_version_placeholder F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
>  GLIBC_2.28 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/sh/le/libpthread.abilist b/sysdeps/unix/sysv/linux/sh/le/libpthread.abilist
> index f1adf37ff2..35b6df4615 100644
> --- a/sysdeps/unix/sysv/linux/sh/le/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/le/libpthread.abilist
> @@ -1,7 +1,7 @@
>  GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
> -GLIBC_2.2 __errno_location F
> +GLIBC_2.2 __libpthread_version_placeholder F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
>  GLIBC_2.28 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/sparc/Makefile b/sysdeps/unix/sysv/linux/sparc/Makefile
> index 1475039677..e0056c9413 100644
> --- a/sysdeps/unix/sysv/linux/sparc/Makefile
> +++ b/sysdeps/unix/sysv/linux/sparc/Makefile
> @@ -14,9 +14,3 @@ endif
>  ifeq ($(subdir),signal)
>  sysdep_routines += sigreturn_stub
>  endif
> -
> -ifeq ($(subdir),nptl)
> -# pull in __syscall_error routine
> -libpthread-routines += sysdep sigreturn_stub
> -libpthread-shared-only-routines += sysdep sigreturn_stub
> -endif

Ok.

> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
> index 47cbcf3baf..051caff7c0 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
> @@ -1,4 +1,4 @@
> -GLIBC_2.0 __errno_location F
> +GLIBC_2.0 __libpthread_version_placeholder F
>  GLIBC_2.1 __libpthread_version_placeholder F
>  GLIBC_2.1.1 __libpthread_version_placeholder F
>  GLIBC_2.1.2 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
> index f1adf37ff2..35b6df4615 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
> @@ -1,7 +1,7 @@
>  GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
> -GLIBC_2.2 __errno_location F
> +GLIBC_2.2 __libpthread_version_placeholder F
>  GLIBC_2.2.3 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
>  GLIBC_2.28 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
> index ec4e3c0ecd..c94ae208cb 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
> @@ -1,7 +1,7 @@
>  GLIBC_2.11 __libpthread_version_placeholder F
>  GLIBC_2.12 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
> -GLIBC_2.2.5 __errno_location F
> +GLIBC_2.2.5 __libpthread_version_placeholder F
>  GLIBC_2.2.6 __libpthread_version_placeholder F
>  GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.3.2 __libpthread_version_placeholder F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
> index cc6e073a11..38308e4ca7 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
> @@ -1,4 +1,4 @@
> -GLIBC_2.16 __errno_location F
> +GLIBC_2.16 __libpthread_version_placeholder F
>  GLIBC_2.18 __libpthread_version_placeholder F
>  GLIBC_2.28 __libpthread_version_placeholder F
>  GLIBC_2.30 __libpthread_version_placeholder F
> 

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 08/10] elf: Do not load libpthread for PTHREAD_IN_LIBC
  2021-05-18 14:25 ` [PATCH 08/10] elf: Do not load libpthread for PTHREAD_IN_LIBC Florian Weimer
@ 2021-05-20 20:53   ` Adhemerval Zanella
  2021-05-21 19:15     ` Florian Weimer
  0 siblings, 1 reply; 47+ messages in thread
From: Adhemerval Zanella @ 2021-05-20 20:53 UTC (permalink / raw)
  To: Florian Weimer, libc-alpha, H.J. Lu

I am not sure about this change, is this required to load old shared
libraries or binaries with libpthread as DT_NEEDED? 

I would prefer if we add an orthogonal way by providing a dummy 
libpthread.so in such cases instead of adding this ad-hoc solution 
to loader.  Maybe it would even be possible to hack a dummy libpthread.so
that results in no runtime overhead. 

On 18/05/2021 11:25, Florian Weimer via Libc-alpha wrote:
> ---
>  elf/dl-load.c    | 19 +++++++++++++++++--
>  elf/dl-version.c |  9 +++++++++
>  2 files changed, 26 insertions(+), 2 deletions(-)
> 
> diff --git a/elf/dl-load.c b/elf/dl-load.c
> index 918ec7546c..f97cb140f4 100644
> --- a/elf/dl-load.c
> +++ b/elf/dl-load.c
> @@ -2029,12 +2029,26 @@ open_path (const char *name, size_t namelen, int mode,
>  
>  /* Map in the shared object file NAME.  */
>  
> +static inline const char *
> +object_real_name (const char *name)
> +{
> +  /* If libpthread is integrated into libc, treat a request to load
> +     libpthread as a request to load libc (because libc was a
> +     dependency of libpthread).  */
> +#if PTHREAD_IN_LIBC
> +  if (strcmp (name, LIBPTHREAD_SO) == 0)
> +    return LIBC_SO;
> +#endif
> +  return name;
> +}
> +
>  struct link_map *
>  _dl_map_object (struct link_map *loader, const char *name,
>  		int type, int trace_mode, int mode, Lmid_t nsid)
>  {
>    int fd;
>    const char *origname = NULL;
> +  const char *implementation_name = object_real_name (name);
>    char *realname;
>    char *name_copy;
>    struct link_map *l;
> @@ -2051,7 +2065,7 @@ _dl_map_object (struct link_map *loader, const char *name,
>  	 yet been opened.  */
>        if (__glibc_unlikely ((l->l_faked | l->l_removed) != 0))
>  	continue;
> -      if (!_dl_name_match_p (name, l))
> +      if (!_dl_name_match_p (implementation_name, l))
>  	{
>  	  const char *soname;
>  
> @@ -2061,7 +2075,7 @@ _dl_map_object (struct link_map *loader, const char *name,
>  
>  	  soname = ((const char *) D_PTR (l, l_info[DT_STRTAB])
>  		    + l->l_info[DT_SONAME]->d_un.d_val);
> -	  if (strcmp (name, soname) != 0)
> +	  if (strcmp (implementation_name, soname) != 0)
>  	    continue;
>  
>  	  /* We have a match on a new name -- cache it.  */
> @@ -2106,6 +2120,7 @@ _dl_map_object (struct link_map *loader, const char *name,
>  		  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
>  		    _dl_debug_printf ("audit changed filename %s -> %s\n",
>  				      before, name);
> +		  implementation_name = object_real_name (name);
>  
>  		  if (origname == NULL)
>  		    origname = before;
> diff --git a/elf/dl-version.c b/elf/dl-version.c
> index 914955c2a8..932cffda09 100644
> --- a/elf/dl-version.c
> +++ b/elf/dl-version.c
> @@ -24,6 +24,7 @@
>  #include <string.h>
>  #include <ldsodefs.h>
>  #include <_itoa.h>
> +#include <gnu/lib-names.h>
>  
>  #include <assert.h>
>  
> @@ -200,6 +201,14 @@ _dl_check_map_versions (struct link_map *map, int verbose, int trace_mode)
>  	  ElfW(Vernaux) *aux;
>  	  struct link_map *needed = find_needed (strtab + ent->vn_file, map);
>  
> +#if PTHREAD_IN_LIBC
> +	  /* With an integrated libpthread, check libpthread
> +	     references against libc instead.  */
> +	  if (needed == NULL
> +	      && strcmp (strtab + ent->vn_file, LIBPTHREAD_SO) == 0)
> +	    needed = find_needed (LIBC_SO, map);
> +#endif
> +
>  	  /* If NEEDED is NULL this means a dependency was not found
>  	     and no stub entry was created.  This should never happen.  */
>  	  assert (needed != NULL);
> 

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 01/10] nptl: Perform signal initialization upon pthread_create
  2021-05-20 20:32           ` Adhemerval Zanella
@ 2021-05-21  9:58             ` Florian Weimer
  2021-05-21 11:31               ` Adhemerval Zanella
  0 siblings, 1 reply; 47+ messages in thread
From: Florian Weimer @ 2021-05-21  9:58 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha

* Adhemerval Zanella:

>>> Bu the main advantage is to move the cancellation code logically when
>>> it is actually used, and it is small improvement on both static
>>> linking (since the static code will be used solely is cancellation is
>>> used) and on runtime (since sigaction will be set only if pthread_cancel
>>> is called).
>> 
>> Okay, I can prepare a version along these lines.  But in general, I
>> consider less data and fewer conditionals an improvement.
>
> Thanks.

Unfortunately, it does not work with the present implementation.

sysdeps/unix/sysv/linux/createthread.c contains this:

	      /* The operation failed.  We have to kill the thread.
		 We let the normal cancellation mechanism do the work.  */

	      pid_t pid = __getpid ();
	      INTERNAL_SYSCALL_CALL (tgkill, pid, pd->tid, SIGCANCEL);

This obviously needs a working SIGCANCEL handler, so pthread_create and
pthread_cancel are not as separate as we thought.

So I think we should go with my original version for the time being.  We
can switch to lazy initialization if we implement a different way for
handling late thread creation failure.

SIG_IGN handler disposition should not affect timer_create (which uses
SIGCANCEL internally) because sigwaitinfo still wakes up on such
signals.

Thanks,
Florian


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 01/10] nptl: Perform signal initialization upon pthread_create
  2021-05-21  9:58             ` Florian Weimer
@ 2021-05-21 11:31               ` Adhemerval Zanella
  2021-05-21 12:40                 ` Adhemerval Zanella
  0 siblings, 1 reply; 47+ messages in thread
From: Adhemerval Zanella @ 2021-05-21 11:31 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha



On 21/05/2021 06:58, Florian Weimer wrote:
> * Adhemerval Zanella:
> 
>>>> Bu the main advantage is to move the cancellation code logically when
>>>> it is actually used, and it is small improvement on both static
>>>> linking (since the static code will be used solely is cancellation is
>>>> used) and on runtime (since sigaction will be set only if pthread_cancel
>>>> is called).
>>>
>>> Okay, I can prepare a version along these lines.  But in general, I
>>> consider less data and fewer conditionals an improvement.
>>
>> Thanks.
> 
> Unfortunately, it does not work with the present implementation.
> 
> sysdeps/unix/sysv/linux/createthread.c contains this:
> 
> 	      /* The operation failed.  We have to kill the thread.
> 		 We let the normal cancellation mechanism do the work.  */
> 
> 	      pid_t pid = __getpid ();
> 	      INTERNAL_SYSCALL_CALL (tgkill, pid, pd->tid, SIGCANCEL);
> 
> This obviously needs a working SIGCANCEL handler, so pthread_create and
> pthread_cancel are not as separate as we thought.

We can use __libc_signal_block_app on pthread_create instead of
__libc_signal_block_all and call __pthread_cancel on createthread.  The
SIGCANCEL is internal, so the race condition should not happen (assuming
well behave programs).  The pthread_cancel call on createthread can then
enable the signal.

> 
> So I think we should go with my original version for the time being.  We
> can switch to lazy initialization if we implement a different way for
> handling late thread creation failure.

Alright, I think we can change it later.

> 
> SIG_IGN handler disposition should not affect timer_create (which uses
> SIGCANCEL internally) because sigwaitinfo still wakes up on such
> signals.
> 
> Thanks,
> Florian
> 

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 01/10] nptl: Perform signal initialization upon pthread_create
  2021-05-21 11:31               ` Adhemerval Zanella
@ 2021-05-21 12:40                 ` Adhemerval Zanella
  0 siblings, 0 replies; 47+ messages in thread
From: Adhemerval Zanella @ 2021-05-21 12:40 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha



On 21/05/2021 08:31, Adhemerval Zanella wrote:
> 
> 
> On 21/05/2021 06:58, Florian Weimer wrote:
>> * Adhemerval Zanella:
>>
>>>>> Bu the main advantage is to move the cancellation code logically when
>>>>> it is actually used, and it is small improvement on both static
>>>>> linking (since the static code will be used solely is cancellation is
>>>>> used) and on runtime (since sigaction will be set only if pthread_cancel
>>>>> is called).
>>>>
>>>> Okay, I can prepare a version along these lines.  But in general, I
>>>> consider less data and fewer conditionals an improvement.
>>>
>>> Thanks.
>>
>> Unfortunately, it does not work with the present implementation.
>>
>> sysdeps/unix/sysv/linux/createthread.c contains this:
>>
>> 	      /* The operation failed.  We have to kill the thread.
>> 		 We let the normal cancellation mechanism do the work.  */
>>
>> 	      pid_t pid = __getpid ();
>> 	      INTERNAL_SYSCALL_CALL (tgkill, pid, pd->tid, SIGCANCEL);
>>
>> This obviously needs a working SIGCANCEL handler, so pthread_create and
>> pthread_cancel are not as separate as we thought.
> 
> We can use __libc_signal_block_app on pthread_create instead of
> __libc_signal_block_all and call __pthread_cancel on createthread.  The
> SIGCANCEL is internal, so the race condition should not happen (assuming
> well behave programs).  The pthread_cancel call on createthread can then
> enable the signal.

Ok, I didn't realize the current approach does require the SIGCANCEL
handler to be active so and invalid affinity mask or scheduler can
cancel the thread execution.

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 08/10] elf: Do not load libpthread for PTHREAD_IN_LIBC
  2021-05-20 20:53   ` Adhemerval Zanella
@ 2021-05-21 19:15     ` Florian Weimer
  0 siblings, 0 replies; 47+ messages in thread
From: Florian Weimer @ 2021-05-21 19:15 UTC (permalink / raw)
  To: Adhemerval Zanella via Libc-alpha

* Adhemerval Zanella via Libc-alpha:

> I am not sure about this change, is this required to load old shared
> libraries or binaries with libpthread as DT_NEEDED? 
>
> I would prefer if we add an orthogonal way by providing a dummy 
> libpthread.so in such cases instead of adding this ad-hoc solution 
> to loader.  Maybe it would even be possible to hack a dummy libpthread.so
> that results in no runtime overhead.

Yes, Andreas and H.J. argued for the same thing.  The new series
implements that.

Thanks,
Florian


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 09/10] elf: Add facility to create stub DSOs in elf/stub-dsos
  2021-05-18 14:25 ` [PATCH 09/10] elf: Add facility to create stub DSOs in elf/stub-dsos Florian Weimer
@ 2021-05-24 18:24   ` Adhemerval Zanella
  2021-05-24 18:25     ` Adhemerval Zanella
  0 siblings, 1 reply; 47+ messages in thread
From: Adhemerval Zanella @ 2021-05-24 18:24 UTC (permalink / raw)
  To: Florian Weimer, libc-alpha



On 18/05/2021 11:25, Florian Weimer via Libc-alpha wrote:
> And reference the elf/stub-dsos directory when linking installed
> programs.

So if I understood correctly, this is to trigger an invalid runtime
to avoid linking against system GLIBC_PRIVATE symbols, right?

I am not sure I fully understand the lib-stub trick here, how
exactly the lib-stub is preventing the wrong linkage here? And why
is this required for the libpthread move (my feeling this is orthogonal
to the project).

> ---
>  Makeconfig     | 10 ++++++++--
>  elf/Makefile   | 18 +++++++++++++++++-
>  elf/lib-stub.S | 22 ++++++++++++++++++++++
>  3 files changed, 47 insertions(+), 3 deletions(-)
>  create mode 100644 elf/lib-stub.S
> 
> diff --git a/Makeconfig b/Makeconfig
> index 1d5e45926c..3ef71cc02b 100644
> --- a/Makeconfig
> +++ b/Makeconfig
> @@ -425,7 +425,8 @@ ifndef +link-pie
>  	     $(link-extra-libs)
>  +link-pie-after-libc = $(+postctorS) $(+postinit)
>  define +link-pie
> -$(CC) $(link-libc-rpath-link) $(+link-pie-before-libc) $(rtld-LDFLAGS) \
> +$(CC) $(link-libc-rpath-link)$(rpath-link-stubs) \
> +  $(+link-pie-before-libc) $(rtld-LDFLAGS) \
>    $(link-extra-flags) $(link-libc) $(+link-pie-after-libc)
>  $(call after-link,$@)
>  endef

Ok.

> @@ -487,7 +488,8 @@ else  # not build-pie-default
>  	      $(link-extra-libs)
>  +link-after-libc = $(+postctor) $(+postinit)
>  define +link
> -$(CC) $(link-libc-rpath-link) $(+link-before-libc) $(rtld-LDFLAGS) \
> +$(CC) $(link-libc-rpath-link)$(rpath-link-stubs) \
> +  $(+link-before-libc) $(rtld-LDFLAGS) \
>    $(link-extra-flags) $(link-libc) $(+link-after-libc)
>  $(call after-link,$@)
>  endef
> @@ -581,6 

Ok.

+583,10 @@ link-libc-printers-tests = $(link-libc-rpath) \
>  rpath-dirs = math elf dlfcn nss nis rt resolv mathvec support
>  rpath-link = \
>  $(common-objdir):$(subst $(empty) ,:,$(patsubst ../$(subdir),.,$(rpath-dirs:%=$(common-objpfx)%)))
> +
> +# See $(elf-stub-dso-files) in elf/Makefile.
> +rpath-link-stubs=:$(common-objdir)/elf/stub-dsos
> +
>  else  # build-static
>  link-libc = $(common-objpfx)libc.a $(otherlibs) $(gnulib) $(common-objpfx)libc.a $(gnulib)
>  link-libc-tests = $(common-objpfx)libc.a $(otherlibs) $(gnulib-tests) $(common-objpfx)libc.a $(gnulib-tests)

Ok.

> diff --git a/elf/Makefile b/elf/Makefile
> index 834ec858a8..5f179bae19 100644
> --- a/elf/Makefile
> +++ b/elf/Makefile
> @@ -505,7 +505,23 @@ ifeq (yes,$(build-shared))
>  # to run programs during the `make others' pass.
>  lib-noranlib: $(objpfx)$(rtld-installed-name) \
>  	      $(addprefix $(objpfx),$(extra-objs))
> -endif
> +
> +# The system may have installed DSO that no longer exist as separate
> +# DSOs in the current glibc version.  The link editor will try to
> +# resolve versioned GLIBC_PRIVATE symbol references in them against
> +# libc.so, but these exports do not exist anymore.  Supplying these
> +# stub DSOs in a directory searched by -rpath-link prevents the link
> +# editor from picking up the installed system files.
> +ifneq ($(strip $(elf-stub-dsos)),)
> +elf-stub-dso-files :=\
> +$(foreach L,$(elf-stub-dsos),$(objpfx)/stub-dsos/lib$L.so$(lib$L.so-version))
> +$(elf-stub-dso-files): lib-stub.S
> +	$(make-target-directory)
> +	$(LINK.o) -shared -o $@ -B$(csu-objpfx) $(LDFLAGS.so) \
> +	  -Wl,-soname=$(@F) -nostdlib $<
> +subdir_lib: $(elf-stub-dso-files)
> +endif # $(elf-stub-dsos)
> +endif # $(build-shared)
>  
>  # Command to link into a larger single relocatable object.
>  reloc-link = $(LINK.o) -nostdlib -nostartfiles -r
> diff --git a/elf/lib-stub.S b/elf/lib-stub.S
> new file mode 100644
> index 0000000000..2b5ae2010e
> --- /dev/null
> +++ b/elf/lib-stub.S
> @@ -0,0 +1,22 @@
> +/* Assembler source file for creating stub libraries.
> +   Copyright (C) 2021 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +	/* Produce an invalid init function, so that loading the stub
> +	   crashes.  */
> +	.section .init_array,"a",%init_array
> +	.dc.a 4096
> 

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [PATCH 09/10] elf: Add facility to create stub DSOs in elf/stub-dsos
  2021-05-24 18:24   ` Adhemerval Zanella
@ 2021-05-24 18:25     ` Adhemerval Zanella
  0 siblings, 0 replies; 47+ messages in thread
From: Adhemerval Zanella @ 2021-05-24 18:25 UTC (permalink / raw)
  To: Florian Weimer, libc-alpha



On 24/05/2021 15:24, Adhemerval Zanella wrote:
> 
> 
> On 18/05/2021 11:25, Florian Weimer via Libc-alpha wrote:
>> And reference the elf/stub-dsos directory when linking installed
>> programs.
> 
> So if I understood correctly, this is to trigger an invalid runtime
> to avoid linking against system GLIBC_PRIVATE symbols, right?
> 
> I am not sure I fully understand the lib-stub trick here, how
> exactly the lib-stub is preventing the wrong linkage here? And why
> is this required for the libpthread move (my feeling this is orthogonal
> to the project).

Nevermind, I am not sure why I replied to the older version of the
patchset.

^ permalink raw reply	[flat|nested] 47+ messages in thread

end of thread, other threads:[~2021-05-24 18:25 UTC | newest]

Thread overview: 47+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-18 14:24 [PATCH 00/10] nptl: Complete libpthread removal Florian Weimer
2021-05-18 14:24 ` [PATCH 01/10] nptl: Perform signal initialization upon pthread_create Florian Weimer
2021-05-20 19:15   ` Adhemerval Zanella
2021-05-20 19:41     ` Florian Weimer
2021-05-20 19:57       ` Adhemerval Zanella
2021-05-20 20:05         ` Florian Weimer
2021-05-20 20:32           ` Adhemerval Zanella
2021-05-21  9:58             ` Florian Weimer
2021-05-21 11:31               ` Adhemerval Zanella
2021-05-21 12:40                 ` Adhemerval Zanella
2021-05-18 14:24 ` [PATCH 02/10] nptl: Eliminate the __static_tls_size, __static_tls_align_m1 variables Florian Weimer
2021-05-18 14:25 ` [PATCH 03/10] nptl: Move semi-public __pthread_get_minstack symbol into libc Florian Weimer
2021-05-18 14:25 ` [PATCH 04/10] elf: Use custom NODELETE DSO for tst-dlopenfail, tst-dlopenfail-2 Florian Weimer
2021-05-20 20:36   ` Adhemerval Zanella
2021-05-18 14:25 ` [PATCH 05/10] nptl: Move pthread_create, thrd_create into libc Florian Weimer
2021-05-20 20:44   ` Adhemerval Zanella
2021-05-18 14:25 ` [PATCH 06/10] nptl: Remove unused __libc_pthread_init function Florian Weimer
2021-05-18 14:49   ` Andreas Schwab
2021-05-18 14:25 ` [PATCH 07/10] nptl: Remove remaining code from libpthread Florian Weimer
2021-05-20 20:49   ` Adhemerval Zanella
2021-05-18 14:25 ` [PATCH 08/10] elf: Do not load libpthread for PTHREAD_IN_LIBC Florian Weimer
2021-05-20 20:53   ` Adhemerval Zanella
2021-05-21 19:15     ` Florian Weimer
2021-05-18 14:25 ` [PATCH 09/10] elf: Add facility to create stub DSOs in elf/stub-dsos Florian Weimer
2021-05-24 18:24   ` Adhemerval Zanella
2021-05-24 18:25     ` Adhemerval Zanella
2021-05-18 14:25 ` [PATCH 10/10] nptl: Stop building libpthread Florian Weimer
2021-05-18 14:56 ` [PATCH 00/10] nptl: Complete libpthread removal Andreas Schwab
2021-05-18 15:04   ` Florian Weimer
2021-05-18 15:26     ` Andreas Schwab
2021-05-18 15:51       ` Florian Weimer
2021-05-18 16:27         ` Andreas Schwab
2021-05-18 16:31           ` Florian Weimer
2021-05-18 16:47             ` Andreas Schwab
2021-05-20 13:27               ` Florian Weimer
2021-05-20 13:50                 ` Andreas Schwab
2021-05-20 13:54                   ` Florian Weimer
2021-05-20 14:01                     ` Andreas Schwab
2021-05-20 15:09                     ` H.J. Lu
2021-05-20 15:13                       ` Florian Weimer
2021-05-20 15:17                       ` Andreas Schwab
2021-05-20 15:35                         ` H.J. Lu
2021-05-20 15:39                           ` Florian Weimer
2021-05-20 15:57                             ` H.J. Lu
2021-05-19 11:57 ` Szabolcs Nagy
2021-05-19 12:35   ` Florian Weimer
2021-05-19 13:14     ` Szabolcs Nagy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).