libsanitizer: Add option to bootstrap using HWASAN

This is an analogous option to --bootstrap-asan to configure.  It allows
bootstrapping GCC using HWASAN.

For the same reasons as for ASAN we have to avoid using the HWASAN
sanitizer when compiling libiberty and the lto-plugin.

Also add a function to query whether -fsanitize=hwaddress has been
passed.

ChangeLog:

	* configure: Regenerate.
	* configure.ac: Add --bootstrap-hwasan option.

config/ChangeLog:

	* bootstrap-hwasan.mk: New file.

gcc/ChangeLog:

	* doc/install.texi: Document new option.

libiberty/ChangeLog:

	* configure: Regenerate.
	* configure.ac: Avoid using sanitizer.

lto-plugin/ChangeLog:

	* Makefile.am: Avoid using sanitizer.
	* Makefile.in: Regenerate.
This commit is contained in:
Matthew Malcomson 2020-11-25 16:31:41 +00:00
parent 8a769f816f
commit 170e618ef5
8 changed files with 21 additions and 6 deletions

View File

@ -0,0 +1,8 @@
# This option enables -fsanitize=hwaddress for stage2 and stage3.
STAGE2_CFLAGS += -fsanitize=hwaddress
STAGE3_CFLAGS += -fsanitize=hwaddress
POSTSTAGE1_LDFLAGS += -fsanitize=hwaddress -static-libhwasan \
-B$$r/prev-$(TARGET_SUBDIR)/libsanitizer/ \
-B$$r/prev-$(TARGET_SUBDIR)/libsanitizer/hwasan/ \
-B$$r/prev-$(TARGET_SUBDIR)/libsanitizer/hwasan/.libs

2
configure vendored
View File

@ -9305,7 +9305,7 @@ fi
# or bootstrap-ubsan, bootstrap it. # or bootstrap-ubsan, bootstrap it.
if echo " ${target_configdirs} " | grep " libsanitizer " > /dev/null 2>&1; then if echo " ${target_configdirs} " | grep " libsanitizer " > /dev/null 2>&1; then
case "$BUILD_CONFIG" in case "$BUILD_CONFIG" in
*bootstrap-asan* | *bootstrap-ubsan* ) *bootstrap-hwasan* | *bootstrap-asan* | *bootstrap-ubsan* )
bootstrap_target_libs=${bootstrap_target_libs}target-libsanitizer, bootstrap_target_libs=${bootstrap_target_libs}target-libsanitizer,
bootstrap_fixincludes=yes bootstrap_fixincludes=yes
;; ;;

View File

@ -2814,7 +2814,7 @@ fi
# or bootstrap-ubsan, bootstrap it. # or bootstrap-ubsan, bootstrap it.
if echo " ${target_configdirs} " | grep " libsanitizer " > /dev/null 2>&1; then if echo " ${target_configdirs} " | grep " libsanitizer " > /dev/null 2>&1; then
case "$BUILD_CONFIG" in case "$BUILD_CONFIG" in
*bootstrap-asan* | *bootstrap-ubsan* ) *bootstrap-hwasan* | *bootstrap-asan* | *bootstrap-ubsan* )
bootstrap_target_libs=${bootstrap_target_libs}target-libsanitizer, bootstrap_target_libs=${bootstrap_target_libs}target-libsanitizer,
bootstrap_fixincludes=yes bootstrap_fixincludes=yes
;; ;;

View File

@ -2805,6 +2805,11 @@ the build tree.
Compiles GCC itself using Address Sanitization in order to catch invalid memory Compiles GCC itself using Address Sanitization in order to catch invalid memory
accesses within the GCC code. accesses within the GCC code.
@item @samp{bootstrap-hwasan}
Compiles GCC itself using HWAddress Sanitization in order to catch invalid
memory accesses within the GCC code. This option is only available on AArch64
systems that are running Linux kernel version 5.4 or later.
@end table @end table
@section Building a cross compiler @section Building a cross compiler

1
libiberty/configure vendored
View File

@ -5264,6 +5264,7 @@ fi
NOASANFLAG= NOASANFLAG=
case " ${CFLAGS} " in case " ${CFLAGS} " in
*\ -fsanitize=address\ *) NOASANFLAG=-fno-sanitize=address ;; *\ -fsanitize=address\ *) NOASANFLAG=-fno-sanitize=address ;;
*\ -fsanitize=hwaddress\ *) NOASANFLAG=-fno-sanitize=hwaddress ;;
esac esac

View File

@ -240,6 +240,7 @@ AC_SUBST(PICFLAG)
NOASANFLAG= NOASANFLAG=
case " ${CFLAGS} " in case " ${CFLAGS} " in
*\ -fsanitize=address\ *) NOASANFLAG=-fno-sanitize=address ;; *\ -fsanitize=address\ *) NOASANFLAG=-fno-sanitize=address ;;
*\ -fsanitize=hwaddress\ *) NOASANFLAG=-fno-sanitize=hwaddress ;;
esac esac
AC_SUBST(NOASANFLAG) AC_SUBST(NOASANFLAG)

View File

@ -11,8 +11,8 @@ AM_CPPFLAGS = -I$(top_srcdir)/../include $(DEFS)
AM_CFLAGS = @ac_lto_plugin_warn_cflags@ $(CET_HOST_FLAGS) AM_CFLAGS = @ac_lto_plugin_warn_cflags@ $(CET_HOST_FLAGS)
AM_LDFLAGS = @ac_lto_plugin_ldflags@ AM_LDFLAGS = @ac_lto_plugin_ldflags@
AM_LIBTOOLFLAGS = --tag=disable-static AM_LIBTOOLFLAGS = --tag=disable-static
override CFLAGS := $(filter-out -fsanitize=address,$(CFLAGS)) override CFLAGS := $(filter-out -fsanitize=address -fsanitize=hwaddress,$(CFLAGS))
override LDFLAGS := $(filter-out -fsanitize=address,$(LDFLAGS)) override LDFLAGS := $(filter-out -fsanitize=address -fsanitize=hwaddress,$(LDFLAGS))
libexecsub_LTLIBRARIES = liblto_plugin.la libexecsub_LTLIBRARIES = liblto_plugin.la
gcc_build_dir = @gcc_build_dir@ gcc_build_dir = @gcc_build_dir@

View File

@ -675,8 +675,8 @@ uninstall-am: uninstall-libexecsubLTLIBRARIES
.PRECIOUS: Makefile .PRECIOUS: Makefile
override CFLAGS := $(filter-out -fsanitize=address,$(CFLAGS)) override CFLAGS := $(filter-out -fsanitize=address -fsanitize=hwaddress,$(CFLAGS))
override LDFLAGS := $(filter-out -fsanitize=address,$(LDFLAGS)) override LDFLAGS := $(filter-out -fsanitize=address -fsanitize=hwaddress,$(LDFLAGS))
all-local: $(in_gcc_libs) all-local: $(in_gcc_libs)