[v3,04/13] aarch64: configure test for BTI support
Commit Message
Check BTI support in the compiler and linker. The check also
requires READELF that understands the BTI GNU property note.
It is expected to succeed with gcc >=gcc-9 configured with
--enable-standard-branch-protection and binutils >=binutils-2.33.
---
config.h.in | 3 +++
sysdeps/aarch64/configure | 42 ++++++++++++++++++++++++++++++++++++
sysdeps/aarch64/configure.ac | 19 ++++++++++++++++
3 files changed, 64 insertions(+)
Comments
On 15/05/2020 11:40, Szabolcs Nagy wrote:
> Check BTI support in the compiler and linker. The check also
> requires READELF that understands the BTI GNU property note.
> It is expected to succeed with gcc >=gcc-9 configured with
> --enable-standard-branch-protection and binutils >=binutils-2.33.
From the configure check below I understand that it still possible to
build a glibc with BTI support if the required flags are add on
CC or CFLAGS. Maybe make it explicit in the commit message?
LGTM, thanks.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> config.h.in | 3 +++
> sysdeps/aarch64/configure | 42 ++++++++++++++++++++++++++++++++++++
> sysdeps/aarch64/configure.ac | 19 ++++++++++++++++
> 3 files changed, 64 insertions(+)
>
> diff --git a/config.h.in b/config.h.in
> index dea43df438..506b0c416c 100644
> --- a/config.h.in
> +++ b/config.h.in
> @@ -109,6 +109,9 @@
> /* AArch64 big endian ABI */
> #undef HAVE_AARCH64_BE
>
> +/* AArch64 BTI support enabled. */
> +#undef HAVE_AARCH64_BTI
> +
> /* C-SKY ABI version. */
> #undef CSKYABI
>
Ok.
> diff --git a/sysdeps/aarch64/configure b/sysdeps/aarch64/configure
> index 5bd355a691..70477a7fa5 100644
> --- a/sysdeps/aarch64/configure
> +++ b/sysdeps/aarch64/configure
> @@ -172,3 +172,45 @@ else
> config_vars="$config_vars
> default-abi = lp64"
> fi
> +
> +# Only consider BTI supported if -mbranch-protection=bti is
> +# on by default in the compiler and the linker produces
> +# binaries with GNU property notes in PT_GNU_PROPERTY segment.
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BTI support" >&5
> +$as_echo_n "checking for BTI support... " >&6; }
> +if ${libc_cv_aarch64_bti+:} false; then :
> + $as_echo_n "(cached) " >&6
> +else
> + cat > conftest.c <<EOF
> +void foo (void) { }
> +EOF
> + libc_cv_aarch64_bti=no
> + if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -nostdlib -nostartfiles $no_ssp -shared -fPIC -o conftest.so conftest.c'
> + { { 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; }; } \
> + && { ac_try='$READELF -lW conftest.so | grep -q GNU_PROPERTY'
> + { { 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; }; } \
> + && { ac_try='$READELF -nW conftest.so | grep -q "NT_GNU_PROPERTY_TYPE_0.*AArch64 feature:.* BTI"'
> + { { 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
> + libc_cv_aarch64_bti=yes
> + fi
> + rm -rf conftest.*
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_aarch64_bti" >&5
> +$as_echo "$libc_cv_aarch64_bti" >&6; }
> +if test $libc_cv_aarch64_bti = yes; then
> + $as_echo "#define HAVE_AARCH64_BTI 1" >>confdefs.h
> +
> +fi
> diff --git a/sysdeps/aarch64/configure.ac b/sysdeps/aarch64/configure.ac
> index 7851dd4dac..798f494740 100644
> --- a/sysdeps/aarch64/configure.ac
> +++ b/sysdeps/aarch64/configure.ac
> @@ -20,3 +20,22 @@ if test $libc_cv_aarch64_be = yes; then
> else
> LIBC_CONFIG_VAR([default-abi], [lp64])
> fi
> +
> +# Only consider BTI supported if -mbranch-protection=bti is
> +# on by default in the compiler and the linker produces
> +# binaries with GNU property notes in PT_GNU_PROPERTY segment.
Maybe add that user might still set it on CC or CFLAGS?
> +AC_CACHE_CHECK([for BTI support], [libc_cv_aarch64_bti], [dnl
> + cat > conftest.c <<EOF
> +void foo (void) { }
> +EOF
> + libc_cv_aarch64_bti=no
> + if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -nostdlib -nostartfiles $no_ssp -shared -fPIC -o conftest.so conftest.c]) \
> + && AC_TRY_COMMAND([$READELF -lW conftest.so | grep -q GNU_PROPERTY]) \
> + && AC_TRY_COMMAND([$READELF -nW conftest.so | grep -q "NT_GNU_PROPERTY_TYPE_0.*AArch64 feature:.* BTI"])
> + then
> + libc_cv_aarch64_bti=yes
> + fi
> + rm -rf conftest.*])
> +if test $libc_cv_aarch64_bti = yes; then
> + AC_DEFINE(HAVE_AARCH64_BTI)
> +fi
>
Ok.
On 25/05/2020 15:41, Adhemerval Zanella wrote:
>
>
> On 15/05/2020 11:40, Szabolcs Nagy wrote:
>> Check BTI support in the compiler and linker. The check also
>> requires READELF that understands the BTI GNU property note.
>> It is expected to succeed with gcc >=gcc-9 configured with
>> --enable-standard-branch-protection and binutils >=binutils-2.33.
>
> From the configure check below I understand that it still possible to
> build a glibc with BTI support if the required flags are add on
> CC or CFLAGS. Maybe make it explicit in the commit message?
>
> LGTM, thanks.
>
> Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
>
>> ---
>> config.h.in | 3 +++
>> sysdeps/aarch64/configure | 42 ++++++++++++++++++++++++++++++++++++
>> sysdeps/aarch64/configure.ac | 19 ++++++++++++++++
>> 3 files changed, 64 insertions(+)
>>
>> diff --git a/config.h.in b/config.h.in
>> index dea43df438..506b0c416c 100644
>> --- a/config.h.in
>> +++ b/config.h.in
>> @@ -109,6 +109,9 @@
>> /* AArch64 big endian ABI */
>> #undef HAVE_AARCH64_BE
>>
>> +/* AArch64 BTI support enabled. */
>> +#undef HAVE_AARCH64_BTI
>> +
>> /* C-SKY ABI version. */
>> #undef CSKYABI
>>
>
> Ok.
In fact I think you can define as:
#define HAVE_AARCH64_BTI 0
That AC_DEFINE will correctly set to 1. It allows to check for the
macro value instead of existence.
@@ -109,6 +109,9 @@
/* AArch64 big endian ABI */
#undef HAVE_AARCH64_BE
+/* AArch64 BTI support enabled. */
+#undef HAVE_AARCH64_BTI
+
/* C-SKY ABI version. */
#undef CSKYABI
@@ -172,3 +172,45 @@ else
config_vars="$config_vars
default-abi = lp64"
fi
+
+# Only consider BTI supported if -mbranch-protection=bti is
+# on by default in the compiler and the linker produces
+# binaries with GNU property notes in PT_GNU_PROPERTY segment.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BTI support" >&5
+$as_echo_n "checking for BTI support... " >&6; }
+if ${libc_cv_aarch64_bti+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat > conftest.c <<EOF
+void foo (void) { }
+EOF
+ libc_cv_aarch64_bti=no
+ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -nostdlib -nostartfiles $no_ssp -shared -fPIC -o conftest.so conftest.c'
+ { { 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; }; } \
+ && { ac_try='$READELF -lW conftest.so | grep -q GNU_PROPERTY'
+ { { 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; }; } \
+ && { ac_try='$READELF -nW conftest.so | grep -q "NT_GNU_PROPERTY_TYPE_0.*AArch64 feature:.* BTI"'
+ { { 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
+ libc_cv_aarch64_bti=yes
+ fi
+ rm -rf conftest.*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_aarch64_bti" >&5
+$as_echo "$libc_cv_aarch64_bti" >&6; }
+if test $libc_cv_aarch64_bti = yes; then
+ $as_echo "#define HAVE_AARCH64_BTI 1" >>confdefs.h
+
+fi
@@ -20,3 +20,22 @@ if test $libc_cv_aarch64_be = yes; then
else
LIBC_CONFIG_VAR([default-abi], [lp64])
fi
+
+# Only consider BTI supported if -mbranch-protection=bti is
+# on by default in the compiler and the linker produces
+# binaries with GNU property notes in PT_GNU_PROPERTY segment.
+AC_CACHE_CHECK([for BTI support], [libc_cv_aarch64_bti], [dnl
+ cat > conftest.c <<EOF
+void foo (void) { }
+EOF
+ libc_cv_aarch64_bti=no
+ if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -nostdlib -nostartfiles $no_ssp -shared -fPIC -o conftest.so conftest.c]) \
+ && AC_TRY_COMMAND([$READELF -lW conftest.so | grep -q GNU_PROPERTY]) \
+ && AC_TRY_COMMAND([$READELF -nW conftest.so | grep -q "NT_GNU_PROPERTY_TYPE_0.*AArch64 feature:.* BTI"])
+ then
+ libc_cv_aarch64_bti=yes
+ fi
+ rm -rf conftest.*])
+if test $libc_cv_aarch64_bti = yes; then
+ AC_DEFINE(HAVE_AARCH64_BTI)
+fi