Skip to content

Commit

Permalink
nptl: Remove vfork IFUNC-based forwarder from libpthread [BZ #20188]
Browse files Browse the repository at this point in the history
With commit f0b2132 ("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.
  • Loading branch information
fweimer-rh committed Jul 2, 2019
1 parent 27cec9a commit 41d6f74
Show file tree
Hide file tree
Showing 40 changed files with 129 additions and 397 deletions.
81 changes: 81 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,84 @@
2019-07-01 Florian Weimer <[email protected]>

[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 <[email protected]>

[BZ #24757]
Expand Down
5 changes: 3 additions & 2 deletions nptl/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand All @@ -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 \
Expand Down
5 changes: 2 additions & 3 deletions nptl/Versions
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -152,7 +151,7 @@ libpthread {
}

GLIBC_2.1.2 {
__vfork;
__libpthread_version_placeholder;
}

GLIBC_2.2 {
Expand Down
37 changes: 37 additions & 0 deletions nptl/libpthread-compat.c
Original file line number Diff line number Diff line change
@@ -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
65 changes: 0 additions & 65 deletions nptl/pt-vfork.c

This file was deleted.

2 changes: 0 additions & 2 deletions sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
54 changes: 0 additions & 54 deletions sysdeps/unix/sysv/linux/aarch64/pt-vfork.c

This file was deleted.

3 changes: 1 addition & 2 deletions sysdeps/unix/sysv/linux/alpha/libpthread.abilist
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
43 changes: 0 additions & 43 deletions sysdeps/unix/sysv/linux/alpha/pt-vfork.S

This file was deleted.

2 changes: 0 additions & 2 deletions sysdeps/unix/sysv/linux/arm/libpthread.abilist
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
1 change: 0 additions & 1 deletion sysdeps/unix/sysv/linux/csky/pt-vfork.S

This file was deleted.

2 changes: 0 additions & 2 deletions sysdeps/unix/sysv/linux/hppa/libpthread.abilist
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
Loading

0 comments on commit 41d6f74

Please sign in to comment.