From patchwork Tue Jul 6 17:22:19 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 44184 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 51D073890407 for ; Tue, 6 Jul 2021 17:25:40 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 51D073890407 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1625592340; bh=zxt44xLTQqpK5z9ZJ9eihwsKdkFuCl+SicjGFgjs4DA=; h=To:Subject:In-Reply-To:References:Date:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=daoSUW3lOdQ6/dwcCdEFZ0AOTEj/ORm1JlG46kVNtE30GBic4LTHuOawOZsd3DfTT 8FZBdFCFrfRzn+bHtlU5ArkojZUknv3fSlWp2nPFaTyU0zRz9xHGsrZ4CI9fu/jyU3 LYB1XpFzXoRLk57Snl2mQPwVM+dS/BsdemBNvEB0= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by sourceware.org (Postfix) with ESMTP id 202EF388F002 for ; Tue, 6 Jul 2021 17:22:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 202EF388F002 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-321-850FJrzTOACdaCMMnzgvUA-1; Tue, 06 Jul 2021 13:22:23 -0400 X-MC-Unique: 850FJrzTOACdaCMMnzgvUA-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D14621800D41 for ; Tue, 6 Jul 2021 17:22:22 +0000 (UTC) Received: from oldenburg.str.redhat.com (ovpn-115-5.ams2.redhat.com [10.36.115.5]) by smtp.corp.redhat.com (Postfix) with ESMTPS id C28165D6CF for ; Tue, 6 Jul 2021 17:22:21 +0000 (UTC) To: libc-alpha@sourceware.org Subject: [PATCH 4/4] elf: Clean up GLIBC_PRIVATE exports of internal libdl symbols In-Reply-To: References: X-From-Line: 15a8064ccf12caf7ba1088de4b3022aae75610d2 Mon Sep 17 00:00:00 2001 Message-Id: <15a8064ccf12caf7ba1088de4b3022aae75610d2.1625591725.git.fweimer@redhat.com> Date: Tue, 06 Jul 2021 19:22:19 +0200 User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, KAM_STOCKGEN, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP, URIBL_BLACK autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Florian Weimer via Libc-alpha From: Florian Weimer Reply-To: Florian Weimer Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" 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 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 - . */ - -#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 - . */ - -#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 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 - . */ - -#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 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 - . */ - -/* 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 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 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