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.
This commit is contained in:
parent
098d29af10
commit
e95b023163
3 changed files with 26 additions and 26 deletions
|
@ -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
|
||||
|
|
20
configure.ac
20
configure.ac
|
@ -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
|
||||
|
|
30
src/emacs.c
30
src/emacs.c
|
@ -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");
|
||||
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);
|
||||
|
||||
/* 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);
|
||||
|
||||
/* 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,
|
||||
|
|
Loading…
Add table
Reference in a new issue