[4/4] elf: Clean up GLIBC_PRIVATE exports of internal libdl symbols
Checks
Commit Message
They are no longer needed after everything has been moved into
libc. The _dl_vsym test has to be removed because the symbol
cannot be used outside libc anymore.
---
dlfcn/dlerror.c | 1 -
elf/Makefile | 16 ++---
elf/Versions | 3 -
elf/dl-addr.c | 1 -
elf/dl-libc.c | 4 --
elf/dl-sym.c | 2 -
elf/tst-libc_dlvsym-dso.c | 25 -------
elf/tst-libc_dlvsym-static.c | 32 ---------
elf/tst-libc_dlvsym.c | 34 ---------
elf/tst-libc_dlvsym.h | 130 -----------------------------------
include/dlfcn.h | 30 ++++----
11 files changed, 18 insertions(+), 260 deletions(-)
delete mode 100644 elf/tst-libc_dlvsym-dso.c
delete mode 100644 elf/tst-libc_dlvsym-static.c
delete mode 100644 elf/tst-libc_dlvsym.c
delete mode 100644 elf/tst-libc_dlvsym.h
Comments
On 06/07/2021 14:22, Florian Weimer via Libc-alpha wrote:
> They are no longer needed after everything has been moved into
> libc. The _dl_vsym test has to be removed because the symbol
> cannot be used outside libc anymore.
Is the testing not failing because it is binding to GLIBC_PRIVATE?
LGTM, thanks.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> dlfcn/dlerror.c | 1 -
> elf/Makefile | 16 ++---
> elf/Versions | 3 -
> elf/dl-addr.c | 1 -
> elf/dl-libc.c | 4 --
> elf/dl-sym.c | 2 -
> elf/tst-libc_dlvsym-dso.c | 25 -------
> elf/tst-libc_dlvsym-static.c | 32 ---------
> elf/tst-libc_dlvsym.c | 34 ---------
> elf/tst-libc_dlvsym.h | 130 -----------------------------------
> include/dlfcn.h | 30 ++++----
> 11 files changed, 18 insertions(+), 260 deletions(-)
> delete mode 100644 elf/tst-libc_dlvsym-dso.c
> delete mode 100644 elf/tst-libc_dlvsym-static.c
> delete mode 100644 elf/tst-libc_dlvsym.c
> delete mode 100644 elf/tst-libc_dlvsym.h
>
> diff --git a/dlfcn/dlerror.c b/dlfcn/dlerror.c
> index d0194a7cef..5047b14066 100644
> --- a/dlfcn/dlerror.c
> +++ b/dlfcn/dlerror.c
> @@ -196,4 +196,3 @@ _dlerror_run (void (*operate) (void *), void *args)
> return 1;
> }
> }
> -libc_hidden_def (_dlerror_run)
Ok.
> diff --git a/elf/Makefile b/elf/Makefile
> index 698a6ab985..b1e01d9516 100644
> --- a/elf/Makefile
> +++ b/elf/Makefile
> @@ -165,7 +165,7 @@ tests-static-normal := tst-leaks1-static tst-array1-static tst-array5-static \
>
> tests-static-internal := tst-tls1-static tst-tls2-static \
> tst-ptrguard1-static tst-stackguard1-static \
> - tst-tls1-static-non-pie tst-libc_dlvsym-static
> + tst-tls1-static-non-pie
>
> CRT-tst-tls1-static-non-pie := $(csu-objpfx)crt1.o
> tst-tls1-static-non-pie-no-pie = yes
Ok.
> @@ -229,7 +229,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
> tests-internal += loadtest unload unload2 circleload1 \
> neededtest neededtest2 neededtest3 neededtest4 \
> tst-tls3 tst-tls6 tst-tls7 tst-tls8 tst-dlmopen2 \
> - tst-ptrguard1 tst-stackguard1 tst-libc_dlvsym \
> + tst-ptrguard1 tst-stackguard1 \
> tst-create_format1 tst-tls-surplus tst-dl-hwcaps_split
> tests-container += tst-pldd tst-dlopen-tlsmodid-container \
> tst-dlopen-self-container tst-preload-pthread-libc
Ok.
> @@ -326,7 +326,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
> tst-audit12mod1 tst-audit12mod2 tst-audit12mod3 tst-auditmod12 \
> tst-latepthreadmod $(tst-tls-many-dynamic-modules) \
> tst-nodelete-dlclose-dso tst-nodelete-dlclose-plugin \
> - tst-main1mod tst-libc_dlvsym-dso tst-absolute-sym-lib \
> + tst-main1mod tst-absolute-sym-lib \
> tst-absolute-zero-lib tst-big-note-lib tst-unwind-ctor-lib \
> tst-audit13mod1 tst-sonamemove-linkmod1 \
> tst-sonamemove-runmod1 tst-sonamemove-runmod2 \
Ok.
> @@ -352,7 +352,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
>
> # Most modules build with _ISOMAC defined, but those filtered out
> # depend on internal headers.
> -modules-names-tests = $(filter-out ifuncmod% tst-libc_dlvsym-dso tst-tlsmod%,\
> +modules-names-tests = $(filter-out ifuncmod% tst-tlsmod%,\
> $(modules-names))
>
> ifeq (yes,$(have-mtls-dialect-gnu2))
> @@ -1582,14 +1582,6 @@ LDLIBS-tst-absolute-zero-lib.so = tst-absolute-zero-lib.lds
> $(objpfx)tst-absolute-zero-lib.so: $(LDLIBS-tst-absolute-zero-lib.so)
> $(objpfx)tst-absolute-zero: $(objpfx)tst-absolute-zero-lib.so
>
> -# Both the main program and the DSO for tst-libc_dlvsym need to link
> -# against libdl.
> -$(objpfx)tst-libc_dlvsym-dso.so: $(libsupport)
> -$(objpfx)tst-libc_dlvsym.out: $(objpfx)tst-libc_dlvsym-dso.so
> -tst-libc_dlvsym-static-ENV = \
> - LD_LIBRARY_PATH=$(ld-library-path):$(common-objpfx)dlfcn
> -$(objpfx)tst-libc_dlvsym-static.out: $(objpfx)tst-libc_dlvsym-dso.so
> -
> $(objpfx)tst-big-note: $(objpfx)tst-big-note-lib.so
> # Avoid creating an ABI tag note, which may come before the
> # artificial, large note in tst-big-note-lib.o and invalidate the
Ok.
> diff --git a/elf/Versions b/elf/Versions
> index a12d64e8db..775aab62af 100644
> --- a/elf/Versions
> +++ b/elf/Versions
> @@ -22,9 +22,6 @@ libc {
> %endif
> GLIBC_PRIVATE {
> # functions used in other libraries
> - _dl_addr;
> - _dl_sym; _dl_vsym;
> - __libc_dlclose; __libc_dlopen_mode; __libc_dlsym; __libc_dlvsym;
> __libc_early_init;
>
> # Internal error handling support. Interposes the functions in ld.so.
Ok.
> diff --git a/elf/dl-addr.c b/elf/dl-addr.c
> index 70a60d5b91..3226880d48 100644
> --- a/elf/dl-addr.c
> +++ b/elf/dl-addr.c
> @@ -142,4 +142,3 @@ _dl_addr (const void *address, Dl_info *info,
>
> return result;
> }
> -libc_hidden_def (_dl_addr)
Ok.
> diff --git a/elf/dl-libc.c b/elf/dl-libc.c
> index ba792e9589..d5bc4a277f 100644
> --- a/elf/dl-libc.c
> +++ b/elf/dl-libc.c
> @@ -162,7 +162,6 @@ __libc_dlopen_mode (const char *name, int mode)
> #endif
> return dlerror_run (do_dlopen, &args) ? NULL : (void *) args.map;
> }
> -libc_hidden_def (__libc_dlopen_mode)
>
> #ifndef SHARED
> void *
> @@ -192,7 +191,6 @@ __libc_dlsym (void *map, const char *name)
> return (dlerror_run (do_dlsym, &args) ? NULL
> : (void *) (DL_SYMBOL_ADDRESS (args.loadbase, args.ref)));
> }
> -libc_hidden_def (__libc_dlsym)
>
> /* Replacement for dlvsym. MAP must be a real map. This function
> returns NULL without setting the dlerror value in case of static
> @@ -219,7 +217,6 @@ __libc_dlvsym (void *map, const char *name, const char *version)
> : (void *) (DL_SYMBOL_ADDRESS (args.dlsym.loadbase,
> args.dlsym.ref)));
> }
> -libc_hidden_def (__libc_dlvsym)
>
> int
> __libc_dlclose (void *map)
> @@ -230,7 +227,6 @@ __libc_dlclose (void *map)
> #endif
> return dlerror_run (do_dlclose, map);
> }
> -libc_hidden_def (__libc_dlclose)
>
>
> static bool __libc_freeres_fn_section
Ok.
> diff --git a/elf/dl-sym.c b/elf/dl-sym.c
> index fa0cce678f..de5769f926 100644
> --- a/elf/dl-sym.c
> +++ b/elf/dl-sym.c
> @@ -188,11 +188,9 @@ _dl_vsym (void *handle, const char *name, const char *version, void *who)
>
> return do_sym (handle, name, who, &vers, 0);
> }
> -libc_hidden_def (_dl_vsym)
>
> void *
> _dl_sym (void *handle, const char *name, void *who)
> {
> return do_sym (handle, name, who, NULL, DL_LOOKUP_RETURN_NEWEST);
> }
> -libc_hidden_def (_dl_sym)
Ok.
> diff --git a/elf/tst-libc_dlvsym-dso.c b/elf/tst-libc_dlvsym-dso.c
> deleted file mode 100644
> index 19091ddb41..0000000000
> --- a/elf/tst-libc_dlvsym-dso.c
> +++ /dev/null
> @@ -1,25 +0,0 @@
> -/* Compare dlvsym and __libc_dlvsym results. Shared object code.
> - Copyright (C) 2017-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 "tst-libc_dlvsym.h"
> -
> -void
> -compare_vsyms_global (void)
> -{
> - compare_vsyms ();
> -}
Ok.
> diff --git a/elf/tst-libc_dlvsym-static.c b/elf/tst-libc_dlvsym-static.c
> deleted file mode 100644
> index 19c438c3cd..0000000000
> --- a/elf/tst-libc_dlvsym-static.c
> +++ /dev/null
> @@ -1,32 +0,0 @@
> -/* Compare dlvsym and __libc_dlvsym results. Static version.
> - Copyright (C) 2017-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/xdlfcn.h>
> -
> -static int
> -do_test (void)
> -{
> - void *handle = xdlopen ("tst-libc_dlvsym-dso.so", RTLD_LAZY);
> - void (*compare) (void) = xdlsym (handle, "compare_vsyms_global");
> - compare ();
> - xdlclose (handle);
> -
> - return 0;
> -}
> -
> -#include <support/test-driver.c>
Ok.
> diff --git a/elf/tst-libc_dlvsym.c b/elf/tst-libc_dlvsym.c
> deleted file mode 100644
> index 823643fb1c..0000000000
> --- a/elf/tst-libc_dlvsym.c
> +++ /dev/null
> @@ -1,34 +0,0 @@
> -/* Compare dlvsym and __libc_dlvsym results. Dynamic version.
> - Copyright (C) 2017-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 "tst-libc_dlvsym.h"
> -
> -static int
> -do_test (void)
> -{
> - compare_vsyms ();
> -
> - void *handle = xdlopen ("tst-libc_dlvsym-dso.so", RTLD_LAZY);
> - void (*compare) (void) = xdlsym (handle, "compare_vsyms_global");
> - compare ();
> - xdlclose (handle);
> -
> - return 0;
> -}
> -
> -#include <support/test-driver.c>
Ok.
> diff --git a/elf/tst-libc_dlvsym.h b/elf/tst-libc_dlvsym.h
> deleted file mode 100644
> index 1a8f2e9271..0000000000
> --- a/elf/tst-libc_dlvsym.h
> +++ /dev/null
> @@ -1,130 +0,0 @@
> -/* Compare dlvsym and __libc_dlvsym results. Common code.
> - Copyright (C) 2017-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/>. */
> -
> -/* compare_vsyms is the main entry point for these tests.
> -
> - Indirectly, It calls __libc_dlvsym (from libc.so; internal
> - interface) and dlvsym (from libdl.so; public interface) to compare
> - the results for a selected set of symbols in libc.so which
> - typically have more than one symbol version. The two functions are
> - implemented by somewhat different code, and this test checks that
> - their results are the same.
> -
> - The versions are generated to range from GLIBC_2.0 to GLIBC_2.Y,
> - with Y being the current __GLIBC_MINOR__ version plus two. In
> - addition, there is a list of special symbol versions of the form
> - GLIBC_2.Y.Z, which were used for some releases.
> -
> - Comparing the two dlvsym results at versions which do not actually
> - exist does not test much, but it will not contribute to false test
> - failures, either. */
> -
> -#include <array_length.h>
> -#include <gnu/lib-names.h>
> -#include <stdbool.h>
> -#include <stdio.h>
> -#include <support/check.h>
> -#include <support/xdlfcn.h>
> -
> -/* Run consistency check for versioned symbol NAME@VERSION. NB: We
> - may execute in a shared object, so exit on error for proper error
> - reporting. */
> -static void
> -compare_vsyms_0 (void *libc_handle, const char *name, const char *version,
> - bool *pfound)
> -{
> - void *dlvsym_address = dlvsym (libc_handle, name, version);
> - void *libc_dlvsym_address
> - = __libc_dlvsym (libc_handle, name, version);
> - if (dlvsym_address != libc_dlvsym_address)
> - FAIL_EXIT1 ("%s@%s mismatch: %p != %p",
> - name, version, dlvsym_address, libc_dlvsym_address);
> - if (dlvsym_address != NULL)
> - *pfound = true;
> -}
> -
> -
> -/* Run consistency check for versioned symbol NAME at multiple symbol
> - version. */
> -static void
> -compare_vsyms_1 (void *libc_handle, const char *name)
> -{
> - bool found = false;
> -
> - /* Historic versions which do not follow the usual GLIBC_2.Y
> - pattern, to increase test coverage. Not all architectures have
> - those, but probing additional versions does not hurt. */
> - static const char special_versions[][12] =
> - {
> - "GLIBC_2.1.1",
> - "GLIBC_2.1.2",
> - "GLIBC_2.1.3",
> - "GLIBC_2.1.4",
> - "GLIBC_2.2.1",
> - "GLIBC_2.2.2",
> - "GLIBC_2.2.3",
> - "GLIBC_2.2.4",
> - "GLIBC_2.2.5",
> - "GLIBC_2.2.6",
> - "GLIBC_2.3.2",
> - "GLIBC_2.3.3",
> - "GLIBC_2.3.4",
> - };
> - for (int i = 0; i < array_length (special_versions); ++i)
> - compare_vsyms_0 (libc_handle, name, special_versions[i], &found);
> -
> - /* Iterate to an out-of-range version, to cover some unused symbols
> - as well. */
> - for (int minor_version = 0; minor_version <= __GLIBC_MINOR__ + 2;
> - ++minor_version)
> - {
> - char version[30];
> - snprintf (version, sizeof (version), "GLIBC_%d.%d",
> - __GLIBC__, minor_version);
> - compare_vsyms_0 (libc_handle, name, version, &found);
> - }
> -
> - if (!found)
> - FAIL_EXIT1 ("symbol %s not found at any version", name);
> -}
> -
> -/* Run consistency checks for various symbols which usually have
> - multiple versions. */
> -static void
> -compare_vsyms (void)
> -{
> - /* The minor version loop in compare_vsyms_1 needs updating in case
> - we ever switch to glibc 3.0. */
> - if (__GLIBC__ != 2)
> - FAIL_EXIT1 ("unexpected glibc major version: %d", __GLIBC__);
> -
> - /* __libc_dlvsym does not recognize the special RTLD_* handles, so
> - obtain an explicit handle for libc.so. */
> - void *libc_handle = xdlopen (LIBC_SO, RTLD_LAZY | RTLD_NOLOAD);
> -
> -
> - /* sys_errlist and sys_siglist were deprecated in glibc 2.32 and they are
> - not available on architectures with base ABI newer than 2.32. */
> -#if TEST_COMPAT (libc, GLIBC_2_0, GLIBC_2_32)
> - compare_vsyms_1 (libc_handle, "_sys_errlist");
> - compare_vsyms_1 (libc_handle, "_sys_siglist");
> -#endif
> - compare_vsyms_1 (libc_handle, "quick_exit");
> -
> - xdlclose (libc_handle);
> -}
Ok.
> diff --git a/include/dlfcn.h b/include/dlfcn.h
> index d4440c567e..a4c283728f 100644
> --- a/include/dlfcn.h
> +++ b/include/dlfcn.h
> @@ -45,20 +45,20 @@ extern char **__libc_argv attribute_hidden;
> better error handling semantics for the library. */
> #define __libc_dlopen(name) \
> __libc_dlopen_mode (name, RTLD_NOW | __RTLD_DLOPEN)
> -extern void *__libc_dlopen_mode (const char *__name, int __mode);
> -extern void *__libc_dlsym (void *__map, const char *__name);
> -extern void *__libc_dlvsym (void *map, const char *name, const char *version);
> -extern int __libc_dlclose (void *__map);
> -libc_hidden_proto (__libc_dlopen_mode)
> -libc_hidden_proto (__libc_dlsym)
> -libc_hidden_proto (__libc_dlvsym)
> -libc_hidden_proto (__libc_dlclose)
> +extern void *__libc_dlopen_mode (const char *__name, int __mode)
> + attribute_hidden;
> +extern void *__libc_dlsym (void *__map, const char *__name)
> + attribute_hidden;
> +extern void *__libc_dlvsym (void *map, const char *name, const char *version)
> + attribute_hidden;
> +extern int __libc_dlclose (void *__map)
> + attribute_hidden;
>
> /* Locate shared object containing the given address. */
> #ifdef ElfW
> extern int _dl_addr (const void *address, Dl_info *info,
> - struct link_map **mapp, const ElfW(Sym) **symbolp);
> -libc_hidden_proto (_dl_addr)
> + struct link_map **mapp, const ElfW(Sym) **symbolp)
> + attribute_hidden;
> #endif
>
> struct link_map;
Ok.
> @@ -73,23 +73,21 @@ extern void _dl_close_worker (struct link_map *map, bool force)
> /* Look up NAME in shared object HANDLE (which may be RTLD_DEFAULT or
> RTLD_NEXT). WHO is the calling function, for RTLD_NEXT. Returns
> the symbol value, which may be NULL. */
> -extern void *_dl_sym (void *handle, const char *name, void *who);
> -libc_hidden_proto (_dl_sym)
> +extern void *_dl_sym (void *handle, const char *name, void *who)
> + attribute_hidden;
>
> /* Look up version VERSION of symbol NAME in shared object HANDLE
> (which may be RTLD_DEFAULT or RTLD_NEXT). WHO is the calling
> function, for RTLD_NEXT. Returns the symbol value, which may be
> NULL. */
> extern void *_dl_vsym (void *handle, const char *name, const char *version,
> - void *who);
> -libc_hidden_proto (_dl_vsym)
> + void *who) attribute_hidden;
>
> /* Helper function for <dlfcn.h> functions. Runs the OPERATE function via
> _dl_catch_error. Returns zero for success, nonzero for failure; and
> arranges for `dlerror' to return the error details.
> ARGS is passed as argument to OPERATE. */
> -extern int _dlerror_run (void (*operate) (void *), void *args);
> -libc_hidden_proto (_dlerror_run)
> +extern int _dlerror_run (void (*operate) (void *), void *args) attribute_hidden;
>
> /* This structure is used to make the outer (statically linked)
> implementation of dlopen and related functions to the inner libc
>
Ok.
* Adhemerval Zanella:
> On 06/07/2021 14:22, Florian Weimer via Libc-alpha wrote:
>> They are no longer needed after everything has been moved into
>> libc. The _dl_vsym test has to be removed because the symbol
>> cannot be used outside libc anymore.
>
> Is the testing not failing because it is binding to GLIBC_PRIVATE?
The symbol under test (__libc_dlvsym) is no longer available for dynamic
linking.
Thanks,
Florian
@@ -196,4 +196,3 @@ _dlerror_run (void (*operate) (void *), void *args)
return 1;
}
}
-libc_hidden_def (_dlerror_run)
@@ -165,7 +165,7 @@ tests-static-normal := tst-leaks1-static tst-array1-static tst-array5-static \
tests-static-internal := tst-tls1-static tst-tls2-static \
tst-ptrguard1-static tst-stackguard1-static \
- tst-tls1-static-non-pie tst-libc_dlvsym-static
+ tst-tls1-static-non-pie
CRT-tst-tls1-static-non-pie := $(csu-objpfx)crt1.o
tst-tls1-static-non-pie-no-pie = yes
@@ -229,7 +229,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
tests-internal += loadtest unload unload2 circleload1 \
neededtest neededtest2 neededtest3 neededtest4 \
tst-tls3 tst-tls6 tst-tls7 tst-tls8 tst-dlmopen2 \
- tst-ptrguard1 tst-stackguard1 tst-libc_dlvsym \
+ tst-ptrguard1 tst-stackguard1 \
tst-create_format1 tst-tls-surplus tst-dl-hwcaps_split
tests-container += tst-pldd tst-dlopen-tlsmodid-container \
tst-dlopen-self-container tst-preload-pthread-libc
@@ -326,7 +326,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
tst-audit12mod1 tst-audit12mod2 tst-audit12mod3 tst-auditmod12 \
tst-latepthreadmod $(tst-tls-many-dynamic-modules) \
tst-nodelete-dlclose-dso tst-nodelete-dlclose-plugin \
- tst-main1mod tst-libc_dlvsym-dso tst-absolute-sym-lib \
+ tst-main1mod tst-absolute-sym-lib \
tst-absolute-zero-lib tst-big-note-lib tst-unwind-ctor-lib \
tst-audit13mod1 tst-sonamemove-linkmod1 \
tst-sonamemove-runmod1 tst-sonamemove-runmod2 \
@@ -352,7 +352,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
# Most modules build with _ISOMAC defined, but those filtered out
# depend on internal headers.
-modules-names-tests = $(filter-out ifuncmod% tst-libc_dlvsym-dso tst-tlsmod%,\
+modules-names-tests = $(filter-out ifuncmod% tst-tlsmod%,\
$(modules-names))
ifeq (yes,$(have-mtls-dialect-gnu2))
@@ -1582,14 +1582,6 @@ LDLIBS-tst-absolute-zero-lib.so = tst-absolute-zero-lib.lds
$(objpfx)tst-absolute-zero-lib.so: $(LDLIBS-tst-absolute-zero-lib.so)
$(objpfx)tst-absolute-zero: $(objpfx)tst-absolute-zero-lib.so
-# Both the main program and the DSO for tst-libc_dlvsym need to link
-# against libdl.
-$(objpfx)tst-libc_dlvsym-dso.so: $(libsupport)
-$(objpfx)tst-libc_dlvsym.out: $(objpfx)tst-libc_dlvsym-dso.so
-tst-libc_dlvsym-static-ENV = \
- LD_LIBRARY_PATH=$(ld-library-path):$(common-objpfx)dlfcn
-$(objpfx)tst-libc_dlvsym-static.out: $(objpfx)tst-libc_dlvsym-dso.so
-
$(objpfx)tst-big-note: $(objpfx)tst-big-note-lib.so
# Avoid creating an ABI tag note, which may come before the
# artificial, large note in tst-big-note-lib.o and invalidate the
@@ -22,9 +22,6 @@ libc {
%endif
GLIBC_PRIVATE {
# functions used in other libraries
- _dl_addr;
- _dl_sym; _dl_vsym;
- __libc_dlclose; __libc_dlopen_mode; __libc_dlsym; __libc_dlvsym;
__libc_early_init;
# Internal error handling support. Interposes the functions in ld.so.
@@ -142,4 +142,3 @@ _dl_addr (const void *address, Dl_info *info,
return result;
}
-libc_hidden_def (_dl_addr)
@@ -162,7 +162,6 @@ __libc_dlopen_mode (const char *name, int mode)
#endif
return dlerror_run (do_dlopen, &args) ? NULL : (void *) args.map;
}
-libc_hidden_def (__libc_dlopen_mode)
#ifndef SHARED
void *
@@ -192,7 +191,6 @@ __libc_dlsym (void *map, const char *name)
return (dlerror_run (do_dlsym, &args) ? NULL
: (void *) (DL_SYMBOL_ADDRESS (args.loadbase, args.ref)));
}
-libc_hidden_def (__libc_dlsym)
/* Replacement for dlvsym. MAP must be a real map. This function
returns NULL without setting the dlerror value in case of static
@@ -219,7 +217,6 @@ __libc_dlvsym (void *map, const char *name, const char *version)
: (void *) (DL_SYMBOL_ADDRESS (args.dlsym.loadbase,
args.dlsym.ref)));
}
-libc_hidden_def (__libc_dlvsym)
int
__libc_dlclose (void *map)
@@ -230,7 +227,6 @@ __libc_dlclose (void *map)
#endif
return dlerror_run (do_dlclose, map);
}
-libc_hidden_def (__libc_dlclose)
static bool __libc_freeres_fn_section
@@ -188,11 +188,9 @@ _dl_vsym (void *handle, const char *name, const char *version, void *who)
return do_sym (handle, name, who, &vers, 0);
}
-libc_hidden_def (_dl_vsym)
void *
_dl_sym (void *handle, const char *name, void *who)
{
return do_sym (handle, name, who, NULL, DL_LOOKUP_RETURN_NEWEST);
}
-libc_hidden_def (_dl_sym)
deleted file mode 100644
@@ -1,25 +0,0 @@
-/* Compare dlvsym and __libc_dlvsym results. Shared object code.
- Copyright (C) 2017-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 "tst-libc_dlvsym.h"
-
-void
-compare_vsyms_global (void)
-{
- compare_vsyms ();
-}
deleted file mode 100644
@@ -1,32 +0,0 @@
-/* Compare dlvsym and __libc_dlvsym results. Static version.
- Copyright (C) 2017-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/xdlfcn.h>
-
-static int
-do_test (void)
-{
- void *handle = xdlopen ("tst-libc_dlvsym-dso.so", RTLD_LAZY);
- void (*compare) (void) = xdlsym (handle, "compare_vsyms_global");
- compare ();
- xdlclose (handle);
-
- return 0;
-}
-
-#include <support/test-driver.c>
deleted file mode 100644
@@ -1,34 +0,0 @@
-/* Compare dlvsym and __libc_dlvsym results. Dynamic version.
- Copyright (C) 2017-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 "tst-libc_dlvsym.h"
-
-static int
-do_test (void)
-{
- compare_vsyms ();
-
- void *handle = xdlopen ("tst-libc_dlvsym-dso.so", RTLD_LAZY);
- void (*compare) (void) = xdlsym (handle, "compare_vsyms_global");
- compare ();
- xdlclose (handle);
-
- return 0;
-}
-
-#include <support/test-driver.c>
deleted file mode 100644
@@ -1,130 +0,0 @@
-/* Compare dlvsym and __libc_dlvsym results. Common code.
- Copyright (C) 2017-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/>. */
-
-/* compare_vsyms is the main entry point for these tests.
-
- Indirectly, It calls __libc_dlvsym (from libc.so; internal
- interface) and dlvsym (from libdl.so; public interface) to compare
- the results for a selected set of symbols in libc.so which
- typically have more than one symbol version. The two functions are
- implemented by somewhat different code, and this test checks that
- their results are the same.
-
- The versions are generated to range from GLIBC_2.0 to GLIBC_2.Y,
- with Y being the current __GLIBC_MINOR__ version plus two. In
- addition, there is a list of special symbol versions of the form
- GLIBC_2.Y.Z, which were used for some releases.
-
- Comparing the two dlvsym results at versions which do not actually
- exist does not test much, but it will not contribute to false test
- failures, either. */
-
-#include <array_length.h>
-#include <gnu/lib-names.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <support/check.h>
-#include <support/xdlfcn.h>
-
-/* Run consistency check for versioned symbol NAME@VERSION. NB: We
- may execute in a shared object, so exit on error for proper error
- reporting. */
-static void
-compare_vsyms_0 (void *libc_handle, const char *name, const char *version,
- bool *pfound)
-{
- void *dlvsym_address = dlvsym (libc_handle, name, version);
- void *libc_dlvsym_address
- = __libc_dlvsym (libc_handle, name, version);
- if (dlvsym_address != libc_dlvsym_address)
- FAIL_EXIT1 ("%s@%s mismatch: %p != %p",
- name, version, dlvsym_address, libc_dlvsym_address);
- if (dlvsym_address != NULL)
- *pfound = true;
-}
-
-
-/* Run consistency check for versioned symbol NAME at multiple symbol
- version. */
-static void
-compare_vsyms_1 (void *libc_handle, const char *name)
-{
- bool found = false;
-
- /* Historic versions which do not follow the usual GLIBC_2.Y
- pattern, to increase test coverage. Not all architectures have
- those, but probing additional versions does not hurt. */
- static const char special_versions[][12] =
- {
- "GLIBC_2.1.1",
- "GLIBC_2.1.2",
- "GLIBC_2.1.3",
- "GLIBC_2.1.4",
- "GLIBC_2.2.1",
- "GLIBC_2.2.2",
- "GLIBC_2.2.3",
- "GLIBC_2.2.4",
- "GLIBC_2.2.5",
- "GLIBC_2.2.6",
- "GLIBC_2.3.2",
- "GLIBC_2.3.3",
- "GLIBC_2.3.4",
- };
- for (int i = 0; i < array_length (special_versions); ++i)
- compare_vsyms_0 (libc_handle, name, special_versions[i], &found);
-
- /* Iterate to an out-of-range version, to cover some unused symbols
- as well. */
- for (int minor_version = 0; minor_version <= __GLIBC_MINOR__ + 2;
- ++minor_version)
- {
- char version[30];
- snprintf (version, sizeof (version), "GLIBC_%d.%d",
- __GLIBC__, minor_version);
- compare_vsyms_0 (libc_handle, name, version, &found);
- }
-
- if (!found)
- FAIL_EXIT1 ("symbol %s not found at any version", name);
-}
-
-/* Run consistency checks for various symbols which usually have
- multiple versions. */
-static void
-compare_vsyms (void)
-{
- /* The minor version loop in compare_vsyms_1 needs updating in case
- we ever switch to glibc 3.0. */
- if (__GLIBC__ != 2)
- FAIL_EXIT1 ("unexpected glibc major version: %d", __GLIBC__);
-
- /* __libc_dlvsym does not recognize the special RTLD_* handles, so
- obtain an explicit handle for libc.so. */
- void *libc_handle = xdlopen (LIBC_SO, RTLD_LAZY | RTLD_NOLOAD);
-
-
- /* sys_errlist and sys_siglist were deprecated in glibc 2.32 and they are
- not available on architectures with base ABI newer than 2.32. */
-#if TEST_COMPAT (libc, GLIBC_2_0, GLIBC_2_32)
- compare_vsyms_1 (libc_handle, "_sys_errlist");
- compare_vsyms_1 (libc_handle, "_sys_siglist");
-#endif
- compare_vsyms_1 (libc_handle, "quick_exit");
-
- xdlclose (libc_handle);
-}
@@ -45,20 +45,20 @@ extern char **__libc_argv attribute_hidden;
better error handling semantics for the library. */
#define __libc_dlopen(name) \
__libc_dlopen_mode (name, RTLD_NOW | __RTLD_DLOPEN)
-extern void *__libc_dlopen_mode (const char *__name, int __mode);
-extern void *__libc_dlsym (void *__map, const char *__name);
-extern void *__libc_dlvsym (void *map, const char *name, const char *version);
-extern int __libc_dlclose (void *__map);
-libc_hidden_proto (__libc_dlopen_mode)
-libc_hidden_proto (__libc_dlsym)
-libc_hidden_proto (__libc_dlvsym)
-libc_hidden_proto (__libc_dlclose)
+extern void *__libc_dlopen_mode (const char *__name, int __mode)
+ attribute_hidden;
+extern void *__libc_dlsym (void *__map, const char *__name)
+ attribute_hidden;
+extern void *__libc_dlvsym (void *map, const char *name, const char *version)
+ attribute_hidden;
+extern int __libc_dlclose (void *__map)
+ attribute_hidden;
/* Locate shared object containing the given address. */
#ifdef ElfW
extern int _dl_addr (const void *address, Dl_info *info,
- struct link_map **mapp, const ElfW(Sym) **symbolp);
-libc_hidden_proto (_dl_addr)
+ struct link_map **mapp, const ElfW(Sym) **symbolp)
+ attribute_hidden;
#endif
struct link_map;
@@ -73,23 +73,21 @@ extern void _dl_close_worker (struct link_map *map, bool force)
/* Look up NAME in shared object HANDLE (which may be RTLD_DEFAULT or
RTLD_NEXT). WHO is the calling function, for RTLD_NEXT. Returns
the symbol value, which may be NULL. */
-extern void *_dl_sym (void *handle, const char *name, void *who);
-libc_hidden_proto (_dl_sym)
+extern void *_dl_sym (void *handle, const char *name, void *who)
+ attribute_hidden;
/* Look up version VERSION of symbol NAME in shared object HANDLE
(which may be RTLD_DEFAULT or RTLD_NEXT). WHO is the calling
function, for RTLD_NEXT. Returns the symbol value, which may be
NULL. */
extern void *_dl_vsym (void *handle, const char *name, const char *version,
- void *who);
-libc_hidden_proto (_dl_vsym)
+ void *who) attribute_hidden;
/* Helper function for <dlfcn.h> functions. Runs the OPERATE function via
_dl_catch_error. Returns zero for success, nonzero for failure; and
arranges for `dlerror' to return the error details.
ARGS is passed as argument to OPERATE. */
-extern int _dlerror_run (void (*operate) (void *), void *args);
-libc_hidden_proto (_dlerror_run)
+extern int _dlerror_run (void (*operate) (void *), void *args) attribute_hidden;
/* This structure is used to make the outer (statically linked)
implementation of dlopen and related functions to the inner libc