[PATCH v3 1/5] aarch64: Add configure check for linker support for -z gcs

Adhemerval Zanella Netto adhemerval.zanella@linaro.org
Thu Feb 6 19:48:33 GMT 2025



On 06/02/25 16:34, Adhemerval Zanella Netto wrote:
> 
> 
> On 29/01/25 06:49, Yury Khrustalev wrote:
>> ---
>>  configure    | 36 ++++++++++++++++++++++++++++++++++++
>>  configure.ac |  5 +++++
>>  2 files changed, 41 insertions(+)
>>
>> diff --git a/configure b/configure
>> index eb8abd0054..19cae4aec7 100755
>> --- a/configure
>> +++ b/configure
>> @@ -8908,6 +8908,42 @@ printf "%s\n" "$libc_linker_feature" >&6; }
>>  config_vars="$config_vars
>>  load-address-ldflag = $libc_cv_load_address_ldflag"
>>  
>> +# Check if linker supports GCS marking
>> +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for linker that supports -z gcs=always" >&5
>> +printf %s "checking for linker that supports -z gcs=always... " >&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,-z,gcs=always -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,-z,gcs=always -nostdlib \
>> +      -nostartfiles -fPIC -shared -o conftest.so conftest.c 2>&1 \
>> +      | grep "warning: -z gcs=always 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_test_gcs=yes
>> +else
>> +  libc_cv_test_gcs=no
>> +fi
>> +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5
>> +printf "%s\n" "$libc_linker_feature" >&6; }
>> +config_vars="$config_vars
>> +have-test-cc-gcs = $libc_cv_test_gcs"
>> +
>>  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can build programs as PIE" >&5
>>  printf %s "checking if we can build programs as PIE... " >&6; }
>>  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
>> diff --git a/configure.ac b/configure.ac
>> index 050bfa65e3..4c30d5a5b7 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -1992,6 +1992,11 @@ LIBC_LINKER_FEATURE([-Ttext-segment=$libc_cv_pde_load_address],
>>  		    [libc_cv_load_address_ldflag=])
>>  LIBC_CONFIG_VAR([load-address-ldflag], [$libc_cv_load_address_ldflag])
>>  
>> +# Check if linker supports GCS marking
>> +LIBC_LINKER_FEATURE([-z gcs=always], [-Wl,-z,gcs=always],
>> +		    [libc_cv_test_gcs=yes], [libc_cv_test_gcs=no])
>> +LIBC_CONFIG_VAR([have-test-cc-gcs], [$libc_cv_test_gcs])
>> +
> 
> I think we might also need to check if compiler will ending using -z gcs
> as well, otherwise users might still some failures if glibc itself it
> not built with gcs.
> 
> For instance, with gcc 14 either with or without --enable-standard-branch-protection
> (where gcs is support), but with a gcs enabled binutils (so have-test-cc-gcs is yes)

I meant where gcs is *not* supported, with gcc-15 I don't see this issue (but I
still need to check with a build without --enable-standard-branch-protection).

> I see failures because at loading time libc.so.6 is not GCS compatible.
> 
> Maybe filtering out such failures (to check libc.so.6 it no GCS compatible), but it
> also means that GCS won't be usable anyway.
> 
>>  AC_MSG_CHECKING(if we can build programs as PIE)
>>  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#ifdef PIE_UNSUPPORTED
>>  # error PIE is not supported
> 



More information about the Libc-alpha mailing list