a2cf7d
commit 41d6f74e6cb6a92ab428c11ee1e408b2a16aa1b0
a2cf7d
Author: Florian Weimer <fweimer@redhat.com>
a2cf7d
Date:   Tue Jul 2 15:12:20 2019 +0200
a2cf7d
a2cf7d
    nptl: Remove vfork IFUNC-based forwarder from libpthread [BZ #20188]
a2cf7d
    
a2cf7d
    With commit f0b2132b35248c1f4a80f62a2c38cddcc802aa8c ("ld.so:
a2cf7d
    Support moving versioned symbols between sonames [BZ #24741]"), the
a2cf7d
    dynamic linker will find the definition of vfork in libc and binds
a2cf7d
    a vfork reference to that symbol, even if the soname in the version
a2cf7d
    reference says that the symbol should be located in libpthread.
a2cf7d
    
a2cf7d
    As a result, the forwarder (whether it's IFUNC-based or a duplicate
a2cf7d
    of the libc implementation) is no longer necessary.
a2cf7d
    
a2cf7d
    On older architectures, a placeholder symbol is required, to make sure
a2cf7d
    that the GLIBC_2.1.2 symbol version does not go away, or is turned in
a2cf7d
    to a weak symbol definition by the link editor.  (The symbol version
a2cf7d
    needs to preserved so that the symbol coverage check in
a2cf7d
    elf/dl-version.c does not fail for old binaries.)
a2cf7d
    
a2cf7d
    mips32 is an outlier: It defined __vfork@@GLIBC_2.2, but the
a2cf7d
    baseline is GLIBC_2.0.  Since there are other @@GLIBC_2.2 symbols,
a2cf7d
    the placeholder symbol is not needed there.
a2cf7d
a2cf7d
Conflicts:
a2cf7d
	nptl/Makefile
a2cf7d
	  (Missing lll_timedwait_tid removal, missing pthread_mutex_conf.)
a2cf7d
	nptl/pt-vfork.c
a2cf7d
	sysdeps/unix/sysv/linux/aarch64/pt-vfork.c
a2cf7d
	sysdeps/unix/sysv/linux/alpha/pt-vfork.S
a2cf7d
	sysdeps/unix/sysv/linux/hppa/pt-vfork.S
a2cf7d
	sysdeps/unix/sysv/linux/ia64/pt-vfork.S
a2cf7d
	sysdeps/unix/sysv/linux/microblaze/pt-vfork.S
a2cf7d
	  (Removal after copyright year change upstream.)
a2cf7d
a2cf7d
diff --git a/nptl/Makefile b/nptl/Makefile
a2cf7d
index 071c53866d14d2fe..447dce0590295c9c 100644
a2cf7d
--- a/nptl/Makefile
a2cf7d
+++ b/nptl/Makefile
a2cf7d
@@ -121,7 +121,7 @@ libpthread-routines = nptl-init nptlfreeres vars events version pt-interp \
a2cf7d
 		      cancellation \
a2cf7d
 		      lowlevellock \
a2cf7d
 		      lll_timedlock_wait lll_timedwait_tid \
a2cf7d
-		      pt-fork pt-vfork pt-fcntl \
a2cf7d
+		      pt-fork pt-fcntl \
a2cf7d
 		      $(pthread-compat-wrappers) \
a2cf7d
 		      pt-raise pt-system \
a2cf7d
 		      flockfile ftrylockfile funlockfile \
a2cf7d
@@ -145,7 +145,8 @@ libpthread-routines = nptl-init nptlfreeres vars events version pt-interp \
a2cf7d
 		      mtx_destroy mtx_init mtx_lock mtx_timedlock \
a2cf7d
 		      mtx_trylock mtx_unlock call_once cnd_broadcast \
a2cf7d
 		      cnd_destroy cnd_init cnd_signal cnd_timedwait cnd_wait \
a2cf7d
-		      tss_create tss_delete tss_get tss_set
a2cf7d
+		      tss_create tss_delete tss_get tss_set \
a2cf7d
+		      libpthread-compat
a2cf7d
 #		      pthread_setuid pthread_seteuid pthread_setreuid \
a2cf7d
 #		      pthread_setresuid \
a2cf7d
 #		      pthread_setgid pthread_setegid pthread_setregid \
a2cf7d
diff --git a/nptl/Versions b/nptl/Versions
a2cf7d
index e7f691da7a15e9c3..6007fd03e7ed117c 100644
a2cf7d
--- a/nptl/Versions
a2cf7d
+++ b/nptl/Versions
a2cf7d
@@ -36,7 +36,6 @@ libc {
a2cf7d
     __libc_alloca_cutoff;
a2cf7d
     # Internal libc interface to libpthread
a2cf7d
     __libc_dl_error_tsd;
a2cf7d
-    __libc_vfork;
a2cf7d
     __libc_pthread_init;
a2cf7d
     __libc_current_sigrtmin_private; __libc_current_sigrtmax_private;
a2cf7d
     __libc_allocate_rtsig_private;
a2cf7d
@@ -98,7 +97,7 @@ libpthread {
a2cf7d
     sem_destroy; sem_getvalue; sem_init; sem_post; sem_trywait; sem_wait;
a2cf7d
 
a2cf7d
     # Special fork handling.
a2cf7d
-    fork; __fork; vfork;
a2cf7d
+    fork; __fork;
a2cf7d
 
a2cf7d
     # Cancellation points.
a2cf7d
     close; __close; fcntl; __fcntl; read; __read; write; __write; accept;
a2cf7d
@@ -152,7 +151,7 @@ libpthread {
a2cf7d
   }
a2cf7d
 
a2cf7d
   GLIBC_2.1.2 {
a2cf7d
-    __vfork;
a2cf7d
+    __libpthread_version_placeholder;
a2cf7d
   }
a2cf7d
 
a2cf7d
   GLIBC_2.2 {
a2cf7d
diff --git a/nptl/libpthread-compat.c b/nptl/libpthread-compat.c
a2cf7d
new file mode 100644
a2cf7d
index 0000000000000000..ea29e9f47b698a25
a2cf7d
--- /dev/null
a2cf7d
+++ b/nptl/libpthread-compat.c
a2cf7d
@@ -0,0 +1,37 @@
a2cf7d
+/* Placeholder definitions to pull in removed symbol versions.
a2cf7d
+   Copyright (C) 2019 Free Software Foundation, Inc.
a2cf7d
+   This file is part of the GNU C Library.
a2cf7d
+
a2cf7d
+   The GNU C Library is free software; you can redistribute it and/or
a2cf7d
+   modify it under the terms of the GNU Lesser General Public
a2cf7d
+   License as published by the Free Software Foundation; either
a2cf7d
+   version 2.1 of the License, or (at your option) any later version.
a2cf7d
+
a2cf7d
+   The GNU C Library is distributed in the hope that it will be useful,
a2cf7d
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
a2cf7d
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
a2cf7d
+   Lesser General Public License for more details.
a2cf7d
+
a2cf7d
+   You should have received a copy of the GNU Lesser General Public
a2cf7d
+   License along with the GNU C Library; if not, see
a2cf7d
+   <http://www.gnu.org/licenses/>.  */
a2cf7d
+
a2cf7d
+#include <shlib-compat.h>
a2cf7d
+
a2cf7d
+/* This is an unused compatibility symbol definition, to prevent ld
a2cf7d
+   from creating a weak version definition for GLIBC_2.1.2.  (__vfork
a2cf7d
+   used to be defined at that version, but it is now provided by libc,
a2cf7d
+   and there are no versions left in libpthread for that symbol
a2cf7d
+   version.)  If the ABI baseline for glibc is the GLIBC_2.2 symbol
a2cf7d
+   version or later, the placeholder symbol is not needed because
a2cf7d
+   there are plenty of other symbols which populate those later
a2cf7d
+   versions.  */
a2cf7d
+#if (SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_2))
a2cf7d
+void
a2cf7d
+attribute_compat_text_section
a2cf7d
+__libpthread_version_placeholder (void)
a2cf7d
+{
a2cf7d
+}
a2cf7d
+compat_symbol (libpthread, __libpthread_version_placeholder,
a2cf7d
+               __libpthread_version_placeholder, GLIBC_2_1_2);
a2cf7d
+#endif
a2cf7d
diff --git a/nptl/pt-vfork.c b/nptl/pt-vfork.c
a2cf7d
deleted file mode 100644
a2cf7d
index 2f890d3f3070d0e2..0000000000000000
a2cf7d
--- a/nptl/pt-vfork.c
a2cf7d
+++ /dev/null
a2cf7d
@@ -1,65 +0,0 @@
a2cf7d
-/* vfork ABI-compatibility entry points for libpthread.
a2cf7d
-   Copyright (C) 2014-2018 Free Software Foundation, Inc.
a2cf7d
-   This file is part of the GNU C Library.
a2cf7d
-
a2cf7d
-   The GNU C Library is free software; you can redistribute it and/or
a2cf7d
-   modify it under the terms of the GNU Lesser General Public
a2cf7d
-   License as published by the Free Software Foundation; either
a2cf7d
-   version 2.1 of the License, or (at your option) any later version.
a2cf7d
-
a2cf7d
-   The GNU C Library is distributed in the hope that it will be useful,
a2cf7d
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
a2cf7d
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
a2cf7d
-   Lesser General Public License for more details.
a2cf7d
-
a2cf7d
-   You should have received a copy of the GNU Lesser General Public
a2cf7d
-   License along with the GNU C Library; if not, see
a2cf7d
-   <http://www.gnu.org/licenses/>.  */
a2cf7d
-
a2cf7d
-#include <unistd.h>
a2cf7d
-#include <shlib-compat.h>
a2cf7d
-
a2cf7d
-/* libpthread used to have its own vfork implementation that differed
a2cf7d
-   from libc's only in having a pointless micro-optimization.  There
a2cf7d
-   is no longer any use to having a separate copy in libpthread, but
a2cf7d
-   the historical ABI requires it.  For static linking, there is no
a2cf7d
-   need to provide anything here--the libc version will be linked in.
a2cf7d
-   For shared library ABI compatibility, there must be __vfork and
a2cf7d
-   vfork symbols in libpthread.so; so we define them using IFUNC to
a2cf7d
-   redirect to the libc function.  */
a2cf7d
-
a2cf7d
-/* Note! If the architecture doesn't support IFUNC, then we need an
a2cf7d
-   alternate target-specific mechanism to implement this.  So we just
a2cf7d
-   assume IFUNC here and require that the target override this file
a2cf7d
-   if necessary.
a2cf7d
-
a2cf7d
-   If the architecture can assume all supported versions of gcc will
a2cf7d
-   produce a tail-call to __libc_vfork, consider including the version
a2cf7d
-   in sysdeps/unix/sysv/linux/aarch64/pt-vfork.c.  */
a2cf7d
-
a2cf7d
-#if !HAVE_IFUNC
a2cf7d
-# error "must write pt-vfork for this machine or get IFUNC support"
a2cf7d
-#endif
a2cf7d
-
a2cf7d
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
a2cf7d
-     || SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20))
a2cf7d
-
a2cf7d
-extern __typeof (vfork) __libc_vfork;   /* Defined in libc.  */
a2cf7d
-
a2cf7d
-# undef INIT_ARCH
a2cf7d
-# define INIT_ARCH()
a2cf7d
-# define DEFINE_VFORK(name) libc_ifunc (name, &__libc_vfork)
a2cf7d
-
a2cf7d
-#endif
a2cf7d
-
a2cf7d
-#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
a2cf7d
-extern __typeof(vfork) vfork_ifunc;
a2cf7d
-DEFINE_VFORK (vfork_ifunc)
a2cf7d
-compat_symbol (libpthread, vfork_ifunc, vfork, GLIBC_2_0);
a2cf7d
-#endif
a2cf7d
-
a2cf7d
-#if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)
a2cf7d
-extern __typeof(vfork) __vfork_ifunc;
a2cf7d
-DEFINE_VFORK (__vfork_ifunc)
a2cf7d
-compat_symbol (libpthread, __vfork_ifunc, __vfork, GLIBC_2_1_2);
a2cf7d
-#endif
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist b/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
a2cf7d
index 9a9e4cee85b18a35..6945b7cbe4c2bde8 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
a2cf7d
@@ -45,7 +45,6 @@ GLIBC_2.17 __read F
a2cf7d
 GLIBC_2.17 __res_state F
a2cf7d
 GLIBC_2.17 __send F
a2cf7d
 GLIBC_2.17 __sigaction F
a2cf7d
-GLIBC_2.17 __vfork F
a2cf7d
 GLIBC_2.17 __wait F
a2cf7d
 GLIBC_2.17 __write F
a2cf7d
 GLIBC_2.17 _pthread_cleanup_pop F
a2cf7d
@@ -216,7 +215,6 @@ GLIBC_2.17 siglongjmp F
a2cf7d
 GLIBC_2.17 sigwait F
a2cf7d
 GLIBC_2.17 system F
a2cf7d
 GLIBC_2.17 tcdrain F
a2cf7d
-GLIBC_2.17 vfork F
a2cf7d
 GLIBC_2.17 wait F
a2cf7d
 GLIBC_2.17 waitpid F
a2cf7d
 GLIBC_2.17 write F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/aarch64/pt-vfork.c b/sysdeps/unix/sysv/linux/aarch64/pt-vfork.c
a2cf7d
deleted file mode 100644
a2cf7d
index 2b277f25ec200be2..0000000000000000
a2cf7d
--- a/sysdeps/unix/sysv/linux/aarch64/pt-vfork.c
a2cf7d
+++ /dev/null
a2cf7d
@@ -1,54 +0,0 @@
a2cf7d
-/* vfork ABI-compatibility entry points for libpthread.
a2cf7d
-   Copyright (C) 2014-2018 Free Software Foundation, Inc.
a2cf7d
-   This file is part of the GNU C Library.
a2cf7d
-
a2cf7d
-   The GNU C Library is free software; you can redistribute it and/or
a2cf7d
-   modify it under the terms of the GNU Lesser General Public
a2cf7d
-   License as published by the Free Software Foundation; either
a2cf7d
-   version 2.1 of the License, or (at your option) any later version.
a2cf7d
-
a2cf7d
-   The GNU C Library is distributed in the hope that it will be useful,
a2cf7d
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
a2cf7d
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
a2cf7d
-   Lesser General Public License for more details.
a2cf7d
-
a2cf7d
-   You should have received a copy of the GNU Lesser General Public
a2cf7d
-   License along with the GNU C Library; if not, see
a2cf7d
-   <http://www.gnu.org/licenses/>.  */
a2cf7d
-
a2cf7d
-#include <shlib-compat.h>
a2cf7d
-
a2cf7d
-/* libpthread used to have its own vfork implementation that differed
a2cf7d
-   from libc's only in having a pointless micro-optimization.  There
a2cf7d
-   is no longer any use to having a separate copy in libpthread, but
a2cf7d
-   the historical ABI requires it.  For static linking, there is no
a2cf7d
-   need to provide anything here--the libc version will be linked in.
a2cf7d
-   For shared library ABI compatibility, there must be __vfork and
a2cf7d
-   vfork symbols in libpthread.so.  */
a2cf7d
-
a2cf7d
-#if HAVE_IFUNC
a2cf7d
-# include <nptl/pt-vfork.c>
a2cf7d
-#elif (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
a2cf7d
-       || SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20))
a2cf7d
-
a2cf7d
-/* Thankfully, on AArch64 we can rely on the compiler generating
a2cf7d
-   a tail call here.  */
a2cf7d
-
a2cf7d
-extern void __libc_vfork (void);
a2cf7d
-
a2cf7d
-void
a2cf7d
-vfork_compat (void)
a2cf7d
-{
a2cf7d
-  __libc_vfork ();
a2cf7d
-}
a2cf7d
-
a2cf7d
-# if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
a2cf7d
-compat_symbol (libpthread, vfork_compat, vfork, GLIBC_2_0);
a2cf7d
-# endif
a2cf7d
-
a2cf7d
-# if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)
a2cf7d
-strong_alias (vfork_compat, vfork_compat2)
a2cf7d
-compat_symbol (libpthread, vfork_compat2, __vfork, GLIBC_2_1_2);
a2cf7d
-# endif
a2cf7d
-
a2cf7d
-#endif
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/alpha/libpthread.abilist b/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
a2cf7d
index b413007ccbd2b7b3..2d9b958efa99feb8 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
a2cf7d
@@ -114,7 +114,6 @@ GLIBC_2.0 siglongjmp F
a2cf7d
 GLIBC_2.0 sigwait F
a2cf7d
 GLIBC_2.0 system F
a2cf7d
 GLIBC_2.0 tcdrain F
a2cf7d
-GLIBC_2.0 vfork F
a2cf7d
 GLIBC_2.0 wait F
a2cf7d
 GLIBC_2.0 waitpid F
a2cf7d
 GLIBC_2.0 write F
a2cf7d
@@ -155,7 +154,7 @@ GLIBC_2.1 sem_wait F
a2cf7d
 GLIBC_2.1.1 sem_close F
a2cf7d
 GLIBC_2.1.1 sem_open F
a2cf7d
 GLIBC_2.1.1 sem_unlink F
a2cf7d
-GLIBC_2.1.2 __vfork F
a2cf7d
+GLIBC_2.1.2 __libpthread_version_placeholder F
a2cf7d
 GLIBC_2.11 pthread_sigqueue F
a2cf7d
 GLIBC_2.12 pthread_getname_np F
a2cf7d
 GLIBC_2.12 pthread_mutex_consistent F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/alpha/pt-vfork.S b/sysdeps/unix/sysv/linux/alpha/pt-vfork.S
a2cf7d
deleted file mode 100644
a2cf7d
index 7ecaa78dd0eda2fe..0000000000000000
a2cf7d
--- a/sysdeps/unix/sysv/linux/alpha/pt-vfork.S
a2cf7d
+++ /dev/null
a2cf7d
@@ -1,43 +0,0 @@
a2cf7d
-/* vfork ABI-compatibility entry points for libpthread.
a2cf7d
-   Copyright (C) 2014-2018 Free Software Foundation, Inc.
a2cf7d
-   This file is part of the GNU C Library.
a2cf7d
-
a2cf7d
-   The GNU C Library is free software; you can redistribute it and/or
a2cf7d
-   modify it under the terms of the GNU Lesser General Public
a2cf7d
-   License as published by the Free Software Foundation; either
a2cf7d
-   version 2.1 of the License, or (at your option) any later version.
a2cf7d
-
a2cf7d
-   The GNU C Library is distributed in the hope that it will be useful,
a2cf7d
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
a2cf7d
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
a2cf7d
-   Lesser General Public License for more details.
a2cf7d
-
a2cf7d
-   You should have received a copy of the GNU Lesser General Public
a2cf7d
-   License along with the GNU C Library; if not, see
a2cf7d
-   <http://www.gnu.org/licenses/>.  */
a2cf7d
-
a2cf7d
-#include <shlib-compat.h>
a2cf7d
-
a2cf7d
-/* libpthread used to have its own vfork implementation that differed
a2cf7d
-   from libc's only in having a pointless micro-optimization.  There
a2cf7d
-   is no longer any use to having a separate copy in libpthread, but
a2cf7d
-   the historical ABI requires it.  For static linking, there is no
a2cf7d
-   need to provide anything here--the libc version will be linked in.
a2cf7d
-   For shared library ABI compatibility, there must be __vfork and
a2cf7d
-   vfork symbols in libpthread.so.  */
a2cf7d
-
a2cf7d
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
a2cf7d
-     || SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20))
a2cf7d
-
a2cf7d
-#include <vfork.S>
a2cf7d
-
a2cf7d
-#endif
a2cf7d
-
a2cf7d
-#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
a2cf7d
-compat_symbol (libpthread, __libc_vfork, vfork, GLIBC_2_0);
a2cf7d
-#endif
a2cf7d
-
a2cf7d
-#if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)
a2cf7d
-strong_alias (__libc_vfork, __vfork_compat)
a2cf7d
-compat_symbol (libpthread, __vfork_compat, __vfork, GLIBC_2_1_2);
a2cf7d
-#endif
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/arm/libpthread.abilist b/sysdeps/unix/sysv/linux/arm/libpthread.abilist
a2cf7d
index af82a4c632988185..ee3d0290d01f184e 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/arm/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/arm/libpthread.abilist
a2cf7d
@@ -74,7 +74,6 @@ GLIBC_2.4 __read F
a2cf7d
 GLIBC_2.4 __res_state F
a2cf7d
 GLIBC_2.4 __send F
a2cf7d
 GLIBC_2.4 __sigaction F
a2cf7d
-GLIBC_2.4 __vfork F
a2cf7d
 GLIBC_2.4 __wait F
a2cf7d
 GLIBC_2.4 __write F
a2cf7d
 GLIBC_2.4 _pthread_cleanup_pop F
a2cf7d
@@ -239,7 +238,6 @@ GLIBC_2.4 siglongjmp F
a2cf7d
 GLIBC_2.4 sigwait F
a2cf7d
 GLIBC_2.4 system F
a2cf7d
 GLIBC_2.4 tcdrain F
a2cf7d
-GLIBC_2.4 vfork F
a2cf7d
 GLIBC_2.4 wait F
a2cf7d
 GLIBC_2.4 waitpid F
a2cf7d
 GLIBC_2.4 write F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/hppa/libpthread.abilist b/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
a2cf7d
index bcba07f57558174f..e9b3be6ac8e8f367 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
a2cf7d
@@ -46,7 +46,6 @@ GLIBC_2.2 __read F
a2cf7d
 GLIBC_2.2 __res_state F
a2cf7d
 GLIBC_2.2 __send F
a2cf7d
 GLIBC_2.2 __sigaction F
a2cf7d
-GLIBC_2.2 __vfork F
a2cf7d
 GLIBC_2.2 __wait F
a2cf7d
 GLIBC_2.2 __write F
a2cf7d
 GLIBC_2.2 _pthread_cleanup_pop F
a2cf7d
@@ -192,7 +191,6 @@ GLIBC_2.2 siglongjmp F
a2cf7d
 GLIBC_2.2 sigwait F
a2cf7d
 GLIBC_2.2 system F
a2cf7d
 GLIBC_2.2 tcdrain F
a2cf7d
-GLIBC_2.2 vfork F
a2cf7d
 GLIBC_2.2 wait F
a2cf7d
 GLIBC_2.2 waitpid F
a2cf7d
 GLIBC_2.2 write F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/hppa/localplt.data b/sysdeps/unix/sysv/linux/hppa/localplt.data
a2cf7d
index 5f3475de191778f6..867413f0c54d3d71 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/hppa/localplt.data
a2cf7d
+++ b/sysdeps/unix/sysv/linux/hppa/localplt.data
a2cf7d
@@ -10,7 +10,6 @@ libc.so: __sigsetjmp
a2cf7d
 libc.so: _IO_funlockfile
a2cf7d
 libc.so: __errno_location
a2cf7d
 libm.so: matherr
a2cf7d
-libpthread.so: __errno_location
a2cf7d
 # The main malloc is interposed into the dynamic linker, for
a2cf7d
 # allocations after the initial link (when dlopen is used).
a2cf7d
 ld.so: malloc
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/hppa/pt-vfork.S b/sysdeps/unix/sysv/linux/hppa/pt-vfork.S
a2cf7d
deleted file mode 100644
a2cf7d
index 45f7620d90cb5b8f..0000000000000000
a2cf7d
--- a/sysdeps/unix/sysv/linux/hppa/pt-vfork.S
a2cf7d
+++ /dev/null
a2cf7d
@@ -1,82 +0,0 @@
a2cf7d
-/* Copyright (C) 2005-2018 Free Software Foundation, Inc.
a2cf7d
-   This file is part of the GNU C Library.
a2cf7d
-
a2cf7d
-   The GNU C Library is free software; you can redistribute it and/or
a2cf7d
-   modify it under the terms of the GNU Lesser General Public
a2cf7d
-   License as published by the Free Software Foundation; either
a2cf7d
-   version 2.1 of the License, or (at your option) any later version.
a2cf7d
-
a2cf7d
-   The GNU C Library is distributed in the hope that it will be useful,
a2cf7d
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
a2cf7d
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
a2cf7d
-   Lesser General Public License for more details.
a2cf7d
-
a2cf7d
-   You should have received a copy of the GNU Lesser General Public
a2cf7d
-   License along with the GNU C Library.  If not, see
a2cf7d
-   <http://www.gnu.org/licenses/>.  */
a2cf7d
-
a2cf7d
-#include <sysdep.h>
a2cf7d
-#define _ERRNO_H        1
a2cf7d
-#include <bits/errno.h>
a2cf7d
-#include <tcb-offsets.h>
a2cf7d
-
a2cf7d
-/* Clone the calling process, but without copying the whole address space.
a2cf7d
-   The calling process is suspended until the new process exits or is
a2cf7d
-   replaced by a call to `execve'.  Return -1 for errors, 0 to the new process,
a2cf7d
-   and the process ID of the new process to the old process.  */
a2cf7d
-
a2cf7d
-.Lthread_start:						ASM_LINE_SEP
a2cf7d
-
a2cf7d
-	/* r26, r25, r24, r23 are free since vfork has no arguments */
a2cf7d
-ENTRY(__vfork)
a2cf7d
-	/* We must not create a frame. When the child unwinds to call
a2cf7d
-	   exec it will clobber the same frame that the parent
a2cf7d
-	   needs to unwind.  */
a2cf7d
-
a2cf7d
-	/* Save the PIC register. */
a2cf7d
-#ifdef PIC
a2cf7d
-	copy	%r19, %r25	/* parent */
a2cf7d
-#endif
a2cf7d
-
a2cf7d
-	/* Syscall saves and restores all register states */
a2cf7d
-	ble	0x100(%sr2,%r0)
a2cf7d
-	ldi	__NR_vfork,%r20
a2cf7d
-
a2cf7d
-	/* Check for error */
a2cf7d
-	ldi	-4096,%r1
a2cf7d
-	comclr,>>= %r1,%ret0,%r0        /* Note: unsigned compare. */
a2cf7d
-	b,n	.Lerror
a2cf7d
-
a2cf7d
-	/* Return, and DO NOT restore rp. The child may have called
a2cf7d
-	   functions that updated the frame's rp. This works because
a2cf7d
-	   the kernel ensures rp is preserved across the vfork
a2cf7d
-	   syscall.  */
a2cf7d
-	bv,n	%r0(%rp)
a2cf7d
-
a2cf7d
-.Lerror:
a2cf7d
-	/* Now we need a stack to call a function. We are assured
a2cf7d
-	   that there is no child now, so it's safe to create
a2cf7d
-	   a frame.  */
a2cf7d
-	stw	%rp, -20(%sp)
a2cf7d
-	.cfi_offset 2, -20
a2cf7d
-	stwm	%r3, 64(%sp)
a2cf7d
-	.cfi_def_cfa_offset -64
a2cf7d
-	.cfi_offset 3, 0
a2cf7d
-	stw	%sp, -4(%sp)
a2cf7d
-
a2cf7d
-	sub	%r0,%ret0,%r3
a2cf7d
-	SYSCALL_ERROR_HANDLER
a2cf7d
-	/* Restore the PIC register (in delay slot) on error */
a2cf7d
-#ifdef PIC
a2cf7d
-	copy	%r25, %r19    /* parent */
a2cf7d
-#else
a2cf7d
-	nop
a2cf7d
-#endif
a2cf7d
-	/* Write syscall return into errno location */
a2cf7d
-	stw	%r3, 0(%ret0)
a2cf7d
-	ldw	-84(%sp), %rp
a2cf7d
-	bv	%r0(%rp)
a2cf7d
-	ldwm	-64(%sp), %r3
a2cf7d
-PSEUDO_END (__vfork)
a2cf7d
-libc_hidden_def (__vfork)
a2cf7d
-weak_alias (__vfork, vfork)
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/i386/libpthread.abilist b/sysdeps/unix/sysv/linux/i386/libpthread.abilist
a2cf7d
index bece86d24624ea26..7199aae573649f49 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/i386/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/i386/libpthread.abilist
a2cf7d
@@ -114,7 +114,6 @@ GLIBC_2.0 siglongjmp F
a2cf7d
 GLIBC_2.0 sigwait F
a2cf7d
 GLIBC_2.0 system F
a2cf7d
 GLIBC_2.0 tcdrain F
a2cf7d
-GLIBC_2.0 vfork F
a2cf7d
 GLIBC_2.0 wait F
a2cf7d
 GLIBC_2.0 waitpid F
a2cf7d
 GLIBC_2.0 write F
a2cf7d
@@ -155,7 +154,7 @@ GLIBC_2.1 sem_wait F
a2cf7d
 GLIBC_2.1.1 sem_close F
a2cf7d
 GLIBC_2.1.1 sem_open F
a2cf7d
 GLIBC_2.1.1 sem_unlink F
a2cf7d
-GLIBC_2.1.2 __vfork F
a2cf7d
+GLIBC_2.1.2 __libpthread_version_placeholder F
a2cf7d
 GLIBC_2.11 pthread_sigqueue F
a2cf7d
 GLIBC_2.12 pthread_getname_np F
a2cf7d
 GLIBC_2.12 pthread_mutex_consistent F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/ia64/libpthread.abilist b/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
a2cf7d
index ccc94498268a5c74..e8a65642caec7ff1 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
a2cf7d
@@ -46,7 +46,6 @@ GLIBC_2.2 __read F
a2cf7d
 GLIBC_2.2 __res_state F
a2cf7d
 GLIBC_2.2 __send F
a2cf7d
 GLIBC_2.2 __sigaction F
a2cf7d
-GLIBC_2.2 __vfork F
a2cf7d
 GLIBC_2.2 __wait F
a2cf7d
 GLIBC_2.2 __write F
a2cf7d
 GLIBC_2.2 _pthread_cleanup_pop F
a2cf7d
@@ -192,7 +191,6 @@ GLIBC_2.2 siglongjmp F
a2cf7d
 GLIBC_2.2 sigwait F
a2cf7d
 GLIBC_2.2 system F
a2cf7d
 GLIBC_2.2 tcdrain F
a2cf7d
-GLIBC_2.2 vfork F
a2cf7d
 GLIBC_2.2 wait F
a2cf7d
 GLIBC_2.2 waitpid F
a2cf7d
 GLIBC_2.2 write F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/ia64/pt-vfork.S b/sysdeps/unix/sysv/linux/ia64/pt-vfork.S
a2cf7d
deleted file mode 100644
a2cf7d
index 61f3e387b455d731..0000000000000000
a2cf7d
--- a/sysdeps/unix/sysv/linux/ia64/pt-vfork.S
a2cf7d
+++ /dev/null
a2cf7d
@@ -1,48 +0,0 @@
a2cf7d
-/* vfork ABI-compatibility entry points for libpthread.  IA64 version.
a2cf7d
-   Copyright (C) 2014-2018 Free Software Foundation, Inc.
a2cf7d
-   This file is part of the GNU C Library.
a2cf7d
-
a2cf7d
-   The GNU C Library is free software; you can redistribute it and/or
a2cf7d
-   modify it under the terms of the GNU Lesser General Public
a2cf7d
-   License as published by the Free Software Foundation; either
a2cf7d
-   version 2.1 of the License, or (at your option) any later version.
a2cf7d
-
a2cf7d
-   The GNU C Library is distributed in the hope that it will be useful,
a2cf7d
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
a2cf7d
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
a2cf7d
-   Lesser General Public License for more details.
a2cf7d
-
a2cf7d
-   You should have received a copy of the GNU Lesser General Public
a2cf7d
-   License along with the GNU C Library; if not, see
a2cf7d
-   <http://www.gnu.org/licenses/>.  */
a2cf7d
-
a2cf7d
-#include <sysdep.h>
a2cf7d
-#include <shlib-compat.h>
a2cf7d
-
a2cf7d
-/* libpthread used to have its own vfork implementation that differed
a2cf7d
-   from libc's only in having a pointless micro-optimization.  There
a2cf7d
-   is no longer any use to having a separate copy in libpthread, but
a2cf7d
-   the historical ABI requires it.  For static linking, there is no
a2cf7d
-   need to provide anything here--the libc version will be linked in.
a2cf7d
-   For shared library ABI compatibility, there must be __vfork and
a2cf7d
-   vfork symbols in libpthread.so.  */
a2cf7d
-
a2cf7d
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
a2cf7d
-     || SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20))
a2cf7d
-
a2cf7d
-LOCAL_LEAF (vfork_compat)
a2cf7d
-	br __libc_vfork
a2cf7d
-	;;
a2cf7d
-END (vfork_compat)
a2cf7d
-
a2cf7d
-#endif
a2cf7d
-
a2cf7d
-#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
a2cf7d
-weak_alias (vfork_compat, vfork)
a2cf7d
-compat_symbol (libpthread, vfork_compat, vfork, GLIBC_2_0);
a2cf7d
-#endif
a2cf7d
-
a2cf7d
-#if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)
a2cf7d
-strong_alias (vfork_compat, __vfork_compat)
a2cf7d
-compat_symbol (libpthread, __vfork_compat, __vfork, GLIBC_2_1_2);
a2cf7d
-#endif
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
a2cf7d
index af82a4c632988185..ee3d0290d01f184e 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
a2cf7d
@@ -74,7 +74,6 @@ GLIBC_2.4 __read F
a2cf7d
 GLIBC_2.4 __res_state F
a2cf7d
 GLIBC_2.4 __send F
a2cf7d
 GLIBC_2.4 __sigaction F
a2cf7d
-GLIBC_2.4 __vfork F
a2cf7d
 GLIBC_2.4 __wait F
a2cf7d
 GLIBC_2.4 __write F
a2cf7d
 GLIBC_2.4 _pthread_cleanup_pop F
a2cf7d
@@ -239,7 +238,6 @@ GLIBC_2.4 siglongjmp F
a2cf7d
 GLIBC_2.4 sigwait F
a2cf7d
 GLIBC_2.4 system F
a2cf7d
 GLIBC_2.4 tcdrain F
a2cf7d
-GLIBC_2.4 vfork F
a2cf7d
 GLIBC_2.4 wait F
a2cf7d
 GLIBC_2.4 waitpid F
a2cf7d
 GLIBC_2.4 write F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
a2cf7d
index bece86d24624ea26..7199aae573649f49 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
a2cf7d
@@ -114,7 +114,6 @@ GLIBC_2.0 siglongjmp F
a2cf7d
 GLIBC_2.0 sigwait F
a2cf7d
 GLIBC_2.0 system F
a2cf7d
 GLIBC_2.0 tcdrain F
a2cf7d
-GLIBC_2.0 vfork F
a2cf7d
 GLIBC_2.0 wait F
a2cf7d
 GLIBC_2.0 waitpid F
a2cf7d
 GLIBC_2.0 write F
a2cf7d
@@ -155,7 +154,7 @@ GLIBC_2.1 sem_wait F
a2cf7d
 GLIBC_2.1.1 sem_close F
a2cf7d
 GLIBC_2.1.1 sem_open F
a2cf7d
 GLIBC_2.1.1 sem_unlink F
a2cf7d
-GLIBC_2.1.2 __vfork F
a2cf7d
+GLIBC_2.1.2 __libpthread_version_placeholder F
a2cf7d
 GLIBC_2.11 pthread_sigqueue F
a2cf7d
 GLIBC_2.12 pthread_getname_np F
a2cf7d
 GLIBC_2.12 pthread_mutex_consistent F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/m68k/pt-vfork.c b/sysdeps/unix/sysv/linux/m68k/pt-vfork.c
a2cf7d
deleted file mode 100644
a2cf7d
index 5fbc6526aa2af493..0000000000000000
a2cf7d
--- a/sysdeps/unix/sysv/linux/m68k/pt-vfork.c
a2cf7d
+++ /dev/null
a2cf7d
@@ -1 +0,0 @@
a2cf7d
-#include <sysdeps/unix/sysv/linux/aarch64/pt-vfork.c>
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/microblaze/libpthread.abilist b/sysdeps/unix/sysv/linux/microblaze/libpthread.abilist
a2cf7d
index 5067375d237a0c9f..e0fbe6848f7945bd 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/microblaze/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/microblaze/libpthread.abilist
a2cf7d
@@ -45,7 +45,6 @@ GLIBC_2.18 __read F
a2cf7d
 GLIBC_2.18 __res_state F
a2cf7d
 GLIBC_2.18 __send F
a2cf7d
 GLIBC_2.18 __sigaction F
a2cf7d
-GLIBC_2.18 __vfork F
a2cf7d
 GLIBC_2.18 __wait F
a2cf7d
 GLIBC_2.18 __write F
a2cf7d
 GLIBC_2.18 _pthread_cleanup_pop F
a2cf7d
@@ -218,7 +217,6 @@ GLIBC_2.18 siglongjmp F
a2cf7d
 GLIBC_2.18 sigwait F
a2cf7d
 GLIBC_2.18 system F
a2cf7d
 GLIBC_2.18 tcdrain F
a2cf7d
-GLIBC_2.18 vfork F
a2cf7d
 GLIBC_2.18 wait F
a2cf7d
 GLIBC_2.18 waitpid F
a2cf7d
 GLIBC_2.18 write F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/microblaze/pt-vfork.S b/sysdeps/unix/sysv/linux/microblaze/pt-vfork.S
a2cf7d
deleted file mode 100644
a2cf7d
index 74bc1cdf7455f597..0000000000000000
a2cf7d
--- a/sysdeps/unix/sysv/linux/microblaze/pt-vfork.S
a2cf7d
+++ /dev/null
a2cf7d
@@ -1,49 +0,0 @@
a2cf7d
-/* vfork ABI-compatibility entry points for libpthread.
a2cf7d
-   Copyright (C) 2014-2018 Free Software Foundation, Inc.
a2cf7d
-   This file is part of the GNU C Library.
a2cf7d
-
a2cf7d
-   The GNU C Library is free software; you can redistribute it and/or
a2cf7d
-   modify it under the terms of the GNU Lesser General Public
a2cf7d
-   License as published by the Free Software Foundation; either
a2cf7d
-   version 2.1 of the License, or (at your option) any later version.
a2cf7d
-
a2cf7d
-   The GNU C Library is distributed in the hope that it will be useful,
a2cf7d
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
a2cf7d
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
a2cf7d
-   Lesser General Public License for more details.
a2cf7d
-
a2cf7d
-   You should have received a copy of the GNU Lesser General Public
a2cf7d
-   License along with the GNU C Library; if not, see
a2cf7d
-   <http://www.gnu.org/licenses/>.  */
a2cf7d
-
a2cf7d
-#include <sysdep.h>
a2cf7d
-#include <shlib-compat.h>
a2cf7d
-
a2cf7d
-/* libpthread used to have its own vfork implementation that differed
a2cf7d
-   from libc's only in having a pointless micro-optimization.  There
a2cf7d
-   is no longer any use to having a separate copy in libpthread, but
a2cf7d
-   the historical ABI requires it.  For static linking, there is no
a2cf7d
-   need to provide anything here--the libc version will be linked in.
a2cf7d
-   For shared library ABI compatibility, there must be __vfork and
a2cf7d
-   vfork symbols in libpthread.so.
a2cf7d
-
a2cf7d
-   As of GCC 7, microblaze can *not* rely on the compiler to generate
a2cf7d
-   a tail call from this vfork to __libc_vfork.  */
a2cf7d
-
a2cf7d
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
a2cf7d
-       || SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20))
a2cf7d
-
a2cf7d
-ENTRY (vfork_compat)
a2cf7d
-	bri	__libc_vfork@PLT
a2cf7d
-END (vfork_compat)
a2cf7d
-
a2cf7d
-#endif
a2cf7d
-
a2cf7d
-#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
a2cf7d
-compat_symbol (libpthread, vfork_compat, vfork, GLIBC_2_0)
a2cf7d
-#endif
a2cf7d
-
a2cf7d
-#if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)
a2cf7d
-strong_alias (vfork_compat, vfork_compat2)
a2cf7d
-compat_symbol (libpthread, vfork_compat2, __vfork, GLIBC_2_1_2)
a2cf7d
-#endif
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
a2cf7d
index 02144967c638cdbe..f60b22efb5b5f683 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
a2cf7d
@@ -114,7 +114,6 @@ GLIBC_2.0 siglongjmp F
a2cf7d
 GLIBC_2.0 sigwait F
a2cf7d
 GLIBC_2.0 system F
a2cf7d
 GLIBC_2.0 tcdrain F
a2cf7d
-GLIBC_2.0 vfork F
a2cf7d
 GLIBC_2.0 wait F
a2cf7d
 GLIBC_2.0 waitpid F
a2cf7d
 GLIBC_2.0 write F
a2cf7d
@@ -140,7 +139,6 @@ GLIBC_2.2 __pthread_rwlock_unlock F
a2cf7d
 GLIBC_2.2 __pthread_rwlock_wrlock F
a2cf7d
 GLIBC_2.2 __pwrite64 F
a2cf7d
 GLIBC_2.2 __res_state F
a2cf7d
-GLIBC_2.2 __vfork F
a2cf7d
 GLIBC_2.2 lseek64 F
a2cf7d
 GLIBC_2.2 open64 F
a2cf7d
 GLIBC_2.2 pread F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
a2cf7d
index 02144967c638cdbe..f60b22efb5b5f683 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
a2cf7d
@@ -114,7 +114,6 @@ GLIBC_2.0 siglongjmp F
a2cf7d
 GLIBC_2.0 sigwait F
a2cf7d
 GLIBC_2.0 system F
a2cf7d
 GLIBC_2.0 tcdrain F
a2cf7d
-GLIBC_2.0 vfork F
a2cf7d
 GLIBC_2.0 wait F
a2cf7d
 GLIBC_2.0 waitpid F
a2cf7d
 GLIBC_2.0 write F
a2cf7d
@@ -140,7 +139,6 @@ GLIBC_2.2 __pthread_rwlock_unlock F
a2cf7d
 GLIBC_2.2 __pthread_rwlock_wrlock F
a2cf7d
 GLIBC_2.2 __pwrite64 F
a2cf7d
 GLIBC_2.2 __res_state F
a2cf7d
-GLIBC_2.2 __vfork F
a2cf7d
 GLIBC_2.2 lseek64 F
a2cf7d
 GLIBC_2.2 open64 F
a2cf7d
 GLIBC_2.2 pread F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/mips/pt-vfork.S b/sysdeps/unix/sysv/linux/mips/pt-vfork.S
a2cf7d
deleted file mode 100644
a2cf7d
index 65cc3823ac872b35..0000000000000000
a2cf7d
--- a/sysdeps/unix/sysv/linux/mips/pt-vfork.S
a2cf7d
+++ /dev/null
a2cf7d
@@ -1 +0,0 @@
a2cf7d
-#include <sysdeps/unix/sysv/linux/alpha/pt-vfork.S>
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/nios2/pt-vfork.S b/sysdeps/unix/sysv/linux/nios2/pt-vfork.S
a2cf7d
deleted file mode 100644
a2cf7d
index 147427a42d2d74a7..0000000000000000
a2cf7d
--- a/sysdeps/unix/sysv/linux/nios2/pt-vfork.S
a2cf7d
+++ /dev/null
a2cf7d
@@ -1 +0,0 @@
a2cf7d
-# Nios2 does not require a stub for vfork in libpthread.
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
a2cf7d
index 09e8447b06f828be..c7d9b7898640730d 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
a2cf7d
@@ -114,7 +114,6 @@ GLIBC_2.0 siglongjmp F
a2cf7d
 GLIBC_2.0 sigwait F
a2cf7d
 GLIBC_2.0 system F
a2cf7d
 GLIBC_2.0 tcdrain F
a2cf7d
-GLIBC_2.0 vfork F
a2cf7d
 GLIBC_2.0 wait F
a2cf7d
 GLIBC_2.0 waitpid F
a2cf7d
 GLIBC_2.0 write F
a2cf7d
@@ -155,7 +154,7 @@ GLIBC_2.1 sem_wait F
a2cf7d
 GLIBC_2.1.1 sem_close F
a2cf7d
 GLIBC_2.1.1 sem_open F
a2cf7d
 GLIBC_2.1.1 sem_unlink F
a2cf7d
-GLIBC_2.1.2 __vfork F
a2cf7d
+GLIBC_2.1.2 __libpthread_version_placeholder F
a2cf7d
 GLIBC_2.11 pthread_sigqueue F
a2cf7d
 GLIBC_2.12 pthread_getname_np F
a2cf7d
 GLIBC_2.12 pthread_mutex_consistent F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libpthread-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libpthread-le.abilist
a2cf7d
index 9a9e4cee85b18a35..6945b7cbe4c2bde8 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libpthread-le.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libpthread-le.abilist
a2cf7d
@@ -45,7 +45,6 @@ GLIBC_2.17 __read F
a2cf7d
 GLIBC_2.17 __res_state F
a2cf7d
 GLIBC_2.17 __send F
a2cf7d
 GLIBC_2.17 __sigaction F
a2cf7d
-GLIBC_2.17 __vfork F
a2cf7d
 GLIBC_2.17 __wait F
a2cf7d
 GLIBC_2.17 __write F
a2cf7d
 GLIBC_2.17 _pthread_cleanup_pop F
a2cf7d
@@ -216,7 +215,6 @@ GLIBC_2.17 siglongjmp F
a2cf7d
 GLIBC_2.17 sigwait F
a2cf7d
 GLIBC_2.17 system F
a2cf7d
 GLIBC_2.17 tcdrain F
a2cf7d
-GLIBC_2.17 vfork F
a2cf7d
 GLIBC_2.17 wait F
a2cf7d
 GLIBC_2.17 waitpid F
a2cf7d
 GLIBC_2.17 write F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libpthread.abilist
a2cf7d
index 8300958d4721d6a6..3500cce6c1124996 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libpthread.abilist
a2cf7d
@@ -68,7 +68,6 @@ GLIBC_2.3 __read F
a2cf7d
 GLIBC_2.3 __res_state F
a2cf7d
 GLIBC_2.3 __send F
a2cf7d
 GLIBC_2.3 __sigaction F
a2cf7d
-GLIBC_2.3 __vfork F
a2cf7d
 GLIBC_2.3 __wait F
a2cf7d
 GLIBC_2.3 __write F
a2cf7d
 GLIBC_2.3 _pthread_cleanup_pop F
a2cf7d
@@ -214,7 +213,6 @@ GLIBC_2.3 siglongjmp F
a2cf7d
 GLIBC_2.3 sigwait F
a2cf7d
 GLIBC_2.3 system F
a2cf7d
 GLIBC_2.3 tcdrain F
a2cf7d
-GLIBC_2.3 vfork F
a2cf7d
 GLIBC_2.3 wait F
a2cf7d
 GLIBC_2.3 waitpid F
a2cf7d
 GLIBC_2.3 write F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/riscv/pt-vfork.S b/sysdeps/unix/sysv/linux/riscv/pt-vfork.S
a2cf7d
deleted file mode 100644
a2cf7d
index 1cc8931700702e65..0000000000000000
a2cf7d
--- a/sysdeps/unix/sysv/linux/riscv/pt-vfork.S
a2cf7d
+++ /dev/null
a2cf7d
@@ -1 +0,0 @@
a2cf7d
-/* Not needed.  */
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/s390/pt-vfork.S b/sysdeps/unix/sysv/linux/s390/pt-vfork.S
a2cf7d
deleted file mode 100644
a2cf7d
index 65cc3823ac872b35..0000000000000000
a2cf7d
--- a/sysdeps/unix/sysv/linux/s390/pt-vfork.S
a2cf7d
+++ /dev/null
a2cf7d
@@ -1 +0,0 @@
a2cf7d
-#include <sysdeps/unix/sysv/linux/alpha/pt-vfork.S>
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
a2cf7d
index d05468f3b2732e92..f093634d7edce2f2 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
a2cf7d
@@ -114,7 +114,6 @@ GLIBC_2.0 siglongjmp F
a2cf7d
 GLIBC_2.0 sigwait F
a2cf7d
 GLIBC_2.0 system F
a2cf7d
 GLIBC_2.0 tcdrain F
a2cf7d
-GLIBC_2.0 vfork F
a2cf7d
 GLIBC_2.0 wait F
a2cf7d
 GLIBC_2.0 waitpid F
a2cf7d
 GLIBC_2.0 write F
a2cf7d
@@ -155,7 +154,7 @@ GLIBC_2.1 sem_wait F
a2cf7d
 GLIBC_2.1.1 sem_close F
a2cf7d
 GLIBC_2.1.1 sem_open F
a2cf7d
 GLIBC_2.1.1 sem_unlink F
a2cf7d
-GLIBC_2.1.2 __vfork F
a2cf7d
+GLIBC_2.1.2 __libpthread_version_placeholder F
a2cf7d
 GLIBC_2.11 pthread_sigqueue F
a2cf7d
 GLIBC_2.12 pthread_getname_np F
a2cf7d
 GLIBC_2.12 pthread_mutex_consistent F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
a2cf7d
index e8161aa747402b72..47204f166c29a773 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
a2cf7d
@@ -48,7 +48,6 @@ GLIBC_2.2 __read F
a2cf7d
 GLIBC_2.2 __res_state F
a2cf7d
 GLIBC_2.2 __send F
a2cf7d
 GLIBC_2.2 __sigaction F
a2cf7d
-GLIBC_2.2 __vfork F
a2cf7d
 GLIBC_2.2 __wait F
a2cf7d
 GLIBC_2.2 __write F
a2cf7d
 GLIBC_2.2 _pthread_cleanup_pop F
a2cf7d
@@ -194,7 +193,6 @@ GLIBC_2.2 siglongjmp F
a2cf7d
 GLIBC_2.2 sigwait F
a2cf7d
 GLIBC_2.2 system F
a2cf7d
 GLIBC_2.2 tcdrain F
a2cf7d
-GLIBC_2.2 vfork F
a2cf7d
 GLIBC_2.2 wait F
a2cf7d
 GLIBC_2.2 waitpid F
a2cf7d
 GLIBC_2.2 write F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/sh/libpthread.abilist b/sysdeps/unix/sysv/linux/sh/libpthread.abilist
a2cf7d
index bcba07f57558174f..e9b3be6ac8e8f367 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/sh/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/sh/libpthread.abilist
a2cf7d
@@ -46,7 +46,6 @@ GLIBC_2.2 __read F
a2cf7d
 GLIBC_2.2 __res_state F
a2cf7d
 GLIBC_2.2 __send F
a2cf7d
 GLIBC_2.2 __sigaction F
a2cf7d
-GLIBC_2.2 __vfork F
a2cf7d
 GLIBC_2.2 __wait F
a2cf7d
 GLIBC_2.2 __write F
a2cf7d
 GLIBC_2.2 _pthread_cleanup_pop F
a2cf7d
@@ -192,7 +191,6 @@ GLIBC_2.2 siglongjmp F
a2cf7d
 GLIBC_2.2 sigwait F
a2cf7d
 GLIBC_2.2 system F
a2cf7d
 GLIBC_2.2 tcdrain F
a2cf7d
-GLIBC_2.2 vfork F
a2cf7d
 GLIBC_2.2 wait F
a2cf7d
 GLIBC_2.2 waitpid F
a2cf7d
 GLIBC_2.2 write F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/sh/pt-vfork.S b/sysdeps/unix/sysv/linux/sh/pt-vfork.S
a2cf7d
deleted file mode 100644
a2cf7d
index 65cc3823ac872b35..0000000000000000
a2cf7d
--- a/sysdeps/unix/sysv/linux/sh/pt-vfork.S
a2cf7d
+++ /dev/null
a2cf7d
@@ -1 +0,0 @@
a2cf7d
-#include <sysdeps/unix/sysv/linux/alpha/pt-vfork.S>
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/sparc/pt-vfork.S b/sysdeps/unix/sysv/linux/sparc/pt-vfork.S
a2cf7d
deleted file mode 100644
a2cf7d
index 65cc3823ac872b35..0000000000000000
a2cf7d
--- a/sysdeps/unix/sysv/linux/sparc/pt-vfork.S
a2cf7d
+++ /dev/null
a2cf7d
@@ -1 +0,0 @@
a2cf7d
-#include <sysdeps/unix/sysv/linux/alpha/pt-vfork.S>
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
a2cf7d
index b413007ccbd2b7b3..2d9b958efa99feb8 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
a2cf7d
@@ -114,7 +114,6 @@ GLIBC_2.0 siglongjmp F
a2cf7d
 GLIBC_2.0 sigwait F
a2cf7d
 GLIBC_2.0 system F
a2cf7d
 GLIBC_2.0 tcdrain F
a2cf7d
-GLIBC_2.0 vfork F
a2cf7d
 GLIBC_2.0 wait F
a2cf7d
 GLIBC_2.0 waitpid F
a2cf7d
 GLIBC_2.0 write F
a2cf7d
@@ -155,7 +154,7 @@ GLIBC_2.1 sem_wait F
a2cf7d
 GLIBC_2.1.1 sem_close F
a2cf7d
 GLIBC_2.1.1 sem_open F
a2cf7d
 GLIBC_2.1.1 sem_unlink F
a2cf7d
-GLIBC_2.1.2 __vfork F
a2cf7d
+GLIBC_2.1.2 __libpthread_version_placeholder F
a2cf7d
 GLIBC_2.11 pthread_sigqueue F
a2cf7d
 GLIBC_2.12 pthread_getname_np F
a2cf7d
 GLIBC_2.12 pthread_mutex_consistent F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
a2cf7d
index ccc94498268a5c74..e8a65642caec7ff1 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
a2cf7d
@@ -46,7 +46,6 @@ GLIBC_2.2 __read F
a2cf7d
 GLIBC_2.2 __res_state F
a2cf7d
 GLIBC_2.2 __send F
a2cf7d
 GLIBC_2.2 __sigaction F
a2cf7d
-GLIBC_2.2 __vfork F
a2cf7d
 GLIBC_2.2 __wait F
a2cf7d
 GLIBC_2.2 __write F
a2cf7d
 GLIBC_2.2 _pthread_cleanup_pop F
a2cf7d
@@ -192,7 +191,6 @@ GLIBC_2.2 siglongjmp F
a2cf7d
 GLIBC_2.2 sigwait F
a2cf7d
 GLIBC_2.2 system F
a2cf7d
 GLIBC_2.2 tcdrain F
a2cf7d
-GLIBC_2.2 vfork F
a2cf7d
 GLIBC_2.2 wait F
a2cf7d
 GLIBC_2.2 waitpid F
a2cf7d
 GLIBC_2.2 write F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
a2cf7d
index 931c8277a859999e..4fbb72ffb37ba689 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
a2cf7d
@@ -46,7 +46,6 @@ GLIBC_2.2.5 __read F
a2cf7d
 GLIBC_2.2.5 __res_state F
a2cf7d
 GLIBC_2.2.5 __send F
a2cf7d
 GLIBC_2.2.5 __sigaction F
a2cf7d
-GLIBC_2.2.5 __vfork F
a2cf7d
 GLIBC_2.2.5 __wait F
a2cf7d
 GLIBC_2.2.5 __write F
a2cf7d
 GLIBC_2.2.5 _pthread_cleanup_pop F
a2cf7d
@@ -193,7 +192,6 @@ GLIBC_2.2.5 siglongjmp F
a2cf7d
 GLIBC_2.2.5 sigwait F
a2cf7d
 GLIBC_2.2.5 system F
a2cf7d
 GLIBC_2.2.5 tcdrain F
a2cf7d
-GLIBC_2.2.5 vfork F
a2cf7d
 GLIBC_2.2.5 wait F
a2cf7d
 GLIBC_2.2.5 waitpid F
a2cf7d
 GLIBC_2.2.5 write F
a2cf7d
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
a2cf7d
index c09c9b015a66f8f9..eec4b99b8bb69d74 100644
a2cf7d
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
a2cf7d
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
a2cf7d
@@ -45,7 +45,6 @@ GLIBC_2.16 __read F
a2cf7d
 GLIBC_2.16 __res_state F
a2cf7d
 GLIBC_2.16 __send F
a2cf7d
 GLIBC_2.16 __sigaction F
a2cf7d
-GLIBC_2.16 __vfork F
a2cf7d
 GLIBC_2.16 __wait F
a2cf7d
 GLIBC_2.16 __write F
a2cf7d
 GLIBC_2.16 _pthread_cleanup_pop F
a2cf7d
@@ -216,7 +215,6 @@ GLIBC_2.16 siglongjmp F
a2cf7d
 GLIBC_2.16 sigwait F
a2cf7d
 GLIBC_2.16 system F
a2cf7d
 GLIBC_2.16 tcdrain F
a2cf7d
-GLIBC_2.16 vfork F
a2cf7d
 GLIBC_2.16 wait F
a2cf7d
 GLIBC_2.16 waitpid F
a2cf7d
 GLIBC_2.16 write F