aarch64: ensure objects are BTI compatible

When glibc is built with branch protection (i.e. with a gcc configured
with --enable-standard-branch-protection), all glibc binaries should
be BTI compatible and marked as such.

It is easy to link BTI incompatible objects by accident and this is
silent currently which is usually not the expectation, so this is
changed into a link error. (There is no linker flag for failing on
BTI incompatible inputs so all warnings are turned into fatal errors
outside the test system when building glibc with branch protection.)

Unfortunately, outlined atomic functions are not BTI compatible in
libgcc (PR libgcc/96001), so to build glibc with current gcc use
'CC=gcc -mno-outline-atomics', this should be fixed in libgcc soon
and then glibc can be built and tested without such workarounds.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This commit is contained in:
Szabolcs Nagy 2020-06-30 11:12:40 +01:00
parent 605338745b
commit de9301c02e
3 changed files with 11 additions and 0 deletions

View File

@ -1,5 +1,13 @@
long-double-fcts = yes long-double-fcts = yes
ifeq (yes,$(aarch64-bti))
# Mark linker output BTI compatible, it warns on non-BTI inputs.
sysdep-LDFLAGS += -Wl,-z,force-bti
# Make warnings fatal outside the test system.
LDFLAGS-lib.so += -Wl,--fatal-warnings
LDFLAGS-rtld += -Wl,-z,force-bti,--fatal-warnings
endif
ifeq ($(subdir),elf) ifeq ($(subdir),elf)
sysdep-dl-routines += dl-bti sysdep-dl-routines += dl-bti
endif endif

View File

@ -210,6 +210,8 @@ EOF
fi fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_aarch64_bti" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_aarch64_bti" >&5
$as_echo "$libc_cv_aarch64_bti" >&6; } $as_echo "$libc_cv_aarch64_bti" >&6; }
config_vars="$config_vars
aarch64-bti = $libc_cv_aarch64_bti"
if test $libc_cv_aarch64_bti = yes; then if test $libc_cv_aarch64_bti = yes; then
$as_echo "#define HAVE_AARCH64_BTI 1" >>confdefs.h $as_echo "#define HAVE_AARCH64_BTI 1" >>confdefs.h

View File

@ -36,6 +36,7 @@ EOF
libc_cv_aarch64_bti=yes libc_cv_aarch64_bti=yes
fi fi
rm -rf conftest.*]) rm -rf conftest.*])
LIBC_CONFIG_VAR([aarch64-bti], [$libc_cv_aarch64_bti])
if test $libc_cv_aarch64_bti = yes; then if test $libc_cv_aarch64_bti = yes; then
AC_DEFINE(HAVE_AARCH64_BTI) AC_DEFINE(HAVE_AARCH64_BTI)
fi fi