diff options
author | Florian Weimer <fweimer@redhat.com> | 2019-07-02 15:12:20 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2019-07-02 16:51:13 +0200 |
commit | 41d6f74e6cb6a92ab428c11ee1e408b2a16aa1b0 (patch) | |
tree | ece03ae53e8fd589f2c493cb753c132545a49196 /nptl/libpthread-compat.c | |
parent | 27cec9aed97447dff887a88f4241604fffd8c525 (diff) | |
download | glibc-41d6f74e6cb6a92ab428c11ee1e408b2a16aa1b0.tar.gz glibc-41d6f74e6cb6a92ab428c11ee1e408b2a16aa1b0.tar.xz glibc-41d6f74e6cb6a92ab428c11ee1e408b2a16aa1b0.zip |
nptl: Remove vfork IFUNC-based forwarder from libpthread [BZ #20188]
With commit f0b2132b35248c1f4a80f62a2c38cddcc802aa8c ("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.
Diffstat (limited to 'nptl/libpthread-compat.c')
-rw-r--r-- | nptl/libpthread-compat.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/nptl/libpthread-compat.c b/nptl/libpthread-compat.c new file mode 100644 index 0000000000..ea29e9f47b --- /dev/null +++ b/nptl/libpthread-compat.c @@ -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 |