https://gcc.gnu.org/g:9586f7a78533ef4feb92f838f9f70aa2341d0ede

commit r12-11179-g9586f7a78533ef4feb92f838f9f70aa2341d0ede
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Mon Apr 14 10:18:13 2025 +0200

    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  <ja...@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.
    
    (cherry picked from commit 5a32e85810d33dc46b1b5fe2803ee787d40709d5)

Diff:
---
 gcc/config.in    | 10 ++++++++--
 gcc/configure    | 41 +++++++++++++++++++++++++++++++++++++++--
 gcc/configure.ac | 16 ++++++++++++++++
 gcc/gcc.cc       |  7 +++++++
 4 files changed, 70 insertions(+), 4 deletions(-)

diff --git a/gcc/config.in b/gcc/config.in
index 52f496ca5dee..147c60e6d52d 100644
--- a/gcc/config.in
+++ b/gcc/config.in
@@ -635,8 +635,7 @@
 #endif
 
 
-/* Define if your Mac OS X assembler supports the -mmacos-version-min option.
-   */
+/* Define if your macOS assembler supports the -mmacos-version-min option. */
 #ifndef USED_FOR_TARGET
 #undef HAVE_AS_MMACOSX_VERSION_MIN_OPTION
 #endif
@@ -2232,6 +2231,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
diff --git a/gcc/configure b/gcc/configure
index f697874f2d8d..536576b4b492 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -12478,6 +12478,43 @@ $as_echo "#define HOST_HAS_O_CLOEXEC 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.
 # The following network-related checks could probably do with some
@@ -19691,7 +19728,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 19694 "configure"
+#line 19731 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -19797,7 +19834,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 19800 "configure"
+#line 19837 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
diff --git a/gcc/configure.ac b/gcc/configure.ac
index fec897c2c08e..1618ce21f745 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -1729,6 +1729,22 @@ if test $ac_cv_o_cloexec = yes; then
   [Define if O_CLOEXEC 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.
 # The following network-related checks could probably do with some
diff --git a/gcc/gcc.cc b/gcc/gcc.cc
index 69b7978cbbd0..d48ef3a32d62 100644
--- a/gcc/gcc.cc
+++ b/gcc/gcc.cc
@@ -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"
@@ -7850,6 +7853,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)
     {

Reply via email to