summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2023-01-04 13:46:38 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2023-02-09 16:36:16 -0300
commitdbe213c564a4c0755f6b106c2b596ff46c7bf75e (patch)
treef3b38ebaa3c6571e6caa0ad678f77eaba0c7b2fc
parent9d19d878329058e5e2602617ed8cf80d612c1611 (diff)
downloadglibc-dbe213c564a4c0755f6b106c2b596ff46c7bf75e.tar.gz
Use -Wl,--undefined-version if linker requires it
The lld might set --no-undefined-version as default, which triggers a lot of error since the Versions files may contain entries not exported by all ABI. The -Wl,--undefined-version can not be set by default, since binutils ld does not support (although gold does). So it requires to be checked at configure if linker requires and enabled it conditionally.
-rw-r--r--Makeconfig8
-rwxr-xr-xconfigure67
-rw-r--r--configure.ac27
3 files changed, 102 insertions, 0 deletions
diff --git a/Makeconfig b/Makeconfig
index a4a6f247d0..120385a3eb 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -424,6 +424,14 @@ ifndef after-link
after-link =
endif
+# The Versions file may contain entries not exported by all ABI, which
+# trigger errors if the linker defaults to --no-undefined-version. The
+# configure checks whether it is the case and adds --undefined-version
+# if required.
+LDFLAGS-lib.so += $(config-ldflags-undefined-version)
+LDFLAGS.so += $(config-ldflags-undefined-version)
+link-extra-flags += $(config-ldflags-undefined-version)
+
# Additional libraries to link into every test.
link-extra-libs-tests = $(libsupport)
diff --git a/configure b/configure
index 7b2c5a23af..e90610563e 100755
--- a/configure
+++ b/configure
@@ -5854,6 +5854,73 @@ $as_echo "$libc_linker_feature" >&6; }
config_vars="$config_vars
have-no-dynamic-linker = $libc_cv_no_dynamic_linker"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to suppress unused version in version script" >&5
+$as_echo_n "checking whether to suppress unused version in version script... " >&6; }
+if ${libc_cv_undefined_version+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat > conftest.c <<EOF
+void foo (void) { }
+EOF
+cat > conftest.map <<EOF
+VER_1.0 {
+ global:
+ bar;
+};
+EOF
+libc_cv_undefined_version=""
+if ! { ac_try='${CC-cc} -nostdlib -nostartfiles $no_ssp -fPIC -shared -Wl,--version-script=conftest.map conftest.c -o conftest.so'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; };
+then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker that supports --undefined-version" >&5
+$as_echo_n "checking for linker that supports --undefined-version... " >&6; }
+libc_linker_feature=no
+cat > conftest.c <<EOF
+int _start (void) { return 42; }
+EOF
+if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp
+ -Wl,--undefined-version -nostdlib -nostartfiles
+ -fPIC -shared -o conftest.so conftest.c
+ 1>&5'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }
+then
+ if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp -Wl,--undefined-version -nostdlib \
+ -nostartfiles -fPIC -shared -o conftest.so conftest.c 2>&1 \
+ | grep "warning: --undefined-version ignored" > /dev/null 2>&1; then
+ true
+ else
+ libc_linker_feature=yes
+ fi
+fi
+rm -f conftest*
+if test $libc_linker_feature = yes; then
+ libc_cv_support_undefined_version=yes
+else
+ libc_cv_support_undefined_version=no
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5
+$as_echo "$libc_linker_feature" >&6; }
+ if test "$libc_cv_support_undefined_version" = no; then
+ as_fn_error $? "support for -Wl,--undefined-version required" "$LINENO" 5
+ fi
+ libc_cv_undefined_version="-Wl,--undefined-version"
+fi
+rm -f conftest.*t
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_undefined_version" >&5
+$as_echo "$libc_cv_undefined_version" >&6; }
+config_vars="$config_vars
+config-ldflags-undefined-version = $libc_cv_undefined_version"
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -static-pie" >&5
$as_echo_n "checking for -static-pie... " >&6; }
if ${libc_cv_static_pie+:} false; then :
diff --git a/configure.ac b/configure.ac
index eed7732eb5..dd89cdb0a6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1332,6 +1332,33 @@ LIBC_LINKER_FEATURE([--no-dynamic-linker],
[libc_cv_no_dynamic_linker=no])
LIBC_CONFIG_VAR([have-no-dynamic-linker], [$libc_cv_no_dynamic_linker])
+AC_CACHE_CHECK(whether to suppress unused version in version script,
+ libc_cv_undefined_version, [dnl
+cat > conftest.c <<EOF
+void foo (void) { }
+EOF
+cat > conftest.map <<EOF
+VER_1.0 {
+ global:
+ bar;
+};
+EOF
+libc_cv_undefined_version=""
+if ! AC_TRY_COMMAND([${CC-cc} -nostdlib -nostartfiles $no_ssp -fPIC -shared -Wl,--version-script=conftest.map conftest.c -o conftest.so]);
+then
+ LIBC_LINKER_FEATURE([--undefined-version],
+ [-Wl,--undefined-version],
+ [libc_cv_support_undefined_version=yes],
+ [libc_cv_support_undefined_version=no])
+ if test "$libc_cv_support_undefined_version" = no; then
+ AC_MSG_ERROR([support for -Wl,--undefined-version required])
+ fi
+ libc_cv_undefined_version="-Wl,--undefined-version"
+fi
+rm -f conftest.*t])
+LIBC_CONFIG_VAR([config-ldflags-undefined-version],[$libc_cv_undefined_version])
+
+
AC_CACHE_CHECK(for -static-pie, libc_cv_static_pie, [dnl
LIBC_TRY_CC_OPTION([-static-pie],
[libc_cv_static_pie=yes],