Successfully identified regression in *glibc* in CI configuration tcwg_cross/gnu-master-aarch64-build_cross. So far, this commit has regressed CI configurations: - tcwg_cross/gnu-master-aarch64-build_cross
Culprit: <cut> commit 7a5db2e82fbb6c3a6e3fdae02b7166c5d0e8c7a8 Author: Florian Weimer fweimer@redhat.com Date: Wed Jul 7 08:40:41 2021 +0200
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 adhemerval.zanella@linaro.org </cut>
Results regressed to (for first_bad == 7a5db2e82fbb6c3a6e3fdae02b7166c5d0e8c7a8) # reset_artifacts: -10 # true: 0 # build_abe binutils: 1 # build_abe stage1: 2 # build_abe linux: 3 # First few build errors in logs: # 00:00:14 make[2]: *** [/home/tcwg-buildslave/workspace/tcwg_gnu_0/abe/builds/x86_64-pc-linux-gnu/aarch64-linux-gnu/glibc-glibc.git~master/sysd-rules:483: /home/tcwg-buildslave/workspace/tcwg_gnu_0/abe/builds/x86_64-pc-linux-gnu/aarch64-linux-gnu/glibc-glibc.git~master/csu/start.o] Error 1 # 00:00:14 make[2]: *** [/home/tcwg-buildslave/workspace/tcwg_gnu_0/abe/builds/x86_64-pc-linux-gnu/aarch64-linux-gnu/glibc-glibc.git~master/sysd-rules:499: /home/tcwg-buildslave/workspace/tcwg_gnu_0/abe/builds/x86_64-pc-linux-gnu/aarch64-linux-gnu/glibc-glibc.git~master/csu/start.os] Error 1 # 00:00:14 make[2]: *** [/home/tcwg-buildslave/workspace/tcwg_gnu_0/abe/builds/x86_64-pc-linux-gnu/aarch64-linux-gnu/glibc-glibc.git~master/sysd-rules:483: /home/tcwg-buildslave/workspace/tcwg_gnu_0/abe/builds/x86_64-pc-linux-gnu/aarch64-linux-gnu/glibc-glibc.git~master/csu/crtn.o] Error 1 # 00:00:14 make[2]: *** [/home/tcwg-buildslave/workspace/tcwg_gnu_0/abe/builds/x86_64-pc-linux-gnu/aarch64-linux-gnu/glibc-glibc.git~master/sysd-rules:483: /home/tcwg-buildslave/workspace/tcwg_gnu_0/abe/builds/x86_64-pc-linux-gnu/aarch64-linux-gnu/glibc-glibc.git~master/csu/crti.o] Error 1 # 00:00:14 make[2]: *** [../o-iterator.mk:9: /home/tcwg-buildslave/workspace/tcwg_gnu_0/abe/builds/x86_64-pc-linux-gnu/aarch64-linux-gnu/glibc-glibc.git~master/csu/check_fds.o] Error 1 # 00:00:14 make[2]: *** [../o-iterator.mk:9: /home/tcwg-buildslave/workspace/tcwg_gnu_0/abe/builds/x86_64-pc-linux-gnu/aarch64-linux-gnu/glibc-glibc.git~master/csu/check_fds.os] Error 1 # 00:00:14 ../sysdeps/aarch64/nptl/tls.h:91:19: error: ‘__builtin_thread_pointer’ is not supported on this target # 00:00:14 make[2]: *** [/home/tcwg-buildslave/workspace/tcwg_gnu_0/abe/builds/x86_64-pc-linux-gnu/aarch64-linux-gnu/glibc-glibc.git~master/sysd-rules:485: /home/tcwg-buildslave/workspace/tcwg_gnu_0/abe/builds/x86_64-pc-linux-gnu/aarch64-linux-gnu/glibc-glibc.git~master/csu/libc-tls.o] Error 1 # 00:00:14 ../sysdeps/unix/sysv/linux/aarch64/sysdep.h:190:17: error: invalid register name for ‘_x0’ # 00:00:14 ../sysdeps/unix/sysv/linux/aarch64/sysdep.h:174:22: error: invalid register name for ‘_x8’
from (for last_good == ceda365fbac3083e16eed07892fbd5970b3839a0) # reset_artifacts: -10 # true: 0 # build_abe binutils: 1 # build_abe stage1: 2 # build_abe linux: 3 # build_abe glibc: 4 # build_abe stage2: 5 # build_abe qemu: 6
Artifacts of last_good build: https://ci.linaro.org/job/tcwg_cross-bisect-gnu-master-aarch64-build_cross/3... Artifacts of first_bad build: https://ci.linaro.org/job/tcwg_cross-bisect-gnu-master-aarch64-build_cross/3... Build top page/logs: https://ci.linaro.org/job/tcwg_cross-bisect-gnu-master-aarch64-build_cross/3...
Configuration details:
Reproduce builds: <cut> mkdir investigate-glibc-7a5db2e82fbb6c3a6e3fdae02b7166c5d0e8c7a8 cd investigate-glibc-7a5db2e82fbb6c3a6e3fdae02b7166c5d0e8c7a8
git clone https://git.linaro.org/toolchain/jenkins-scripts
mkdir -p artifacts/manifests curl -o artifacts/manifests/build-baseline.sh https://ci.linaro.org/job/tcwg_cross-bisect-gnu-master-aarch64-build_cross/3... --fail curl -o artifacts/manifests/build-parameters.sh https://ci.linaro.org/job/tcwg_cross-bisect-gnu-master-aarch64-build_cross/3... --fail curl -o artifacts/test.sh https://ci.linaro.org/job/tcwg_cross-bisect-gnu-master-aarch64-build_cross/3... --fail chmod +x artifacts/test.sh
# Reproduce the baseline build (build all pre-requisites) ./jenkins-scripts/tcwg_gnu-build.sh @@ artifacts/manifests/build-baseline.sh
cd glibc
# Reproduce first_bad build git checkout --detach 7a5db2e82fbb6c3a6e3fdae02b7166c5d0e8c7a8 ../artifacts/test.sh
# Reproduce last_good build git checkout --detach ceda365fbac3083e16eed07892fbd5970b3839a0 ../artifacts/test.sh
cd .. </cut>
History of pending regressions and results: https://git.linaro.org/toolchain/ci/base-artifacts.git/log/?h=linaro-local/c...
Artifacts: https://ci.linaro.org/job/tcwg_cross-bisect-gnu-master-aarch64-build_cross/3... Build log: https://ci.linaro.org/job/tcwg_cross-bisect-gnu-master-aarch64-build_cross/3...
Full commit (up to 1000 lines): <cut> commit 7a5db2e82fbb6c3a6e3fdae02b7166c5d0e8c7a8 Author: Florian Weimer fweimer@redhat.com Date: Wed Jul 7 08:40:41 2021 +0200
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 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(-)
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) 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 @@ -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 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. 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) 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 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) 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 (); -} 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> 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> 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); -} 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; @@ -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 </cut>