driver: On linux hosts disable ASLR during -freport-bug [PR119727]

Andi had a useful comment that even with the PR119727 workaround to
ignore differences in libbacktrace printed addresses, it is still better
to turn off ASLR when easily possible, e.g. in case some address leaks
in somewhere in the ICE message elsewhere, or to verify the ICE doesn't
depend on a particular library/binary load addresses.

The following patch adds a configure check and uses personality syscall
to turn off randomization for further -freport-bug subprocesses.

2025-04-14  Jakub Jelinek  <jakub@redhat.com>

	PR driver/119727
	* configure.ac (HOST_HAS_PERSONALITY_ADDR_NO_RANDOMIZE): New check.
	* gcc.cc: Include sys/personality.h if
	HOST_HAS_PERSONALITY_ADDR_NO_RANDOMIZE is defined.
	(try_generate_repro): Call
	personality (personality (0xffffffffU) | ADDR_NO_RANDOMIZE)
	if HOST_HAS_PERSONALITY_ADDR_NO_RANDOMIZE is defined.
	* config.in: Regenerate.
	* configure: Regenerate.
This commit is contained in:
Jakub Jelinek 2025-04-14 10:18:13 +02:00 committed by Jakub Jelinek
parent 5c82694319
commit 5a32e85810
4 changed files with 67 additions and 2 deletions

View file

@ -2320,6 +2320,13 @@
#endif
/* Define if personality and ADDR_NO_RANDOMIZE are declared in
sys/personality.h. */
#ifndef USED_FOR_TARGET
#undef HOST_HAS_PERSONALITY_ADDR_NO_RANDOMIZE
#endif
/* Define which stat syscall is able to handle 64bit indodes. */
#ifndef USED_FOR_TARGET
#undef HOST_STAT_FOR_64BIT_INODES

40
gcc/configure vendored
View file

@ -12694,6 +12694,42 @@ $as_echo "#define HOST_HAS_O_NONBLOCK 1" >>confdefs.h
fi
# Check if personality and ADDR_NO_RANDOMIZE are declared
# in sys/personality.h
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for personality ADDR_NO_RANDOMIZE" >&5
$as_echo_n "checking for personality ADDR_NO_RANDOMIZE... " >&6; }
if ${ac_cv_personality_addr_no_randomize+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <sys/personality.h>
int
main ()
{
personality (personality (0xffffffffU) | ADDR_NO_RANDOMIZE);
;
return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
ac_cv_personality_addr_no_randomize=yes
else
ac_cv_personality_addr_no_randomize=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_personality_addr_no_randomize" >&5
$as_echo "$ac_cv_personality_addr_no_randomize" >&6; }
if test $ac_cv_personality_addr_no_randomize = yes; then
$as_echo "#define HOST_HAS_PERSONALITY_ADDR_NO_RANDOMIZE 1" >>confdefs.h
fi
# C++ Modules would like some networking features to provide the mapping
# server. You can still use modules without them though.
@ -21484,7 +21520,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
#line 21487 "configure"
#line 21523 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@ -21590,7 +21626,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
#line 21593 "configure"
#line 21629 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H

View file

@ -1781,6 +1781,21 @@ if test $ac_cv_have_decl_O_NONBLOCK = yes; then
[Define if O_NONBLOCK supported by fcntl.])
fi
# Check if personality and ADDR_NO_RANDOMIZE are declared
# in sys/personality.h
AC_CACHE_CHECK(for personality ADDR_NO_RANDOMIZE,
ac_cv_personality_addr_no_randomize, [
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/personality.h>]], [[
personality (personality (0xffffffffU) | ADDR_NO_RANDOMIZE);]])],
[ac_cv_personality_addr_no_randomize=yes],
[ac_cv_personality_addr_no_randomize=no])])
if test $ac_cv_personality_addr_no_randomize = yes; then
AC_DEFINE(HOST_HAS_PERSONALITY_ADDR_NO_RANDOMIZE, 1,
[Define if personality and ADDR_NO_RANDOMIZE are declared in
sys/personality.h.])
fi
# C++ Modules would like some networking features to provide the mapping
# server. You can still use modules without them though.

View file

@ -30,6 +30,9 @@ compilation is specified by a string called a "spec". */
#define INCLUDE_STRING
#include "config.h"
#include "system.h"
#ifdef HOST_HAS_PERSONALITY_ADDR_NO_RANDOMIZE
#include <sys/personality.h>
#endif
#include "coretypes.h"
#include "multilib.h" /* before tm.h */
#include "tm.h"
@ -8003,6 +8006,10 @@ try_generate_repro (const char **argv)
else
new_argv[out_arg] = "-o-";
#ifdef HOST_HAS_PERSONALITY_ADDR_NO_RANDOMIZE
personality (personality (0xffffffffU) | ADDR_NO_RANDOMIZE);
#endif
int status;
for (attempt = 0; attempt < RETRY_ICE_ATTEMPTS; ++attempt)
{