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:
Paul Eggert 2016-07-15 13:07:09 +02:00
parent 098d29af10
commit e95b023163
3 changed files with 26 additions and 26 deletions

View file

@ -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

View file

@ -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

View file

@ -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,