From patchwork Fri Mar 19 20:07:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 42707 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 401AD385783D; Fri, 19 Mar 2021 20:07:38 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 401AD385783D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1616184458; bh=OQRlv48YuI6D/e/cKJpjWEIgLVBH9Z7NB1gaGMsGxwk=; 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=x4t3/21MZ6+7fEVJt8sEC7X7QdCRbrkHNoymaBIkuSDGqo/trDxftaJZK7O0Pfpoj Mu46p3Gth1LgqEVhg/6Z+C7hzlyGe/Q4surnGPzkUBd/y6CnmwyM9e9n4O0x+p2jcY RFcDKqTKFDp1gY/zh3AclfZ55JgrSaxBX3v1/knE= 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 [170.10.133.124]) by sourceware.org (Postfix) with ESMTP id C41523857C60 for ; Fri, 19 Mar 2021 20:07:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org C41523857C60 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-22-nnFXYYkpOKyb4dutfM6b-g-1; Fri, 19 Mar 2021 16:07:33 -0400 X-MC-Unique: nnFXYYkpOKyb4dutfM6b-g-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 323AF800D53 for ; Fri, 19 Mar 2021 20:07:32 +0000 (UTC) Received: from oldenburg.str.redhat.com (ovpn-112-80.ams2.redhat.com [10.36.112.80]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 892F15D9F2 for ; Fri, 19 Mar 2021 20:07:31 +0000 (UTC) To: libc-alpha@sourceware.org Subject: [PATCH v2 1/3] Change how the symbol_version_reference macro is defined In-Reply-To: References: Message-Id: <786259031f9a7cc6c329b3e8548549d3f7a48742.1616184336.git.fweimer@redhat.com> Date: Fri, 19 Mar 2021 21:07:41 +0100 User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-12.5 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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@sourceware.org Sender: "Libc-alpha" A subsequent change will require including for defining symbol_version_reference. should not include for _ISOMAC, so it cannot define symbol_version_reference anymore, but symbol_version_reference is needed even for _ISOMAC. Moving the definition of symbol_version_reference to a separate file makes it possible to use a single definition for both cases. Reviewed-by: Adhemerval Zanella --- include/libc-symbols.h | 16 +++------------ include/shlib-compat.h | 3 +++ sysdeps/generic/libc-symver.h | 38 +++++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 13 deletions(-) create mode 100644 sysdeps/generic/libc-symver.h diff --git a/include/libc-symbols.h b/include/libc-symbols.h index c83e550b03..ce5f75a1a2 100644 --- a/include/libc-symbols.h +++ b/include/libc-symbols.h @@ -59,19 +59,6 @@ # define IN_MODULE (-1) #endif -/* Use symbol_version_reference to specify the version a symbol - reference should link to. Use symbol_version or - default_symbol_version for the definition of a versioned symbol. - The difference is that the latter is a no-op in non-shared - builds. */ -#ifdef __ASSEMBLER__ -# define symbol_version_reference(real, name, version) \ - .symver real, name##@##version -#else /* !__ASSEMBLER__ */ -# define symbol_version_reference(real, name, version) \ - __asm__ (".symver " #real "," #name "@" #version) -#endif - #ifndef _ISOMAC /* This is defined for the compilation of all C library code. features.h @@ -97,6 +84,9 @@ #include +/* Obtain the definition of symbol_version_reference. */ +#include + /* When PIC is defined and SHARED isn't defined, we are building PIE by default. */ #if defined PIC && !defined SHARED diff --git a/include/shlib-compat.h b/include/shlib-compat.h index 28baef1ea4..b874e2588f 100644 --- a/include/shlib-compat.h +++ b/include/shlib-compat.h @@ -21,6 +21,9 @@ # include +/* Obtain the definition of symbol_version_reference. */ +#include + /* The file abi-versions.h (generated by scripts/abi-versions.awk) defines symbols like `ABI_libm_GLIBC_2_0' for each version set in the source code for each library. For a version set that is subsumed by a later diff --git a/sysdeps/generic/libc-symver.h b/sysdeps/generic/libc-symver.h new file mode 100644 index 0000000000..11c77ae1cd --- /dev/null +++ b/sysdeps/generic/libc-symver.h @@ -0,0 +1,38 @@ +/* Symbol version management. + Copyright (C) 1995-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 + . */ + +/* This file is included from for !_ISOMAC, and + unconditionally from . */ + +#ifndef _LIBC_SYMVER_H +#define _LIBC_SYMVER_H 1 + +/* Use symbol_version_reference to specify the version a symbol + reference should link to. Use symbol_version or + default_symbol_version for the definition of a versioned symbol. + The difference is that the latter is a no-op in non-shared + builds. */ +#ifdef __ASSEMBLER__ +# define symbol_version_reference(real, name, version) \ + .symver real, name##@##version +#else /* !__ASSEMBLER__ */ +# define symbol_version_reference(real, name, version) \ + __asm__ (".symver " #real "," #name "@" #version) +#endif + +#endif /* _LIBC_SYMVER_H */ From patchwork Fri Mar 19 20:07:47 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 42709 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 4F92A3865479; Fri, 19 Mar 2021 20:07:45 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4F92A3865479 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1616184465; bh=G/n0fRU/7FJ/uNcfjSYWIA304g+DAtkUMFXzh8+JgK4=; 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=vpOIX01G+NDT3sBXOovrhCv4r6GzVhwvP+M7Se541OTzyDBEzNbGCDKOPV6irOyRH IKSHaVe4Q5x841zT/qWJtDuCLL8x95HoDiQzASJnuJeLOK0ehBfYuocYuivs4sxuij eu1cd4HFQZT+vMVw7b0A4zck13U/fkgtmFAlYHjI= 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 [63.128.21.124]) by sourceware.org (Postfix) with ESMTP id 41E693857C60 for ; Fri, 19 Mar 2021 20:07:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 41E693857C60 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-422-ACEDPxC0PYexiLZ-eTgSvQ-1; Fri, 19 Mar 2021 16:07:38 -0400 X-MC-Unique: ACEDPxC0PYexiLZ-eTgSvQ-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 649489CC03 for ; Fri, 19 Mar 2021 20:07:37 +0000 (UTC) Received: from oldenburg.str.redhat.com (ovpn-112-80.ams2.redhat.com [10.36.112.80]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BC4981C95E for ; Fri, 19 Mar 2021 20:07:36 +0000 (UTC) To: libc-alpha@sourceware.org Subject: [PATCH v2 2/3] locale: Use compat_symbol_reference in _nl_postload_ctype In-Reply-To: References: Message-Id: Date: Fri, 19 Mar 2021 21:07:47 +0100 User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 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, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP, URIBL_BLACK autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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@sourceware.org Sender: "Libc-alpha" These symbol usages are not definitions, so compat_symbol_reference is more appropriate than compat_symbol. compat_symbol_reference is also safe to emit multiple times (in case the inline assembly is duplicated; this is possible because it is nested in a function). compat_symbol does not necessarily have this property because it is intended to provide a symbol definition. Reviewed-by: Adhemerval Zanella --- locale/lc-ctype.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/locale/lc-ctype.c b/locale/lc-ctype.c index 1db0605c82..7c97480cbd 100644 --- a/locale/lc-ctype.c +++ b/locale/lc-ctype.c @@ -93,12 +93,14 @@ _nl_postload_ctype (void) We need those relocations so that a versioned definition with a COPY reloc in an executable will override the libc.so definition. */ -compat_symbol (libc, __ctype_b, __ctype_b, GLIBC_2_0); -compat_symbol (libc, __ctype_tolower, __ctype_tolower, GLIBC_2_0); -compat_symbol (libc, __ctype_toupper, __ctype_toupper, GLIBC_2_0); -compat_symbol (libc, __ctype32_b, __ctype32_b, GLIBC_2_0); -compat_symbol (libc, __ctype32_tolower, __ctype32_tolower, GLIBC_2_2); -compat_symbol (libc, __ctype32_toupper, __ctype32_toupper, GLIBC_2_2); +compat_symbol_reference (libc, __ctype_b, __ctype_b, GLIBC_2_0); +compat_symbol_reference (libc, __ctype_tolower, __ctype_tolower, GLIBC_2_0); +compat_symbol_reference (libc, __ctype_toupper, __ctype_toupper, GLIBC_2_0); +compat_symbol_reference (libc, __ctype32_b, __ctype32_b, GLIBC_2_0); +compat_symbol_reference (libc, __ctype32_tolower, __ctype32_tolower, + GLIBC_2_2); +compat_symbol_reference (libc, __ctype32_toupper, __ctype32_toupper, + GLIBC_2_2); __ctype_b = current (uint16_t, CLASS, 128); __ctype_toupper = current (int32_t, TOUPPER, 128); From patchwork Fri Mar 19 20:07:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 42710 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 D5179386F411; Fri, 19 Mar 2021 20:07:51 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D5179386F411 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1616184471; bh=ia0jGpEF1K0xOEKtMpwZnriWn7YNhm6r8E1I1uaeC8Y=; 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=avJx95T/b/i3Ua/DebUTbjf/S48WJOVbEKYw16doA7o0ccmnoxh/GL7YjAblvagJe lAPsPtisxhgrYeNtp5xm+MYz13A3F8zVcLrGosrI+UskqzH3nk5WVTjNCWy5o7OtOn okueejrF4rvidwGEMe6viU+6/Ot8Xarf/0ujT1dk= 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 [170.10.133.124]) by sourceware.org (Postfix) with ESMTP id 2138A3857C60 for ; Fri, 19 Mar 2021 20:07:48 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 2138A3857C60 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-102-534k7V19N1uQIzxZuTvFLw-1; Fri, 19 Mar 2021 16:07:45 -0400 X-MC-Unique: 534k7V19N1uQIzxZuTvFLw-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 18F501034AE7 for ; Fri, 19 Mar 2021 20:07:45 +0000 (UTC) Received: from oldenburg.str.redhat.com (ovpn-112-80.ams2.redhat.com [10.36.112.80]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0A4EF5D9F2 for ; Fri, 19 Mar 2021 20:07:43 +0000 (UTC) To: libc-alpha@sourceware.org Subject: [PATCH v2 3/3] Fold compat_symbol_unique functionality into compat_symbol In-Reply-To: References: Message-Id: <07c2defd7f03c5f2493a4132de673f33457d7806.1616184336.git.fweimer@redhat.com> Date: Fri, 19 Mar 2021 21:07:54 +0100 User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, DKIM_INVALID, DKIM_SIGNED, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_SHORT, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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@sourceware.org Sender: "Libc-alpha" This eliminates the need for intermediate aliases for defining multiple symbol versions, for both compat_symbol and versioned_symbol. Some binutils versions do not suport multiple versions per symbol on some targets, so aliases are automatically introduced, similar to what compat_symbol_unique did. To reduce symbol table sizes, a configure check is added to avoid these aliases if they are not needed. The new mechanism works with data symbols as well as function symbols, due to the way an assembler-level redirect is used. It is not compatible with weak symbols for old binutils versions, which is why the definition of __malloc_initialize_hook had to be changed. This is not a loss of functionality because weak symbols do not matter to dynamic linking. The placeholder symbol needs repeating in nptl/libpthread-compat.c now that compat_symbol is used, but that seems more obvious than introducing yet another macro. A subtle difference was that compat_symbol_unique made the symbol global automatically. compat_symbol does not do this, so static had to be removed from the definition of __libpthread_version_placeholder. To verify the versioned_symbol functionality, the explicit aliases are eliminated from the clock_* function definitions. Reviewed-by: Adhemeval Zanella --- config.h.in | 4 ++ configure | 28 +++++++++++++ configure.ac | 23 +++++++++++ include/libc-symbols.h | 5 ++- include/shlib-compat.h | 78 ++++++++++++++++------------------- malloc/malloc.c | 2 +- nptl/libpthread-compat.c | 16 +++---- sysdeps/generic/libc-symver.h | 56 +++++++++++++++++++++++-- sysdeps/ia64/libc-symver.h | 33 +++++++++++++++ time/clock_getcpuclockid.c | 3 +- time/clock_getres.c | 3 +- time/clock_gettime.c | 3 +- time/clock_nanosleep.c | 3 +- time/clock_settime.c | 3 +- 14 files changed, 193 insertions(+), 67 deletions(-) create mode 100644 sysdeps/ia64/libc-symver.h diff --git a/config.h.in b/config.h.in index f21bf04e47..ca1547ae67 100644 --- a/config.h.in +++ b/config.h.in @@ -190,6 +190,10 @@ /* Define if the linker defines __ehdr_start. */ #undef HAVE_EHDR_START +/* Define to 1 if the assembler needs intermediate aliases to define + multiple symbol versions for one symbol. */ +#define SYMVER_NEEDS_ALIAS 0 + /* */ diff --git a/configure b/configure index 37cef37413..bf33439a7f 100755 --- a/configure +++ b/configure @@ -6590,6 +6590,34 @@ elif test "$libc_cv_ehdr_start" = broken; then $as_echo "$as_me: WARNING: linker is broken -- you should upgrade" >&2;} fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the assembler requires one version per symbol" >&5 +$as_echo_n "checking whether the assembler requires one version per symbol... " >&6; } +if ${libc_cv_symver_needs_alias+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.s <&5; then + libc_cv_symver_needs_alias=no + else + libc_cv_symver_needs_alias=yes + fi + rm conftest.* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_symver_needs_alias" >&5 +$as_echo "$libc_cv_symver_needs_alias" >&6; } +if test "$libc_cv_symver_needs_alias" = yes; then + $as_echo "#define SYMVER_NEEDS_ALIAS 1" >>confdefs.h + +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_trap with no external dependencies" >&5 $as_echo_n "checking for __builtin_trap with no external dependencies... " >&6; } if ${libc_cv_builtin_trap+:} false; then : diff --git a/configure.ac b/configure.ac index 16b15b6f90..7225f35ea6 100644 --- a/configure.ac +++ b/configure.ac @@ -1673,6 +1673,29 @@ elif test "$libc_cv_ehdr_start" = broken; then AC_MSG_WARN([linker is broken -- you should upgrade]) fi +dnl Starting with binutils 2.35, GAS can attach multiple symbol versions +dnl to one symbol (PR 23840). +AC_CACHE_CHECK(whether the assembler requires one version per symbol, + libc_cv_symver_needs_alias, [dnl + cat > conftest.s <&AS_MESSAGE_LOG_FD; then + libc_cv_symver_needs_alias=no + else + libc_cv_symver_needs_alias=yes + fi + rm conftest.* +]) +if test "$libc_cv_symver_needs_alias" = yes; then + AC_DEFINE(SYMVER_NEEDS_ALIAS) +fi + AC_CACHE_CHECK(for __builtin_trap with no external dependencies, libc_cv_builtin_trap, [dnl libc_cv_builtin_trap=no diff --git a/include/libc-symbols.h b/include/libc-symbols.h index ce5f75a1a2..546fc26a7b 100644 --- a/include/libc-symbols.h +++ b/include/libc-symbols.h @@ -404,12 +404,13 @@ for linking") symbol_version_reference(real, name, version) # define default_symbol_version(real, name, version) \ _default_symbol_version(real, name, version) +/* See . */ # ifdef __ASSEMBLER__ # define _default_symbol_version(real, name, version) \ - .symver real, name##@##@##version + _set_symbol_version (real, name@@version) # else # define _default_symbol_version(real, name, version) \ - __asm__ (".symver " #real "," #name "@@" #version) + _set_symbol_version (real, #name "@@" #version) # endif /* Evalutes to a string literal for VERSION in LIB. */ diff --git a/include/shlib-compat.h b/include/shlib-compat.h index b874e2588f..6429ed2275 100644 --- a/include/shlib-compat.h +++ b/include/shlib-compat.h @@ -62,6 +62,16 @@ i.e. either GLIBC_2.1 or the "earliest version" specified in shlib-versions if that is newer. */ +/* versioned_symbol (LIB, LOCAL, SYMBOL, VERSION) emits a definition + of SYMBOL with a default (@@) VERSION appropriate for LIB. (The + actually emited symbol version is adjusted according to the + baseline symbol version for LIB.) The address of the symbol is + taken from LOCAL. Properties of LOCAL are copied to the exported + symbol. In particular, LOCAL itself should be global. It is + unspecified whether SYMBOL@VERSION is associated with LOCAL, or if + an intermediate alias is created. If LOCAL and SYMBOL are + distinct, and LOCAL is also intended for export, its version should + be specified explicitly with versioned_symbol, too. */ # define versioned_symbol(lib, local, symbol, version) \ versioned_symbol_1 (lib, local, symbol, version) # define versioned_symbol_1(lib, local, symbol, version) \ @@ -69,44 +79,25 @@ # define versioned_symbol_2(local, symbol, name) \ default_symbol_version (local, symbol, name) +/* compat_symbol is like versioned_symbol, but emits a compatibility + version (with @ instead of @@). The same issue related to + intermediate aliases applies, so LOCAL should not be listed in the + Versions file, or otherwise it can be exported with an undesired + default symbol version. */ # define compat_symbol(lib, local, symbol, version) \ - compat_symbol_reference (lib, local, symbol, version) - -/* This is similar to compat_symbol, but allows versioning the same symbol - to multiple version without having multiple symbol definitions. For - instance: - - #if (SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_2)) - compat_symbol_unique (libc, old_foo, GLIBC_2_1_2) - #endif - - #if (SHLIB_COMPAT (libpthread, GLIBC_2_2_6, GLIBC_2_3)) - compat_symbol_unique (libc, old_foo, GLIBC_2_2_6) - #endif - - Internally it creates a unique strong alias to the input symbol and - creates one compat_symbol on the alias. Using the above example, - it is similar to: - - #if (SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_2)) - strong_alias (old_foo, old_foo__COUNTER__) - compat_symbol (libc, old_foo__COUNTER__, foo, GLIBC_2_2) - #endif. - - With __COUNTER__ being a monotonic number generated by the compiler. */ - -# define __compat_symbol_unique_concat(x, y) x ## y -# define _compat_symbol_unique_concat(x, y) \ - __compat_symbol_unique_concat (x, y) -# define _compat_symbol_unique_alias(name) \ - _compat_symbol_unique_concat (name, __COUNTER__) -# define _compat_symbol_unique(lib, orig_name, name, version) \ - strong_alias (orig_name, name) \ - compat_symbol (lib, name, orig_name, version) -# define compat_symbol_unique(lib, name, version) \ - _compat_symbol_unique (lib, name, _compat_symbol_unique_alias (name), \ - version) - + compat_symbol_1 (lib, local, symbol, version) +# define compat_symbol_1(lib, local, symbol, version) \ + compat_symbol_2 (local, symbol, VERSION_##lib##_##version) +/* See . */ +# ifdef __ASSEMBLER__ +#define compat_symbol_2(local, symbol, name) \ + _set_symbol_version (local, symbol@name) +# else +# define compat_symbol_2(local, symbol, name) \ + compat_symbol_3 (local, symbol, name) +# define compat_symbol_3(local, symbol, name) \ + _set_symbol_version (local, #symbol "@" #name) +# endif #else /* Not compiling ELF shared libraries at all, so never any old versions. */ @@ -118,16 +109,17 @@ /* This should not appear outside `#if SHLIB_COMPAT (...)'. */ # define compat_symbol(lib, local, symbol, version) ... -# define compat_symbol_unique(lib, name, version) ... #endif /* Use compat_symbol_reference for a reference *or* definition of a - specific version of a symbol. Definitions are primarily used to - ensure tests reference the exact compat symbol required, or define an - interposing symbol of the right version e.g. __malloc_initialize_hook - in mcheck-init.c. Use compat_symbol to define such a symbol within - the shared libraries that are built for users. */ + specific version of a symbol. compat_symbol_reference does not + create intermediate aliases. Definitions are primarily used to + ensure tests reference the exact compat symbol required, or define + an interposing symbol of the right version e.g., + __malloc_initialize_hook in mcheck-init.c. Use compat_symbol to + define such a symbol within the shared libraries that are built for + users. */ #define compat_symbol_reference(lib, local, symbol, version) \ compat_symbol_reference_1 (lib, local, symbol, version) #define compat_symbol_reference_1(lib, local, symbol, version) \ diff --git a/malloc/malloc.c b/malloc/malloc.c index 1f4bbd8edf..f23027c13d 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -1991,7 +1991,7 @@ static void *memalign_hook_ini (size_t alignment, size_t sz, const void *caller) __THROW; #if HAVE_MALLOC_INIT_HOOK -void weak_variable (*__malloc_initialize_hook) (void) = NULL; +void (*__malloc_initialize_hook) (void); compat_symbol (libc, __malloc_initialize_hook, __malloc_initialize_hook, GLIBC_2_0); #endif diff --git a/nptl/libpthread-compat.c b/nptl/libpthread-compat.c index 820dcd6a8f..da537af76e 100644 --- a/nptl/libpthread-compat.c +++ b/nptl/libpthread-compat.c @@ -20,10 +20,10 @@ #include #ifdef SHARED -static void +void attribute_compat_text_section __attribute_used__ -__libpthread_version_placeholder (void) +__libpthread_version_placeholder_1 (void) { } #endif @@ -37,16 +37,16 @@ __libpthread_version_placeholder (void) there are plenty of other symbols which populate those later versions. */ #if (SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_2)) -compat_symbol_unique (libpthread, - __libpthread_version_placeholder, GLIBC_2_1_2); +compat_symbol (libpthread, __libpthread_version_placeholder_1, + __libpthread_version_placeholder, GLIBC_2_1_2); #endif #if (SHLIB_COMPAT (libpthread, GLIBC_2_2_3, GLIBC_2_2_4)) -compat_symbol_unique (libpthread, - __libpthread_version_placeholder, GLIBC_2_2_3); +compat_symbol (libpthread, __libpthread_version_placeholder_1, + __libpthread_version_placeholder, GLIBC_2_2_3); #endif #if (SHLIB_COMPAT (libpthread, GLIBC_2_2_6, GLIBC_2_3)) -compat_symbol_unique (libpthread, - __libpthread_version_placeholder, GLIBC_2_2_6); +compat_symbol (libpthread, __libpthread_version_placeholder_1, + __libpthread_version_placeholder, GLIBC_2_2_6); #endif diff --git a/sysdeps/generic/libc-symver.h b/sysdeps/generic/libc-symver.h index 11c77ae1cd..69d147e2a8 100644 --- a/sysdeps/generic/libc-symver.h +++ b/sysdeps/generic/libc-symver.h @@ -22,17 +22,67 @@ #ifndef _LIBC_SYMVER_H #define _LIBC_SYMVER_H 1 +#include + /* Use symbol_version_reference to specify the version a symbol reference should link to. Use symbol_version or default_symbol_version for the definition of a versioned symbol. The difference is that the latter is a no-op in non-shared - builds. */ + builds. + + _set_symbol_version is similar to symbol_version_reference, except + that this macro expects the name and symbol version as a single + string or token sequence, with an @ or @@ separator. (A string is + used in C mode and a token sequence in assembler mode.) + _set_symbol_version only be used for definitions because it may + introduce an alias symbol that would not be globally unique for + mere references. The _set_symbol_version macro is used to define + default_symbol_version and compat_symbol. */ + #ifdef __ASSEMBLER__ # define symbol_version_reference(real, name, version) \ .symver real, name##@##version -#else /* !__ASSEMBLER__ */ +#else # define symbol_version_reference(real, name, version) \ __asm__ (".symver " #real "," #name "@" #version) -#endif +#endif /* !__ASSEMBLER__ */ + +#if SYMVER_NEEDS_ALIAS +/* If the assembler cannot support multiple versions for the same + symbol, introduce __SInnn_ aliases to which the symbol version is + attached. */ +# define __symbol_version_unique_concat(x, y) __SI ## x ## _ ## y +# define _symbol_version_unique_concat(x, y) \ + __symbol_version_unique_concat (x, y) +# define _symbol_version_unique_alias(name) \ + _symbol_version_unique_concat (name, __COUNTER__) +# ifdef __ASSEMBLER__ +# define _set_symbol_version_2(real, alias, name_version) \ + .globl alias ASM_LINE_SEP \ + .equiv alias, real ASM_LINE_SEP \ + .symver alias, name_version +# else +# define _set_symbol_version_2(real, alias, name_version) \ + __asm__ (".globl " #alias "\n\t" \ + ".equiv " #alias ", " #real "\n\t" \ + ".symver " #alias "," name_version) +# endif +# define _set_symbol_version_1(real, alias, name_version) \ + _set_symbol_version_2 (real, alias, name_version) +/* REAL must be globally unique, so that the counter also produces + globally unique symbols. */ +# define _set_symbol_version(real, name_version) \ + _set_symbol_version_1 (real, _symbol_version_unique_alias (real), \ + name_version) +# else /* !SYMVER_NEEDS_ALIAS */ +# ifdef __ASSEMBLER__ +# define _set_symbol_version(real, name_version) \ + .symver real, name_version +# else +# define _set_symbol_version(real, name_version) \ + __asm__ (".symver " #real "," name_version) +# endif +#endif /* !SYMVER_NEEDS_ALIAS */ + #endif /* _LIBC_SYMVER_H */ diff --git a/sysdeps/ia64/libc-symver.h b/sysdeps/ia64/libc-symver.h new file mode 100644 index 0000000000..63a3e58dde --- /dev/null +++ b/sysdeps/ia64/libc-symver.h @@ -0,0 +1,33 @@ +/* Symbol version management. ia64 version. + Copyright (C) 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 + . */ + +#ifndef _LIBC_SYMVER_H + +#include + +/* ia64 recognizes loc1 as a register name. Add the # suffix to all + symbol references. */ +#if !defined (__ASSEMBLER__) && SYMVER_NEEDS_ALIAS +#undef _set_symbol_version_2 +# define _set_symbol_version_2(real, alias, name_version) \ + __asm__ (".globl " #alias "#\n\t" \ + ".equiv " #alias ", " #real "#\n\t" \ + ".symver " #alias "#," name_version) +#endif + +#endif /* _LIBC_SYMVER_H */ diff --git a/time/clock_getcpuclockid.c b/time/clock_getcpuclockid.c index c148d96c5c..220e2eb016 100644 --- a/time/clock_getcpuclockid.c +++ b/time/clock_getcpuclockid.c @@ -42,6 +42,5 @@ versioned_symbol (libc, __clock_getcpuclockid, clock_getcpuclockid, GLIBC_2_17); /* clock_getcpuclockid moved to libc in version 2.17; old binaries may expect the symbol version it had in librt. */ #if SHLIB_COMPAT (libc, GLIBC_2_2, GLIBC_2_17) -strong_alias (__clock_getcpuclockid, __clock_getcpuclockid_2); -compat_symbol (libc, __clock_getcpuclockid_2, clock_getcpuclockid, GLIBC_2_2); +compat_symbol (libc, __clock_getcpuclockid, clock_getcpuclockid, GLIBC_2_2); #endif diff --git a/time/clock_getres.c b/time/clock_getres.c index 4b31893849..9099b62672 100644 --- a/time/clock_getres.c +++ b/time/clock_getres.c @@ -32,8 +32,7 @@ versioned_symbol (libc, __clock_getres, clock_getres, GLIBC_2_17); /* clock_getres moved to libc in version 2.17; old binaries may expect the symbol version it had in librt. */ #if SHLIB_COMPAT (libc, GLIBC_2_2, GLIBC_2_17) -strong_alias (__clock_getres, __clock_getres_2); -compat_symbol (libc, __clock_getres_2, clock_getres, GLIBC_2_2); +compat_symbol (libc, __clock_getres, clock_getres, GLIBC_2_2); #endif stub_warning (clock_getres) diff --git a/time/clock_gettime.c b/time/clock_gettime.c index fdeaaca3f8..e8e129d201 100644 --- a/time/clock_gettime.c +++ b/time/clock_gettime.c @@ -33,8 +33,7 @@ versioned_symbol (libc, __clock_gettime, clock_gettime, GLIBC_2_17); /* clock_gettime moved to libc in version 2.17; old binaries may expect the symbol version it had in librt. */ #if SHLIB_COMPAT (libc, GLIBC_2_2, GLIBC_2_17) -strong_alias (__clock_gettime, __clock_gettime_2); -compat_symbol (libc, __clock_gettime_2, clock_gettime, GLIBC_2_2); +compat_symbol (libc, __clock_gettime, clock_gettime, GLIBC_2_2); #endif stub_warning (clock_gettime) diff --git a/time/clock_nanosleep.c b/time/clock_nanosleep.c index 7ecb1cfcb8..57b3af2a70 100644 --- a/time/clock_nanosleep.c +++ b/time/clock_nanosleep.c @@ -38,8 +38,7 @@ versioned_symbol (libc, __clock_nanosleep, clock_nanosleep, GLIBC_2_17); /* clock_nanosleep moved to libc in version 2.17; old binaries may expect the symbol version it had in librt. */ #if SHLIB_COMPAT (libc, GLIBC_2_2, GLIBC_2_17) -strong_alias (__clock_nanosleep, __clock_nanosleep_2); -compat_symbol (libc, __clock_nanosleep_2, clock_nanosleep, GLIBC_2_2); +compat_symbol (libc, __clock_nanosleep, clock_nanosleep, GLIBC_2_2); #endif stub_warning (clock_nanosleep) diff --git a/time/clock_settime.c b/time/clock_settime.c index 7676aaeb23..4df4ec56d1 100644 --- a/time/clock_settime.c +++ b/time/clock_settime.c @@ -33,8 +33,7 @@ versioned_symbol (libc, __clock_settime, clock_settime, GLIBC_2_17); /* clock_settime moved to libc in version 2.17; old binaries may expect the symbol version it had in librt. */ #if SHLIB_COMPAT (libc, GLIBC_2_2, GLIBC_2_17) -strong_alias (__clock_settime, __clock_settime_2); -compat_symbol (libc, __clock_settime_2, clock_settime, GLIBC_2_2); +compat_symbol (libc, __clock_settime, clock_settime, GLIBC_2_2); #endif stub_warning (clock_settime)