From 7a5db2e82fbb6c3a6e3fdae02b7166c5d0e8c7a8 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Wed, 7 Jul 2021 08:40:41 +0200 Subject: [PATCH] elf: Clean up GLIBC_PRIVATE exports of internal libdl symbols 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. Reviewed-by: Adhemerval Zanella --- 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 d0194a7..5047b14 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) diff --git a/elf/Makefile b/elf/Makefile index 698a6ab..b1e01d9 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 @@ -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 diff --git a/elf/Versions b/elf/Versions index a12d64e..775aab6 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. diff --git a/elf/dl-addr.c b/elf/dl-addr.c index 70a60d5..3226880 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) diff --git a/elf/dl-libc.c b/elf/dl-libc.c index ba792e9..d5bc4a2 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 diff --git a/elf/dl-sym.c b/elf/dl-sym.c index fa0cce6..de5769f 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) diff --git a/elf/tst-libc_dlvsym-dso.c b/elf/tst-libc_dlvsym-dso.c deleted file mode 100644 index 19091dd..0000000 --- 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 - . */ - -#include "tst-libc_dlvsym.h" - -void -compare_vsyms_global (void) -{ - compare_vsyms (); -} diff --git a/elf/tst-libc_dlvsym-static.c b/elf/tst-libc_dlvsym-static.c deleted file mode 100644 index 19c438c..0000000 --- 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 - . */ - -#include - -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 diff --git a/elf/tst-libc_dlvsym.c b/elf/tst-libc_dlvsym.c deleted file mode 100644 index 823643f..0000000 --- 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 - . */ - -#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 diff --git a/elf/tst-libc_dlvsym.h b/elf/tst-libc_dlvsym.h deleted file mode 100644 index 1a8f2e9..0000000 --- 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 - . */ - -/* 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 -#include -#include -#include -#include -#include - -/* 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); -} diff --git a/include/dlfcn.h b/include/dlfcn.h index d4440c5..a4c2837 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; @@ -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 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 -- 2.7.4