From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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 EEA733848010 for ; Mon, 31 May 2021 14:11:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org EEA733848010 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-438-_jrWW1aFNSKVzue85daUCA-1; Mon, 31 May 2021 10:11:37 -0400 X-MC-Unique: _jrWW1aFNSKVzue85daUCA-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 C0E74803626 for ; Mon, 31 May 2021 14:11:36 +0000 (UTC) Received: from oldenburg.str.redhat.com (ovpn-113-228.ams2.redhat.com [10.36.113.228]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 29DA919C71 for ; Mon, 31 May 2021 14:11:35 +0000 (UTC) From: Florian Weimer To: libc-alpha@sourceware.org Subject: [PATCH v2 04/16] Add libc ABI extension kludge for baseline-violating libdl symbols In-Reply-To: References: X-From-Line: 84f59adc6d3b0b84d2ce8ab94e91e1a08a33989e Mon Sep 17 00:00:00 2001 Message-Id: <84f59adc6d3b0b84d2ce8ab94e91e1a08a33989e.1622469908.git.fweimer@redhat.com> Date: Mon, 31 May 2021 16:11:34 +0200 User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (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 Content-Type: text/plain X-Spam-Status: No, score=-12.7 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 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-List-Received-Date: Mon, 31 May 2021 14:11:42 -0000 Some targets have a GLIBC_2.0 baseline for libdl, while using GLIBC_2.2 for libc. This means that the generated libc.map file does not have any version nodes for GLIBC_2.0 or GLIBC_2.1. However, moving symbols from libdl into libc needs such version nodes. (Future symbol moves from librt will need this as well.) This kludge is only necessary for symbols predating GLIBC_2.2 because the affected targets use GLIBC_2.2 as the baseline for libc. Given the small number and fixexd set of affected architectures, no generic mechanism is implemented, and instead the map file fragment is hard-coded in scripts/versions.mk. The compat_symbol macro already emits the appropriate version strings, so no adjustments are needed there. --- scripts/versions.awk | 26 ++++++++++++++++++- sysdeps/unix/sysv/linux/hppa/Versions | 1 + sysdeps/unix/sysv/linux/ia64/Versions | 1 + sysdeps/unix/sysv/linux/sh/Versions | 1 + .../unix/sysv/linux/sparc/sparc64/Versions | 1 + 5 files changed, 29 insertions(+), 1 deletion(-) diff --git a/scripts/versions.awk b/scripts/versions.awk index a7154480e3..1e8d8e4dc5 100644 --- a/scripts/versions.awk +++ b/scripts/versions.awk @@ -93,6 +93,26 @@ function ord(c) { printf("%s %s %s\n", actlib, sortver, $0) | sort; } +# Some targets do not set the ABI baseline for libdl. As a result, +# symbols originally in libdl need to be moved under historic symbol +# versions, without altering the baseline version for libc itself. +/^ *!libc_abi_extension/ { + libc_abi_extension_active = 1; +} + +function libc_abi_extension() { + # No local: * here, so that we do not have to update this script + # if symbols are moved into libc. The abilist files and the other + # targets (with a real GLIBC_2.0 baseline) provide testing + # coverage. + printf("\ +GLIBC_2.0 {\n\ +};\n\ +GLIBC_2.1 {\n\ +} GLIBC_2.0;\n\ +") > outfile; + return "GLIBC_2.1"; +} function closeversion(name, oldname) { printf(" local:\n *;\n") > outfile; @@ -154,7 +174,11 @@ END { oldlib = $1; real_outfile = buildroot oldlib ".map"; outfile = real_outfile "T"; - veryoldver = ""; + if ($1 == "libc" && libc_abi_extension_active) { + veryoldver = libc_abi_extension(); + } else { + veryoldver = ""; + } printf(" %s.map", oldlib); } if ($2 != oldver) { diff --git a/sysdeps/unix/sysv/linux/hppa/Versions b/sysdeps/unix/sysv/linux/hppa/Versions index 9532d207fc..8969fc08af 100644 --- a/sysdeps/unix/sysv/linux/hppa/Versions +++ b/sysdeps/unix/sysv/linux/hppa/Versions @@ -1,3 +1,4 @@ +!libc_abi_extension libc { GLIBC_2.1 { _sys_errlist; sys_errlist; _sys_nerr; sys_nerr; diff --git a/sysdeps/unix/sysv/linux/ia64/Versions b/sysdeps/unix/sysv/linux/ia64/Versions index f6994151aa..7cac57a8e1 100644 --- a/sysdeps/unix/sysv/linux/ia64/Versions +++ b/sysdeps/unix/sysv/linux/ia64/Versions @@ -1,3 +1,4 @@ +!libc_abi_extension libc { GLIBC_2.2 { ioperm; iopl; diff --git a/sysdeps/unix/sysv/linux/sh/Versions b/sysdeps/unix/sysv/linux/sh/Versions index 19ba1d8d91..fc89ff1c18 100644 --- a/sysdeps/unix/sysv/linux/sh/Versions +++ b/sysdeps/unix/sysv/linux/sh/Versions @@ -1,3 +1,4 @@ +!libc_abi_extension libc { GLIBC_2.2 { # functions used in other libraries diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/Versions b/sysdeps/unix/sysv/linux/sparc/sparc64/Versions index fbea1bb2ef..3059d56f80 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/Versions +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/Versions @@ -1,3 +1,4 @@ +!libc_abi_extension libc { GLIBC_2.0 { # Exception handling support functions from libgcc -- 2.31.1