nptl: Remove vfork IFUNC-based forwarder from libpthread [BZ #20188]

With commit f0b2132b35 ("ld.so:
Support moving versioned symbols between sonames [BZ #24741]"), the
dynamic linker will find the definition of vfork in libc and binds
a vfork reference to that symbol, even if the soname in the version
reference says that the symbol should be located in libpthread.

As a result, the forwarder (whether it's IFUNC-based or a duplicate
of the libc implementation) is no longer necessary.

On older architectures, a placeholder symbol is required, to make sure
that the GLIBC_2.1.2 symbol version does not go away, or is turned in
to a weak symbol definition by the link editor.  (The symbol version
needs to preserved so that the symbol coverage check in
elf/dl-version.c does not fail for old binaries.)

mips32 is an outlier: It defined __vfork@@GLIBC_2.2, but the
baseline is GLIBC_2.0.  Since there are other @@GLIBC_2.2 symbols,
the placeholder symbol is not needed there.
This commit is contained in:
Florian Weimer 2019-07-02 15:12:20 +02:00
parent 27cec9aed9
commit 41d6f74e6c
40 changed files with 129 additions and 397 deletions

View File

@ -1,3 +1,84 @@
2019-07-01 Florian Weimer <fweimer@redhat.com>
[BZ #20188]
* nptl/Versions (libpthread): Remove __fork from GLIBC_2.0.
Replace __vfork with __libpthread_version_placeholder for
GLIBC_2.1.2.
(libc): Remove __libc_vfork from GLIBC_PRIVATE.
* nptl/Makefile (libpthread-routines): Remove pt-vfork. Add
libpthread-compat.
* nptl/pt-vfork.c: Remove file.
* sysdeps/unix/sysv/linux/aarch64/pt-vfork.c: Likewise.
* sysdeps/unix/sysv/linux/alpha/pt-vfork.S: Likewise.
* sysdeps/unix/sysv/linux/csky/pt-vfork.S: Likewise.
* sysdeps/unix/sysv/linux/hppa/pt-vfork.S: Likewise.
* sysdeps/unix/sysv/linux/ia64/pt-vfork.S: Likewise.
* sysdeps/unix/sysv/linux/m68k/pt-vfork.c: Likewise.
* sysdeps/unix/sysv/linux/microblaze/pt-vfork.S: Likewise.
* sysdeps/unix/sysv/linux/mips/pt-vfork.S: Likewise.
* sysdeps/unix/sysv/linux/nios2/pt-vfork.S: Likewise.
* sysdeps/unix/sysv/linux/riscv/pt-vfork.S: Likewise.
* sysdeps/unix/sysv/linux/s390/pt-vfork.S: Likewise.
* sysdeps/unix/sysv/linux/sh/pt-vfork.S: Likewise.
* sysdeps/unix/sysv/linux/sparc/pt-vfork.S: Likewise.
* sysdeps/unix/sysv/linux/aarch64/libpthread.abilist (GLIBC_2.17):
Remove vfork, __vfork.
* sysdeps/unix/sysv/linux/alpha/libpthread.abilist (GLIBC_2.0):
Remove vfork.
(GLIBC_2.1.2): Replace __vfork with
__libpthread_version_placeholder.
* sysdeps/unix/sysv/linux/arm/libpthread.abilist (GLIBC_2.4):
Remove vfork, __vfork.
* sysdeps/unix/sysv/linux/hppa/libpthread.abilist (GLIBC_2.2):
Likewise.
* sysdeps/unix/sysv/linux/i386/libpthread.abilist (GLIBC_2.0):
Remove vfork.
(GLIBC_2.1.2): Replace __vfork with
__libpthread_version_placeholder.
* sysdeps/unix/sysv/linux/ia64/libpthread.abilist (GLIBC_2.2):
Remove vfork.
* sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
(GLIBC_2.4): Remove vfork, __vfork.
* sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
(GLIBC_2.0): Remove vfork.
(GLIBC_2.1.2): Replace __vfork with
__libpthread_version_placeholder.
* sysdeps/unix/sysv/linux/microblaze/libpthread.abilist
(GLIBC_2.18): Remove vfork, __vfork.
* sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
(GLIBC_2.0): Remove vfork.
(GLIBC_2.2): Remove __vfork.
* sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist:
(GLIBC_2.2): Remove vfork, __vfork.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist:
(GLIBC_2.0): Remove vfork.
(GLIBC_2.1.2): Replace __vfork with
__libpthread_version_placeholder.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
(GLIBC_2.3): Remove vfork, __vfork.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
(GLIBC_2.17): Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
(GLIBC_2.0): Remove vfork.
(GLIBC_2.1.2): Replace __vfork with
__libpthread_version_placeholder.
* sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
(GLIBC_2.2): Remove vfork, __vfork.
* sysdeps/unix/sysv/linux/sh/libpthread.abilist (GLIBC_2.2):
Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
(GLIBC_2.0): Remove vfork.
(GLIBC_2.1.2): Replace __vfork with
__libpthread_version_placeholder.
* sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
(GLIBC_2.2): Remove vfork, __vfork.
* sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
(GLIBC_2.2.5): Likewise.
* sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
(GLIBC_2.16): Likewise.
* sysdeps/unix/sysv/linux/hppa/localplt.data (libpthread.so):
Remove __errno_location.
2019-07-02 Florian Weimer <fweimer@redhat.com>
[BZ #24757]

View File

@ -120,7 +120,7 @@ libpthread-routines = nptl-init nptlfreeres vars events version pt-interp \
cancellation \
lowlevellock \
lll_timedlock_wait \
pt-fork pt-vfork pt-fcntl \
pt-fork pt-fcntl \
$(pthread-compat-wrappers) \
pt-raise pt-system \
flockfile ftrylockfile funlockfile \
@ -144,7 +144,8 @@ libpthread-routines = nptl-init nptlfreeres vars events version pt-interp \
mtx_destroy mtx_init mtx_lock mtx_timedlock \
mtx_trylock mtx_unlock call_once cnd_broadcast \
cnd_destroy cnd_init cnd_signal cnd_timedwait cnd_wait \
tss_create tss_delete tss_get tss_set pthread_mutex_conf
tss_create tss_delete tss_get tss_set pthread_mutex_conf \
libpthread-compat
# pthread_setuid pthread_seteuid pthread_setreuid \
# pthread_setresuid \
# pthread_setgid pthread_setegid pthread_setregid \

View File

@ -36,7 +36,6 @@ libc {
__libc_alloca_cutoff;
# Internal libc interface to libpthread
__libc_dl_error_tsd;
__libc_vfork;
__libc_pthread_init;
__libc_current_sigrtmin_private; __libc_current_sigrtmax_private;
__libc_allocate_rtsig_private;
@ -98,7 +97,7 @@ libpthread {
sem_destroy; sem_getvalue; sem_init; sem_post; sem_trywait; sem_wait;
# Special fork handling.
fork; __fork; vfork;
fork; __fork;
# Cancellation points.
close; __close; fcntl; __fcntl; read; __read; write; __write; accept;
@ -152,7 +151,7 @@ libpthread {
}
GLIBC_2.1.2 {
__vfork;
__libpthread_version_placeholder;
}
GLIBC_2.2 {

37
nptl/libpthread-compat.c Normal file
View File

@ -0,0 +1,37 @@
/* Placeholder definitions to pull in removed symbol versions.
Copyright (C) 2019 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
<http://www.gnu.org/licenses/>. */
#include <shlib-compat.h>
/* 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_2, GLIBC_2_2))
void
attribute_compat_text_section
__libpthread_version_placeholder (void)
{
}
compat_symbol (libpthread, __libpthread_version_placeholder,
__libpthread_version_placeholder, GLIBC_2_1_2);
#endif

View File

@ -1,65 +0,0 @@
/* vfork ABI-compatibility entry points for libpthread.
Copyright (C) 2014-2019 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
<http://www.gnu.org/licenses/>. */
#include <unistd.h>
#include <shlib-compat.h>
/* libpthread used to have its own vfork implementation that differed
from libc's only in having a pointless micro-optimization. There
is no longer any use to having a separate copy in libpthread, but
the historical ABI requires it. For static linking, there is no
need to provide anything here--the libc version will be linked in.
For shared library ABI compatibility, there must be __vfork and
vfork symbols in libpthread.so; so we define them using IFUNC to
redirect to the libc function. */
/* Note! If the architecture doesn't support IFUNC, then we need an
alternate target-specific mechanism to implement this. So we just
assume IFUNC here and require that the target override this file
if necessary.
If the architecture can assume all supported versions of gcc will
produce a tail-call to __libc_vfork, consider including the version
in sysdeps/unix/sysv/linux/aarch64/pt-vfork.c. */
#if !HAVE_IFUNC
# error "must write pt-vfork for this machine or get IFUNC support"
#endif
#if (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
|| SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20))
extern __typeof (vfork) __libc_vfork; /* Defined in libc. */
# undef INIT_ARCH
# define INIT_ARCH()
# define DEFINE_VFORK(name) libc_ifunc (name, &__libc_vfork)
#endif
#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
extern __typeof(vfork) vfork_ifunc;
DEFINE_VFORK (vfork_ifunc)
compat_symbol (libpthread, vfork_ifunc, vfork, GLIBC_2_0);
#endif
#if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)
extern __typeof(vfork) __vfork_ifunc;
DEFINE_VFORK (__vfork_ifunc)
compat_symbol (libpthread, __vfork_ifunc, __vfork, GLIBC_2_1_2);
#endif

View File

@ -45,7 +45,6 @@ GLIBC_2.17 __read F
GLIBC_2.17 __res_state F
GLIBC_2.17 __send F
GLIBC_2.17 __sigaction F
GLIBC_2.17 __vfork F
GLIBC_2.17 __wait F
GLIBC_2.17 __write F
GLIBC_2.17 _pthread_cleanup_pop F
@ -216,7 +215,6 @@ GLIBC_2.17 siglongjmp F
GLIBC_2.17 sigwait F
GLIBC_2.17 system F
GLIBC_2.17 tcdrain F
GLIBC_2.17 vfork F
GLIBC_2.17 wait F
GLIBC_2.17 waitpid F
GLIBC_2.17 write F

View File

@ -1,54 +0,0 @@
/* vfork ABI-compatibility entry points for libpthread.
Copyright (C) 2014-2019 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
<http://www.gnu.org/licenses/>. */
#include <shlib-compat.h>
/* libpthread used to have its own vfork implementation that differed
from libc's only in having a pointless micro-optimization. There
is no longer any use to having a separate copy in libpthread, but
the historical ABI requires it. For static linking, there is no
need to provide anything here--the libc version will be linked in.
For shared library ABI compatibility, there must be __vfork and
vfork symbols in libpthread.so. */
#if HAVE_IFUNC
# include <nptl/pt-vfork.c>
#elif (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
|| SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20))
/* Thankfully, on AArch64 we can rely on the compiler generating
a tail call here. */
extern void __libc_vfork (void);
void
vfork_compat (void)
{
__libc_vfork ();
}
# if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
compat_symbol (libpthread, vfork_compat, vfork, GLIBC_2_0);
# endif
# if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)
strong_alias (vfork_compat, vfork_compat2)
compat_symbol (libpthread, vfork_compat2, __vfork, GLIBC_2_1_2);
# endif
#endif

View File

@ -114,7 +114,6 @@ GLIBC_2.0 siglongjmp F
GLIBC_2.0 sigwait F
GLIBC_2.0 system F
GLIBC_2.0 tcdrain F
GLIBC_2.0 vfork F
GLIBC_2.0 wait F
GLIBC_2.0 waitpid F
GLIBC_2.0 write F
@ -155,7 +154,7 @@ GLIBC_2.1 sem_wait F
GLIBC_2.1.1 sem_close F
GLIBC_2.1.1 sem_open F
GLIBC_2.1.1 sem_unlink F
GLIBC_2.1.2 __vfork F
GLIBC_2.1.2 __libpthread_version_placeholder F
GLIBC_2.11 pthread_sigqueue F
GLIBC_2.12 pthread_getname_np F
GLIBC_2.12 pthread_mutex_consistent F

View File

@ -1,43 +0,0 @@
/* vfork ABI-compatibility entry points for libpthread.
Copyright (C) 2014-2019 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
<http://www.gnu.org/licenses/>. */
#include <shlib-compat.h>
/* libpthread used to have its own vfork implementation that differed
from libc's only in having a pointless micro-optimization. There
is no longer any use to having a separate copy in libpthread, but
the historical ABI requires it. For static linking, there is no
need to provide anything here--the libc version will be linked in.
For shared library ABI compatibility, there must be __vfork and
vfork symbols in libpthread.so. */
#if (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
|| SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20))
#include <vfork.S>
#endif
#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
compat_symbol (libpthread, __libc_vfork, vfork, GLIBC_2_0);
#endif
#if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)
strong_alias (__libc_vfork, __vfork_compat)
compat_symbol (libpthread, __vfork_compat, __vfork, GLIBC_2_1_2);
#endif

View File

@ -74,7 +74,6 @@ GLIBC_2.4 __read F
GLIBC_2.4 __res_state F
GLIBC_2.4 __send F
GLIBC_2.4 __sigaction F
GLIBC_2.4 __vfork F
GLIBC_2.4 __wait F
GLIBC_2.4 __write F
GLIBC_2.4 _pthread_cleanup_pop F
@ -239,7 +238,6 @@ GLIBC_2.4 siglongjmp F
GLIBC_2.4 sigwait F
GLIBC_2.4 system F
GLIBC_2.4 tcdrain F
GLIBC_2.4 vfork F
GLIBC_2.4 wait F
GLIBC_2.4 waitpid F
GLIBC_2.4 write F

View File

@ -1 +0,0 @@
/* Not needed. */

View File

@ -46,7 +46,6 @@ GLIBC_2.2 __read F
GLIBC_2.2 __res_state F
GLIBC_2.2 __send F
GLIBC_2.2 __sigaction F
GLIBC_2.2 __vfork F
GLIBC_2.2 __wait F
GLIBC_2.2 __write F
GLIBC_2.2 _pthread_cleanup_pop F
@ -192,7 +191,6 @@ GLIBC_2.2 siglongjmp F
GLIBC_2.2 sigwait F
GLIBC_2.2 system F
GLIBC_2.2 tcdrain F
GLIBC_2.2 vfork F
GLIBC_2.2 wait F
GLIBC_2.2 waitpid F
GLIBC_2.2 write F

View File

@ -10,7 +10,6 @@ libc.so: __sigsetjmp
libc.so: _IO_funlockfile
libc.so: __errno_location
libm.so: matherr
libpthread.so: __errno_location
# The main malloc is interposed into the dynamic linker, for
# allocations after the initial link (when dlopen is used).
ld.so: malloc

View File

@ -1,82 +0,0 @@
/* Copyright (C) 2005-2019 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
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#define _ERRNO_H 1
#include <bits/errno.h>
#include <tcb-offsets.h>
/* Clone the calling process, but without copying the whole address space.
The calling process is suspended until the new process exits or is
replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
and the process ID of the new process to the old process. */
.Lthread_start: ASM_LINE_SEP
/* r26, r25, r24, r23 are free since vfork has no arguments */
ENTRY(__vfork)
/* We must not create a frame. When the child unwinds to call
exec it will clobber the same frame that the parent
needs to unwind. */
/* Save the PIC register. */
#ifdef PIC
copy %r19, %r25 /* parent */
#endif
/* Syscall saves and restores all register states */
ble 0x100(%sr2,%r0)
ldi __NR_vfork,%r20
/* Check for error */
ldi -4096,%r1
comclr,>>= %r1,%ret0,%r0 /* Note: unsigned compare. */
b,n .Lerror
/* Return, and DO NOT restore rp. The child may have called
functions that updated the frame's rp. This works because
the kernel ensures rp is preserved across the vfork
syscall. */
bv,n %r0(%rp)
.Lerror:
/* Now we need a stack to call a function. We are assured
that there is no child now, so it's safe to create
a frame. */
stw %rp, -20(%sp)
.cfi_offset 2, -20
stwm %r3, 64(%sp)
.cfi_def_cfa_offset -64
.cfi_offset 3, 0
stw %sp, -4(%sp)
sub %r0,%ret0,%r3
SYSCALL_ERROR_HANDLER
/* Restore the PIC register (in delay slot) on error */
#ifdef PIC
copy %r25, %r19 /* parent */
#else
nop
#endif
/* Write syscall return into errno location */
stw %r3, 0(%ret0)
ldw -84(%sp), %rp
bv %r0(%rp)
ldwm -64(%sp), %r3
PSEUDO_END (__vfork)
libc_hidden_def (__vfork)
weak_alias (__vfork, vfork)

View File

@ -114,7 +114,6 @@ GLIBC_2.0 siglongjmp F
GLIBC_2.0 sigwait F
GLIBC_2.0 system F
GLIBC_2.0 tcdrain F
GLIBC_2.0 vfork F
GLIBC_2.0 wait F
GLIBC_2.0 waitpid F
GLIBC_2.0 write F
@ -155,7 +154,7 @@ GLIBC_2.1 sem_wait F
GLIBC_2.1.1 sem_close F
GLIBC_2.1.1 sem_open F
GLIBC_2.1.1 sem_unlink F
GLIBC_2.1.2 __vfork F
GLIBC_2.1.2 __libpthread_version_placeholder F
GLIBC_2.11 pthread_sigqueue F
GLIBC_2.12 pthread_getname_np F
GLIBC_2.12 pthread_mutex_consistent F

View File

@ -46,7 +46,6 @@ GLIBC_2.2 __read F
GLIBC_2.2 __res_state F
GLIBC_2.2 __send F
GLIBC_2.2 __sigaction F
GLIBC_2.2 __vfork F
GLIBC_2.2 __wait F
GLIBC_2.2 __write F
GLIBC_2.2 _pthread_cleanup_pop F
@ -192,7 +191,6 @@ GLIBC_2.2 siglongjmp F
GLIBC_2.2 sigwait F
GLIBC_2.2 system F
GLIBC_2.2 tcdrain F
GLIBC_2.2 vfork F
GLIBC_2.2 wait F
GLIBC_2.2 waitpid F
GLIBC_2.2 write F

View File

@ -1,48 +0,0 @@
/* vfork ABI-compatibility entry points for libpthread. IA64 version.
Copyright (C) 2014-2019 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
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <shlib-compat.h>
/* libpthread used to have its own vfork implementation that differed
from libc's only in having a pointless micro-optimization. There
is no longer any use to having a separate copy in libpthread, but
the historical ABI requires it. For static linking, there is no
need to provide anything here--the libc version will be linked in.
For shared library ABI compatibility, there must be __vfork and
vfork symbols in libpthread.so. */
#if (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
|| SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20))
LOCAL_LEAF (vfork_compat)
br __libc_vfork
;;
END (vfork_compat)
#endif
#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
weak_alias (vfork_compat, vfork)
compat_symbol (libpthread, vfork_compat, vfork, GLIBC_2_0);
#endif
#if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)
strong_alias (vfork_compat, __vfork_compat)
compat_symbol (libpthread, __vfork_compat, __vfork, GLIBC_2_1_2);
#endif

View File

@ -74,7 +74,6 @@ GLIBC_2.4 __read F
GLIBC_2.4 __res_state F
GLIBC_2.4 __send F
GLIBC_2.4 __sigaction F
GLIBC_2.4 __vfork F
GLIBC_2.4 __wait F
GLIBC_2.4 __write F
GLIBC_2.4 _pthread_cleanup_pop F
@ -239,7 +238,6 @@ GLIBC_2.4 siglongjmp F
GLIBC_2.4 sigwait F
GLIBC_2.4 system F
GLIBC_2.4 tcdrain F
GLIBC_2.4 vfork F
GLIBC_2.4 wait F
GLIBC_2.4 waitpid F
GLIBC_2.4 write F

View File

@ -114,7 +114,6 @@ GLIBC_2.0 siglongjmp F
GLIBC_2.0 sigwait F
GLIBC_2.0 system F
GLIBC_2.0 tcdrain F
GLIBC_2.0 vfork F
GLIBC_2.0 wait F
GLIBC_2.0 waitpid F
GLIBC_2.0 write F
@ -155,7 +154,7 @@ GLIBC_2.1 sem_wait F
GLIBC_2.1.1 sem_close F
GLIBC_2.1.1 sem_open F
GLIBC_2.1.1 sem_unlink F
GLIBC_2.1.2 __vfork F
GLIBC_2.1.2 __libpthread_version_placeholder F
GLIBC_2.11 pthread_sigqueue F
GLIBC_2.12 pthread_getname_np F
GLIBC_2.12 pthread_mutex_consistent F

View File

@ -1 +0,0 @@
#include <sysdeps/unix/sysv/linux/aarch64/pt-vfork.c>

View File

@ -45,7 +45,6 @@ GLIBC_2.18 __read F
GLIBC_2.18 __res_state F
GLIBC_2.18 __send F
GLIBC_2.18 __sigaction F
GLIBC_2.18 __vfork F
GLIBC_2.18 __wait F
GLIBC_2.18 __write F
GLIBC_2.18 _pthread_cleanup_pop F
@ -218,7 +217,6 @@ GLIBC_2.18 siglongjmp F
GLIBC_2.18 sigwait F
GLIBC_2.18 system F
GLIBC_2.18 tcdrain F
GLIBC_2.18 vfork F
GLIBC_2.18 wait F
GLIBC_2.18 waitpid F
GLIBC_2.18 write F

View File

@ -1,49 +0,0 @@
/* vfork ABI-compatibility entry points for libpthread.
Copyright (C) 2014-2019 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
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <shlib-compat.h>
/* libpthread used to have its own vfork implementation that differed
from libc's only in having a pointless micro-optimization. There
is no longer any use to having a separate copy in libpthread, but
the historical ABI requires it. For static linking, there is no
need to provide anything here--the libc version will be linked in.
For shared library ABI compatibility, there must be __vfork and
vfork symbols in libpthread.so.
As of GCC 7, microblaze can *not* rely on the compiler to generate
a tail call from this vfork to __libc_vfork. */
#if (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
|| SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20))
ENTRY (vfork_compat)
bri __libc_vfork@PLT
END (vfork_compat)
#endif
#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
compat_symbol (libpthread, vfork_compat, vfork, GLIBC_2_0)
#endif
#if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)
strong_alias (vfork_compat, vfork_compat2)
compat_symbol (libpthread, vfork_compat2, __vfork, GLIBC_2_1_2)
#endif

View File

@ -114,7 +114,6 @@ GLIBC_2.0 siglongjmp F
GLIBC_2.0 sigwait F
GLIBC_2.0 system F
GLIBC_2.0 tcdrain F
GLIBC_2.0 vfork F
GLIBC_2.0 wait F
GLIBC_2.0 waitpid F
GLIBC_2.0 write F
@ -140,7 +139,6 @@ GLIBC_2.2 __pthread_rwlock_unlock F
GLIBC_2.2 __pthread_rwlock_wrlock F
GLIBC_2.2 __pwrite64 F
GLIBC_2.2 __res_state F
GLIBC_2.2 __vfork F
GLIBC_2.2 lseek64 F
GLIBC_2.2 open64 F
GLIBC_2.2 pread F

View File

@ -114,7 +114,6 @@ GLIBC_2.0 siglongjmp F
GLIBC_2.0 sigwait F
GLIBC_2.0 system F
GLIBC_2.0 tcdrain F
GLIBC_2.0 vfork F
GLIBC_2.0 wait F
GLIBC_2.0 waitpid F
GLIBC_2.0 write F
@ -140,7 +139,6 @@ GLIBC_2.2 __pthread_rwlock_unlock F
GLIBC_2.2 __pthread_rwlock_wrlock F
GLIBC_2.2 __pwrite64 F
GLIBC_2.2 __res_state F
GLIBC_2.2 __vfork F
GLIBC_2.2 lseek64 F
GLIBC_2.2 open64 F
GLIBC_2.2 pread F

View File

@ -1 +0,0 @@
#include <sysdeps/unix/sysv/linux/alpha/pt-vfork.S>

View File

@ -1 +0,0 @@
# Nios2 does not require a stub for vfork in libpthread.

View File

@ -114,7 +114,6 @@ GLIBC_2.0 siglongjmp F
GLIBC_2.0 sigwait F
GLIBC_2.0 system F
GLIBC_2.0 tcdrain F
GLIBC_2.0 vfork F
GLIBC_2.0 wait F
GLIBC_2.0 waitpid F
GLIBC_2.0 write F
@ -155,7 +154,7 @@ GLIBC_2.1 sem_wait F
GLIBC_2.1.1 sem_close F
GLIBC_2.1.1 sem_open F
GLIBC_2.1.1 sem_unlink F
GLIBC_2.1.2 __vfork F
GLIBC_2.1.2 __libpthread_version_placeholder F
GLIBC_2.11 pthread_sigqueue F
GLIBC_2.12 pthread_getname_np F
GLIBC_2.12 pthread_mutex_consistent F

View File

@ -68,7 +68,6 @@ GLIBC_2.3 __read F
GLIBC_2.3 __res_state F
GLIBC_2.3 __send F
GLIBC_2.3 __sigaction F
GLIBC_2.3 __vfork F
GLIBC_2.3 __wait F
GLIBC_2.3 __write F
GLIBC_2.3 _pthread_cleanup_pop F
@ -214,7 +213,6 @@ GLIBC_2.3 siglongjmp F
GLIBC_2.3 sigwait F
GLIBC_2.3 system F
GLIBC_2.3 tcdrain F
GLIBC_2.3 vfork F
GLIBC_2.3 wait F
GLIBC_2.3 waitpid F
GLIBC_2.3 write F

View File

@ -45,7 +45,6 @@ GLIBC_2.17 __read F
GLIBC_2.17 __res_state F
GLIBC_2.17 __send F
GLIBC_2.17 __sigaction F
GLIBC_2.17 __vfork F
GLIBC_2.17 __wait F
GLIBC_2.17 __write F
GLIBC_2.17 _pthread_cleanup_pop F
@ -216,7 +215,6 @@ GLIBC_2.17 siglongjmp F
GLIBC_2.17 sigwait F
GLIBC_2.17 system F
GLIBC_2.17 tcdrain F
GLIBC_2.17 vfork F
GLIBC_2.17 wait F
GLIBC_2.17 waitpid F
GLIBC_2.17 write F

View File

@ -1 +0,0 @@
/* Not needed. */

View File

@ -1 +0,0 @@
#include <sysdeps/unix/sysv/linux/alpha/pt-vfork.S>

View File

@ -114,7 +114,6 @@ GLIBC_2.0 siglongjmp F
GLIBC_2.0 sigwait F
GLIBC_2.0 system F
GLIBC_2.0 tcdrain F
GLIBC_2.0 vfork F
GLIBC_2.0 wait F
GLIBC_2.0 waitpid F
GLIBC_2.0 write F
@ -155,7 +154,7 @@ GLIBC_2.1 sem_wait F
GLIBC_2.1.1 sem_close F
GLIBC_2.1.1 sem_open F
GLIBC_2.1.1 sem_unlink F
GLIBC_2.1.2 __vfork F
GLIBC_2.1.2 __libpthread_version_placeholder F
GLIBC_2.11 pthread_sigqueue F
GLIBC_2.12 pthread_getname_np F
GLIBC_2.12 pthread_mutex_consistent F

View File

@ -48,7 +48,6 @@ GLIBC_2.2 __read F
GLIBC_2.2 __res_state F
GLIBC_2.2 __send F
GLIBC_2.2 __sigaction F
GLIBC_2.2 __vfork F
GLIBC_2.2 __wait F
GLIBC_2.2 __write F
GLIBC_2.2 _pthread_cleanup_pop F
@ -194,7 +193,6 @@ GLIBC_2.2 siglongjmp F
GLIBC_2.2 sigwait F
GLIBC_2.2 system F
GLIBC_2.2 tcdrain F
GLIBC_2.2 vfork F
GLIBC_2.2 wait F
GLIBC_2.2 waitpid F
GLIBC_2.2 write F

View File

@ -46,7 +46,6 @@ GLIBC_2.2 __read F
GLIBC_2.2 __res_state F
GLIBC_2.2 __send F
GLIBC_2.2 __sigaction F
GLIBC_2.2 __vfork F
GLIBC_2.2 __wait F
GLIBC_2.2 __write F
GLIBC_2.2 _pthread_cleanup_pop F
@ -192,7 +191,6 @@ GLIBC_2.2 siglongjmp F
GLIBC_2.2 sigwait F
GLIBC_2.2 system F
GLIBC_2.2 tcdrain F
GLIBC_2.2 vfork F
GLIBC_2.2 wait F
GLIBC_2.2 waitpid F
GLIBC_2.2 write F

View File

@ -1 +0,0 @@
#include <sysdeps/unix/sysv/linux/alpha/pt-vfork.S>

View File

@ -1 +0,0 @@
#include <sysdeps/unix/sysv/linux/alpha/pt-vfork.S>

View File

@ -114,7 +114,6 @@ GLIBC_2.0 siglongjmp F
GLIBC_2.0 sigwait F
GLIBC_2.0 system F
GLIBC_2.0 tcdrain F
GLIBC_2.0 vfork F
GLIBC_2.0 wait F
GLIBC_2.0 waitpid F
GLIBC_2.0 write F
@ -155,7 +154,7 @@ GLIBC_2.1 sem_wait F
GLIBC_2.1.1 sem_close F
GLIBC_2.1.1 sem_open F
GLIBC_2.1.1 sem_unlink F
GLIBC_2.1.2 __vfork F
GLIBC_2.1.2 __libpthread_version_placeholder F
GLIBC_2.11 pthread_sigqueue F
GLIBC_2.12 pthread_getname_np F
GLIBC_2.12 pthread_mutex_consistent F

View File

@ -46,7 +46,6 @@ GLIBC_2.2 __read F
GLIBC_2.2 __res_state F
GLIBC_2.2 __send F
GLIBC_2.2 __sigaction F
GLIBC_2.2 __vfork F
GLIBC_2.2 __wait F
GLIBC_2.2 __write F
GLIBC_2.2 _pthread_cleanup_pop F
@ -192,7 +191,6 @@ GLIBC_2.2 siglongjmp F
GLIBC_2.2 sigwait F
GLIBC_2.2 system F
GLIBC_2.2 tcdrain F
GLIBC_2.2 vfork F
GLIBC_2.2 wait F
GLIBC_2.2 waitpid F
GLIBC_2.2 write F

View File

@ -46,7 +46,6 @@ GLIBC_2.2.5 __read F
GLIBC_2.2.5 __res_state F
GLIBC_2.2.5 __send F
GLIBC_2.2.5 __sigaction F
GLIBC_2.2.5 __vfork F
GLIBC_2.2.5 __wait F
GLIBC_2.2.5 __write F
GLIBC_2.2.5 _pthread_cleanup_pop F
@ -193,7 +192,6 @@ GLIBC_2.2.5 siglongjmp F
GLIBC_2.2.5 sigwait F
GLIBC_2.2.5 system F
GLIBC_2.2.5 tcdrain F
GLIBC_2.2.5 vfork F
GLIBC_2.2.5 wait F
GLIBC_2.2.5 waitpid F
GLIBC_2.2.5 write F

View File

@ -45,7 +45,6 @@ GLIBC_2.16 __read F
GLIBC_2.16 __res_state F
GLIBC_2.16 __send F
GLIBC_2.16 __sigaction F
GLIBC_2.16 __vfork F
GLIBC_2.16 __wait F
GLIBC_2.16 __write F
GLIBC_2.16 _pthread_cleanup_pop F
@ -216,7 +215,6 @@ GLIBC_2.16 siglongjmp F
GLIBC_2.16 sigwait F
GLIBC_2.16 system F
GLIBC_2.16 tcdrain F
GLIBC_2.16 vfork F
GLIBC_2.16 wait F
GLIBC_2.16 waitpid F
GLIBC_2.16 write F