diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2023-01-04 13:46:38 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2024-04-17 16:12:41 -0300 |
commit | 3be1ab1ff9a6e9e8115702c4dd6c8cb6e207a36d (patch) | |
tree | 00a372bb407c72cb32fcf2a97420e9c3e6597676 | |
parent | 1eed82b6917bfd26e642b6eaf831d08595cf9cfb (diff) | |
download | glibc-3be1ab1ff9a6e9e8115702c4dd6c8cb6e207a36d.zip glibc-3be1ab1ff9a6e9e8115702c4dd6c8cb6e207a36d.tar.gz glibc-3be1ab1ff9a6e9e8115702c4dd6c8cb6e207a36d.tar.bz2 |
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-- | Makeconfig | 9 | ||||
-rwxr-xr-x | configure | 68 | ||||
-rw-r--r-- | configure.ac | 27 |
3 files changed, 104 insertions, 0 deletions
@@ -424,6 +424,15 @@ 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-rtld += $(config-ldflags-undefined-version) +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) @@ -6927,6 +6927,74 @@ printf "%s\n" "$libc_linker_feature" >&6; } config_vars="$config_vars have-no-dynamic-linker = $libc_cv_no_dynamic_linker" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to suppress unused version in version script" >&5 +printf %s "checking whether to suppress unused version in version script... " >&6; } +if test ${libc_cv_undefined_version+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; +then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for linker that supports --undefined-version" >&5 +printf %s "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=$? + printf "%s\n" "$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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5 +printf "%s\n" "$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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_undefined_version" >&5 +printf "%s\n" "$libc_cv_undefined_version" >&6; } +config_vars="$config_vars +config-ldflags-undefined-version = $libc_cv_undefined_version" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -static-pie" >&5 printf %s "checking for -static-pie... " >&6; } if test ${libc_cv_static_pie+y} diff --git a/configure.ac b/configure.ac index b501ddd..5f75b25 100644 --- a/configure.ac +++ b/configure.ac @@ -1254,6 +1254,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], |