From patchwork Wed May 22 17:53:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 1937947 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=bqU2ih4Y; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=8.43.85.97; helo=server2.sourceware.org; envelope-from=libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4VkzSK6rk2z20PS for ; Thu, 23 May 2024 03:53:37 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D100738654B0 for ; Wed, 22 May 2024 17:53:34 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pf1-x42f.google.com (mail-pf1-x42f.google.com [IPv6:2607:f8b0:4864:20::42f]) by sourceware.org (Postfix) with ESMTPS id 9A5BE3858D26 for ; Wed, 22 May 2024 17:53:14 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 9A5BE3858D26 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 9A5BE3858D26 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::42f ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1716400397; cv=none; b=axzTh6PY9wYnyuJ6kLAqJw5NiianiFQ18kvvqH1PPKKBwRXvr+OxVWmoCyIXYs9bUWCdIqCK1gvOF8f07naE4kOCLdjmBhMB9FCJENULe77SaaXLj4n68LJ7PO+oGtMHRWw3RbNc9oI8BGnZ12VZlYrWD+bMogcM72pdffejCl4= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1716400397; c=relaxed/simple; bh=T6v3C8UUXHfgFuIoAkQ4SMlRxPRf9/EJZKcbQB/l0Kg=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=MRGR3Zj4KOSY6yrMIitqrE94DRw0yozOyOD3eeqmy2kmDEwxM+lD1DHMifDYgxcC0WZmTaFqNoZ9+jdZ7o83JEORdSOCdUj71yIjKC3qoMLLbWC3si0F5YkTJPJA1aL6wckJ+d8rahUuZnXtMNRvODhonYms5s9++jqnV4HmFQc= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-pf1-x42f.google.com with SMTP id d2e1a72fcca58-6f6bddf57f6so1893956b3a.0 for ; Wed, 22 May 2024 10:53:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1716400393; x=1717005193; darn=sourceware.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=P1ZXOmhpzYwgcKMUkEWZ4zWzKO1NGDZtTPHtV3Vxtsg=; b=bqU2ih4YAHXOF9mpnN/LJheiwBqHHW3tLfkwz3kyEVBx+LaK0NU4bUbPTi8wxz9ano Opb35t7JLqIZek7y1JG2Eiy0yU9L79KKvCERn2ZJ6Z74MJ/VVedWaM3L8sAAlgiMl6M0 5MFX45ZPaFr935mVL0b5W5lwA44Eg9WxILvWoz83bivcWZ2g3oidgB+/SRQ56f+l26Wc WkLoNf3LkF5qeP0zh2hLayaZEeDeyK+sQtWlIgpT5SB6iYhgTqMXLyatcMwmu5OODyzZ 6i50a5m6tLuANMUsW3+I7xoDs8XDe6MZhERumvM8XWGX8hVgcYjqAYDlDlPoIC1syofa xkYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1716400393; x=1717005193; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=P1ZXOmhpzYwgcKMUkEWZ4zWzKO1NGDZtTPHtV3Vxtsg=; b=vzWBakhYMvW8sdhnKUPTt6VaSukM8Cf5ZevJiS9XU9cQ3dqj+m2XjiYIG9F+mJ3ID8 0s3uu469FeK90enrMw/X1UE9EUnT5uaj/HJQGk6ORascafOBKtCpbw5bICEXKeBE+HEc H/GGcHSrbNqr9gy7ts2GHvLBWz5Mw0P1+BGDbmhFG5uc6EAOmuM4Jn0S8iQ06IdOTWxC XuLfOwRRrK1MIXxYvaBdVMR3nRg+JVZ9i8eOo4Le+uTokXlJRRf1jVq426hvdrjshhWB hfPNZDi+3SuRSqq33jYB4iUkwFWrn6Ojh5ByR9dVbH81LVIBt3IyOgSIBIJbIp9BOcQL vZZQ== X-Gm-Message-State: AOJu0YxlGjc4Rkw4yaJzXHhCQQcqEYL1kcB+hw6sMIh8NylKo/gKXotC 0s6qZiaPbHe6/dyh60TfJacCJ2TC8wkfRlr+Nkq6VwLGmJqeSt6iC5im5w== X-Google-Smtp-Source: AGHT+IHEqv4k4hbeudwZpEndiTnwqKZOmiP+wcNJfypsxJkS+F02sCEAy0oqB7UPxBvl3zU6xTzjWw== X-Received: by 2002:a05:6a20:5501:b0:1af:d017:c13e with SMTP id adf61e73a8af0-1b1f8ad2f73mr2577273637.41.1716400393217; Wed, 22 May 2024 10:53:13 -0700 (PDT) Received: from gnu-cfl-3.localdomain ([172.56.169.221]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-659f66bf18csm11114703a12.46.2024.05.22.10.53.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 May 2024 10:53:10 -0700 (PDT) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id CE26974019D; Wed, 22 May 2024 10:53:07 -0700 (PDT) From: "H.J. Lu" To: libc-alpha@sourceware.org Cc: adhemerval.zanella@linaro.org, fweimer@redhat.com Subject: [PATCH v2] Check global symbols in static library against shared library Date: Wed, 22 May 2024 10:53:07 -0700 Message-ID: <20240522175307.604741-1-hjl.tools@gmail.com> X-Mailer: git-send-email 2.45.1 MIME-Version: 1.0 X-Spam-Status: No, score=-3022.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org Here is the v2 patch to check global symbols in static library against shared library. The test results may not be clean due to: https://sourceware.org/bugzilla/show_bug.cgi?id=31781 https://sourceware.org/bugzilla/show_bug.cgi?id=31779 https://sourceware.org/bugzilla/show_bug.cgi?id=31778 https://sourceware.org/bugzilla/show_bug.cgi?id=31777 H.J. --- Changes in v2: 1. Add export LC_ALL for nm. 2. Pass $* to check-static-abi.sh. 3. Don't pass $(static-only-symbols) to check-static-abi.sh. 4. Get installed static libraries from $(extra-libs). 5. Add shared-only-symbols for powerpc and sparc32. --- The shared library ABIs are checked against the abilist files. Extract global symbol definitions from static libraries and check them against exported global symbol definitions in shared libraries. Special cases are handled: 1. Some global symbols are available only in libc.so. 2. Some math functions are in libc.a, but not in libc.so. 3. The libgcc symbols are in libc.so only on some targets. 4. Internal symbols have global visibility only in the static library. This check is enabled only if nm displays symbol versions for dynamic symbols. Signed-off-by: H.J. Lu --- Makerules | 68 ++++++++++++++++++++++ configure | 42 ++++++++++++++ configure.ac | 31 ++++++++++ elf/Makefile | 15 +++++ math/Makefile | 4 ++ scripts/check-static-abi.sh | 103 +++++++++++++++++++++++++++++++++ sysdeps/alpha/Makefile | 5 ++ sysdeps/generic/Makefile | 11 ++++ sysdeps/powerpc/Makefile | 5 ++ sysdeps/s390/Makefile | 5 ++ sysdeps/sparc/sparc32/Makefile | 13 +++++ 11 files changed, 302 insertions(+) create mode 100644 scripts/check-static-abi.sh diff --git a/Makerules b/Makerules index 275110dda8..fd38d650c9 100644 --- a/Makerules +++ b/Makerules @@ -1238,6 +1238,21 @@ ifeq ($(build-shared),yes) LC_ALL=C $(OBJDUMP) --dynamic-syms $< > $@T mv -f $@T $@ +# Extract global symbol definitions from shared and static libraries. +NM-FLAGS=--extern-only --defined-only --just-symbols + +%.dynamicsymlist: %.so + LC_ALL=C; export LC_ALL; $(NM) --dynamic $(NM-FLAGS) $< \ + | grep -v "^_.*GLIBC_PRIVATE" | grep @@ | sed -e "s/@@.*//" \ + | sort > $@T + mv -f $@T $@ + +%.staticsymlist: %.a + LC_ALL=C; export LC_ALL; $(NM) $(NM-FLAGS) $< \ + | grep -v DW.ref.__gcc_personality_v0 \ + | sort > $@T + mv -f $@T $@ + vpath %.abilist $(+sysdep_dirs) # The .PRECIOUS rule prevents the files built by an implicit rule whose @@ -1246,6 +1261,16 @@ vpath %.abilist $(+sysdep_dirs) # 'make clean', which is handled by the 'generated' variable. .PRECIOUS: %.symlist generated += $(extra-libs:=.symlist) +ifeq (yes,$(nm-has-symbol-version)) +.PRECIOUS: %.dynamicsymlist %.staticsymlist +# Only check global symbols in static libraries in $(extra-libs). +static-libs := $(foreach lib, $(extra-libs), \ + $(if $($(lib)-inhibit-o),,$(lib))) +generated += \ + $(static-libs:=.dynamicsymlist) \ + $(static-libs:=.staticsymlist) \ +# generated +endif $(objpfx)check-abi-%.out: $(common-objpfx)config.make %.abilist \ $(objpfx)%.symlist @@ -1259,6 +1284,23 @@ define check-abi diff -p -U 0 $(filter %.abilist,$^) $(filter %.symlist,$^) > $@ endef +$(objpfx)check-static-abi-%.out: $(common-objpfx)config.make \ + $(objpfx)%.dynamicsymlist \ + $(objpfx)%.staticsymlist + $(check-static-abi); \ + $(evaluate-test) +$(objpfx)check-static-abi-%.out: $(common-objpfx)config.make \ + $(common-objpfx)%.dynamicsymlist \ + $(common-objpfx)%.staticsymlist + $(check-static-abi); \ + $(evaluate-test) +define check-static-abi + $(SHELL) $(..)scripts/check-static-abi.sh $* \ + $(filter %.dynamicsymlist,$^) \ + $(filter %.staticsymlist,$^) \ + "$(shared-only-symbols)" > $@ +endef + update-abi-%: $(objpfx)%.symlist %.abilist $(update-abi) update-abi-%: $(common-objpfx)%.symlist %.abilist @@ -1290,6 +1332,11 @@ update-all-abi: $(patsubst %.so,update-all-abi-%,$(install-lib.so-versioned)) check-abi-list = $(patsubst %.so,$(objpfx)check-abi-%.out, \ $(install-lib.so-versioned)) check-abi: $(check-abi-list) +ifeq (yes,$(nm-has-symbol-version)) +check-static-abi-list = $(patsubst %.a,$(objpfx)check-static-abi-%.out, \ + $(static-libs:=.a)) +check-abi: $(check-static-abi-list) +endif ifdef subdir subdir_check-abi: check-abi subdir_update-abi: update-abi @@ -1298,6 +1345,10 @@ else check-abi: subdir_check-abi if grep -q '^FAIL:' $(objpfx)*/check-abi*.test-result; then \ cat $(objpfx)*/check-abi*.out && exit 1; fi +ifeq (yes,$(nm-has-symbol-version)) + if grep -q '^FAIL:' $(objpfx)*/check-static-abi*.test-result; \ + then cat $(objpfx)*/check-static-abi*.out && exit 1; fi +endif update-abi: subdir_update-abi update-all-abi: subdir_update-all-abi endif @@ -1308,11 +1359,28 @@ tests-special += $(objpfx)check-abi-libc.out update-abi: update-abi-libc update-all-abi: update-all-abi-libc common-generated += libc.symlist +ifeq (yes,$(nm-has-symbol-version)) +check-abi: $(objpfx)check-static-abi-libc.out +tests-special += $(objpfx)check-static-abi-libc.out +common-generated += \ + libc.dynamicsymlist \ + libc.staticsymlist \ + libc_nonshared.staticsymlist \ + # common-generated +# check-static-abi.sh needs libc_nonshared.staticsymlist and +# libm.dynamicsymlist to check the global symbol list in libc.a. +$(objpfx)check-static-abi-libc.out: \ + $(common-objpfx)libc_nonshared.staticsymlist \ + $(common-objpfx)math/libm.dynamicsymlist +endif endif ifeq ($(build-shared),yes) ifdef subdir tests-special += $(check-abi-list) +ifeq (yes,$(nm-has-symbol-version)) +tests-special += $(check-static-abi-list) +endif endif endif diff --git a/configure b/configure index 432e40a592..8328bc59e0 100755 --- a/configure +++ b/configure @@ -7566,6 +7566,48 @@ if test "$libc_cv_symver_needs_alias" = yes; then fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether nm displays symbol versions for dynamic symbols" >&5 +printf %s "checking whether nm displays symbol versions for dynamic symbols... " >&6; } +if test ${libc_cv_nm_has_symbol_version+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat > conftest.s < conftest.t <&5 + (eval $ac_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + if $NM --dynamic --extern-only --defined-only --just-symbols conftest.so 2>&1 \ + | grep -q foo@@VERS_2.0; then + libc_cv_nm_has_symbol_version=yes + fi + fi + rm conftest.* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_nm_has_symbol_version" >&5 +printf "%s\n" "$libc_cv_nm_has_symbol_version" >&6; } +config_vars="$config_vars +nm-has-symbol-version = $libc_cv_nm_has_symbol_version" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __builtin_trap with no external dependencies" >&5 printf %s "checking for __builtin_trap with no external dependencies... " >&6; } if test ${libc_cv_builtin_trap+y} diff --git a/configure.ac b/configure.ac index bdc385d03c..db27a6ce2a 100644 --- a/configure.ac +++ b/configure.ac @@ -1554,6 +1554,37 @@ if test "$libc_cv_symver_needs_alias" = yes; then AC_DEFINE(SYMVER_NEEDS_ALIAS) fi +dnl Starting with binutils 2.35, NM displays symbol versions for dynamic +dnl symbols (PR 25708). +AC_CACHE_CHECK(whether nm displays symbol versions for dynamic symbols, + libc_cv_nm_has_symbol_version, [dnl + cat > conftest.s < conftest.t <&1 \ + | grep -q foo@@VERS_2.0; then + libc_cv_nm_has_symbol_version=yes + fi + fi + rm conftest.* +]) +LIBC_CONFIG_VAR([nm-has-symbol-version], [$libc_cv_nm_has_symbol_version]) + AC_CACHE_CHECK(for __builtin_trap with no external dependencies, libc_cv_builtin_trap, [dnl libc_cv_builtin_trap=no diff --git a/elf/Makefile b/elf/Makefile index 280e777c19..8acfa46c62 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -182,6 +182,21 @@ CFLAGS-rtld.os += $(rtld-early-cflags) ifeq ($(unwind-find-fde),yes) routines += unwind-dw2-fde-glibc shared-only-routines += unwind-dw2-fde-glibc + +# These global symbols are only in libc.so. +shared-only-symbols += \ + _Unwind_Find_FDE \ + __deregister_frame \ + __deregister_frame_info \ + __deregister_frame_info_bases \ + __register_frame \ + __register_frame_info \ + __register_frame_info_bases \ + __register_frame_info_bases \ + __register_frame_info_table \ + __register_frame_info_table_bases \ + __register_frame_table \ +# shared-only-symbols endif before-compile += $(objpfx)trusted-dirs.h diff --git a/math/Makefile b/math/Makefile index 58e5c070cf..ae268e0088 100644 --- a/math/Makefile +++ b/math/Makefile @@ -1674,3 +1674,7 @@ object-suffixes-left := $(libmvec-tests) include $(o-iterator) $(objpfx)test-fenv-tls: $(shared-thread-library) + +# check-static-abi.sh needs libc.staticsymlist to check the global symbol +# list in libm.a. +$(objpfx)check-static-abi-libm.out: $(common-objpfx)libc.staticsymlist diff --git a/scripts/check-static-abi.sh b/scripts/check-static-abi.sh new file mode 100644 index 0000000000..70dfb63ff1 --- /dev/null +++ b/scripts/check-static-abi.sh @@ -0,0 +1,103 @@ +#!/bin/sh +# Check global symbols in static library against global symbols in shared +# library. +# Copyright (C) 2024 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 +# . + +export LC_ALL=C + +lib="$1" +shift +dynamicsymlist="$1" +shift +if test $lib = libc; then + libm_dynamicsymlist="$1" + shift +fi +staticsymlist="$1" +shift +if test $lib = libc; then + libc_nonshared_staticsymlist="$1" + shift +elif test $lib = libm; then + libc_staticsymlist="$1" + shift +fi +shared_only_functions="$1" + +staticdiff="$(mktemp)" + +cleanup () { + rm -f -- "$staticdiff" +} + +trap cleanup 0 + +status=0 + +diff -up $dynamicsymlist $staticsymlist > $staticdiff + +# Check missing global symbols, including symbols with a leading +# underscore, in static library. +shared_only="$(grep '^-[^-]' $staticdiff | sed -e 's/^-//')" +if test -n "$shared_only"; then + # Exclude shared only functions. + for f in $shared_only; do + case " $shared_only_functions " in + *" $f "*) + ;; + *) + # Skip the missing function, $f, in libm.a if $f is in libc.a. + if test $lib = libm \ + && grep -q "^$f$" $libc_staticsymlist; then + continue + fi + missing="$missing $f" + ;; + esac + done + if test -n "$missing"; then + status=1 + echo Missing functions in ${lib}.a: + echo "$missing" + fi +fi + +# Check extra global symbols, excluding symbols with a leading underscore +# which can be internal symbols, in static library. +static_only="$(grep '^+[^_^\+]' $staticdiff | sed -e 's/^+//')" +if test -n "$static_only"; then + # Exclude static only functions. + for f in $static_only; do + # Skip the extra function, $f, in libc.a if $f is in libc_nonshared.a + # or libm.so. + if test $lib = libc; then + if grep -q "^$f$" $libc_nonshared_staticsymlist \ + || grep -q "^$f$" $libm_dynamicsymlist; then + continue + fi + fi + extra="$extra $f" + done + if test -n "$extra"; then + status=1 + echo Extra functions in ${lib}.a: + echo "$extra" + fi +fi + +exit $status diff --git a/sysdeps/alpha/Makefile b/sysdeps/alpha/Makefile index 11d5e65503..9e3486bd23 100644 --- a/sysdeps/alpha/Makefile +++ b/sysdeps/alpha/Makefile @@ -33,6 +33,11 @@ sysdep_routines += stxcpy stxncpy endif ifeq ($(subdir),elf) +# These global symbols are only in libc.so. +shared-only-symbols += \ + __nldbl__IO_vfscanf \ +# shared-only-symbols + # The ld.so startup code cannot use literals until it self-relocates. CFLAGS-rtld.c = -mbuild-constants endif diff --git a/sysdeps/generic/Makefile b/sysdeps/generic/Makefile index 72522d1f0e..fd059582e6 100644 --- a/sysdeps/generic/Makefile +++ b/sysdeps/generic/Makefile @@ -25,7 +25,18 @@ ifeq (yes:yes,$(build-shared):$(unwind-find-fde)) # This is needed to support g++ v2 and v3. sysdep_routines += framestate unwind-pe shared-only-routines += framestate unwind-pe + +# These global symbols are only in libc.so. +shared-only-symbols += __frame_state_for endif + +# These global symbols are only in libc.so. +shared-only-symbols += \ + __xmknod \ + __xmknodat \ + _dl_mcount_wrapper_check \ + re_max_failures \ +# shared-only-symbols endif ifeq ($(subdir),malloc) diff --git a/sysdeps/powerpc/Makefile b/sysdeps/powerpc/Makefile index 5e6cb07ce6..ece1805e62 100644 --- a/sysdeps/powerpc/Makefile +++ b/sysdeps/powerpc/Makefile @@ -3,6 +3,11 @@ CFLAGS-memcmp.c += -Wno-uninitialized endif ifeq ($(subdir),elf) +# These global symbols are only in libc.so. +shared-only-symbols += \ + __nldbl__IO_vfscanf \ + # shared-only-symbols + # extra shared linker files to link into dl-allobjs.so and libc sysdep-dl-routines += dl-machine hwcapinfo sysdep_routines += dl-machine hwcapinfo diff --git a/sysdeps/s390/Makefile b/sysdeps/s390/Makefile index b793b26112..3d218bfeab 100644 --- a/sysdeps/s390/Makefile +++ b/sysdeps/s390/Makefile @@ -43,6 +43,11 @@ $(modpfx)gconv-modules-s390.conf: ../sysdeps/s390/gconv-modules-s390.conf \ endif ifeq ($(subdir),elf) +# These global symbols are only in libc.so. +shared-only-symbols += \ + __nldbl__IO_vfscanf \ +# shared-only-symbols + sysdep-dl-routines += dl-procinfo-s390 ifeq ($(build-shared),yes) diff --git a/sysdeps/sparc/sparc32/Makefile b/sysdeps/sparc/sparc32/Makefile index 4ba8794aa0..51012604fd 100644 --- a/sysdeps/sparc/sparc32/Makefile +++ b/sysdeps/sparc/sparc32/Makefile @@ -15,6 +15,19 @@ # License along with the GNU C Library; if not, see # . +ifeq ($(subdir),elf) +# These global symbols are only in libc.so. Filter out the +# $(shared-only-routines) routines. +shared-only-symbols += \ + __nldbl__IO_vfscanf \ + .div \ + .rem \ + .udiv \ + .umul \ + .urem \ + # shared-only-symbols +endif + ifeq ($(subdir),gnulib) sysdep_routines = dotmul umul $(divrem) alloca shared-only-routines += umul $(divrem)