Commit e95b0231 authored by Paul Eggert's avatar Paul Eggert
Browse files

Port to glibc 2.24 (pre-release) + ppc64

Inspired by a suggestion by Florian Weimer in:
https://sourceware.org/ml/libc-alpha/2016-07/msg00425.html
* configure.ac (HAVE_PERSONALITY_ADDR_NO_RANDOMIZE):
Rename from HAVE_PERSONALITY_LINUX32, and check for
ADDR_NO_RANDOMIZE (the crucial thing) instead of for LINUX32.
All uses changed.
* src/emacs.c (main) [HAVE_PERSONALITY_ADDR_NO_RANDOMIZE]:
Use ADDR_NO_RANDOMIZE from personality.h rather than inventing the
flag ourselves.  Just set that flag, rather than also setting the
persona.  When doing it, avoid functions like putenv that may
allocate memory.
parent 098d29af
......@@ -233,7 +233,7 @@ HAVE_NET_IF_DL_H
HAVE_NET_IF_H
HAVE_NLIST_H
HAVE_OTF_GET_VARIATION_GLYPHS
HAVE_PERSONALITY_LINUX32
HAVE_PERSONALITY_ADDR_NO_RANDOMIZE
HAVE_PNG
HAVE_PNG_H
HAVE_POSIX_MEMALIGN
......
......@@ -1643,15 +1643,17 @@ AC_CHECK_HEADERS_ONCE(
sys/resource.h
sys/utsname.h pwd.h utmp.h util.h)
AC_MSG_CHECKING(if personality LINUX32 can be set)
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/personality.h>]], [[personality (PER_LINUX32)]])],
emacs_cv_personality_linux32=yes,
emacs_cv_personality_linux32=no)
AC_MSG_RESULT($emacs_cv_personality_linux32)
if test $emacs_cv_personality_linux32 = yes; then
AC_DEFINE(HAVE_PERSONALITY_LINUX32, 1,
[Define to 1 if personality LINUX32 can be set.])
AC_CACHE_CHECK([for ADDR_NO_RANDOMIZE],
[emacs_cv_personality_addr_no_randomize],
[AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM([[#include <sys/personality.h>]],
[[personality (personality (0xffffffff)
| ADDR_NO_RANDOMIZE)]])],
[emacs_cv_personality_addr_no_randomize=yes],
[emacs_cv_personality_addr_no_randomize=no])])
if test $emacs_cv_personality_addr_no_randomize = yes; then
AC_DEFINE([HAVE_PERSONALITY_ADDR_NO_RANDOMIZE], [1],
[Define to 1 if personality flag ADDR_NO_RANDOMIZE exists.])
fi
# Note that Solaris has sys/sysinfo.h which defines struct
......
......@@ -112,7 +112,7 @@ extern void moncontrol (int mode);
#include <sys/resource.h>
#endif
#ifdef HAVE_PERSONALITY_LINUX32
#ifdef HAVE_PERSONALITY_ADDR_NO_RANDOMIZE
#include <sys/personality.h>
#endif
......@@ -796,24 +796,22 @@ main (int argc, char **argv)
dumping = !initialized && (strcmp (argv[argc - 1], "dump") == 0
|| strcmp (argv[argc - 1], "bootstrap") == 0);
#ifdef HAVE_PERSONALITY_LINUX32
if (dumping && ! getenv ("EMACS_HEAP_EXEC"))
#ifdef HAVE_PERSONALITY_ADDR_NO_RANDOMIZE
if (dumping)
{
/* Set this so we only do this once. */
xputenv ("EMACS_HEAP_EXEC=true");
/* A flag to turn off address randomization which is introduced
in linux kernel shipped with fedora core 4 */
#define ADD_NO_RANDOMIZE 0x0040000
personality (PER_LINUX32 | ADD_NO_RANDOMIZE);
#undef ADD_NO_RANDOMIZE
execvp (argv[0], argv);
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, try to dump anyway. */
emacs_perror (argv[0]);
/* If the exec fails, warn and then try without a clean slate. */
perror (argv[0]);
}
}
#endif /* HAVE_PERSONALITY_LINUX32 */
#endif
#if defined (HAVE_SETRLIMIT) && defined (RLIMIT_STACK) && !defined (CYGWIN)
/* Extend the stack space available. Don't do that if dumping,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment