Message ID | c904e0926acc59bb73e1c46b5d3c799a5a330d72.1589552054.git.szabolcs.nagy@arm.com |
---|---|
State | New |
Headers | show |
Series | aarch64: branch protection support | expand |
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.
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 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. +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