X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/bf5ddded70c11edaf3514b25da27fc71cfb8e965..63750fd4ed4ff8bb9b3ff8868d4e36e3422adb21:/src/emacs.c?ds=sidebyside diff --git a/src/emacs.c b/src/emacs.c index fa7ec017fb..53bcc9879a 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -112,10 +112,6 @@ extern void moncontrol (int mode); #include #endif -#ifdef HAVE_PERSONALITY_ADDR_NO_RANDOMIZE -#include -#endif - static const char emacs_version[] = PACKAGE_VERSION; static const char emacs_copyright[] = COPYRIGHT; static const char emacs_bugreport[] = PACKAGE_BUGREPORT; @@ -685,6 +681,30 @@ main (int argc, char **argv) stack_base = &dummy; + dumping = !initialized && (strcmp (argv[argc - 1], "dump") == 0 + || strcmp (argv[argc - 1], "bootstrap") == 0); + + /* True if address randomization interferes with memory allocaiton. */ +# ifdef __PPC64__ + bool disable_aslr = true; +# else + bool disable_aslr = dumping; +# endif + + if (disable_aslr && disable_address_randomization ()) + { + /* Set this so the personality will be reverted before execs + after this one. */ + xputenv ("EMACS_HEAP_EXEC=true"); + + /* Address randomization was enabled, but is now disabled. + Re-execute Emacs to get a clean slate. */ + execvp (argv[0], argv); + + /* If the exec fails, warn and then try anyway. */ + perror (argv[0]); + } + #ifndef CANNOT_DUMP might_dump = !initialized; #endif @@ -793,26 +813,6 @@ main (int argc, char **argv) } } - dumping = !initialized && (strcmp (argv[argc - 1], "dump") == 0 - || strcmp (argv[argc - 1], "bootstrap") == 0); - -#ifdef HAVE_PERSONALITY_ADDR_NO_RANDOMIZE - if (dumping) - { - int pers = personality (0xffffffff); - if (! (pers & ADDR_NO_RANDOMIZE) - && 0 <= personality (pers | ADDR_NO_RANDOMIZE)) - { - /* Address randomization was enabled, but is now disabled. - Re-execute Emacs to get a clean slate. */ - execvp (argv[0], argv); - - /* If the exec fails, warn and then try without a clean slate. */ - perror (argv[0]); - } - } -#endif - #if defined (HAVE_SETRLIMIT) && defined (RLIMIT_STACK) && !defined (CYGWIN) /* Extend the stack space available. Don't do that if dumping, since some systems (e.g. DJGPP) might define a smaller stack