unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#24033: Porting emacs-25 to GNU/Linux ppc64 with draft glibc 2.24
@ 2016-07-20  8:02 Paul Eggert
  2016-07-20 14:59 ` Eli Zaretskii
  0 siblings, 1 reply; 5+ messages in thread
From: Paul Eggert @ 2016-07-20  8:02 UTC (permalink / raw)
  To: 24033

[-- Attachment #1: Type: text/plain, Size: 902 bytes --]

Tags: patch

I'd like to backport the attached patch from master to emacs-25. The 
idea is that Emacs 25 should work with glibc 2.24 (which is still in 
draft form). glibc is withdrawing support for some deprecated symbols 
like malloc_set_state and __malloc_initialize_hook. Emacs is intended to 
be portable to systems lacking these symbols, but this apparently does 
not work on ppc64 and ppc64le platforms. As noted in 
<https://sourceware.org/ml/libc-alpha/2016-07/msg00546.html>, the 
attached patch has been tested on emacs-25 and works on the affected 
platforms. I've also tested it on unaffected platforms such as x86 and 
x86-64.

This issue may be a release blocker for glibc 2.24 (this still hasn't 
been decided). I'd rather that Emacs didn't get in the way of the malloc 
performance improvements intended for glibc 2.24, and installing this 
patch into emacs-25 should help with that.


[-- Attachment #2: 0001-Port-to-glibc-2.24-pre-release-ppc64.patch --]
[-- Type: text/x-patch, Size: 5065 bytes --]

From 418fa48309e1886fe5e611fa07acf193f5e3f7f9 Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Tue, 19 Jul 2016 15:23:14 +0200
Subject: [PATCH] Port to glibc 2.24 (pre-release) + ppc64

Backport from master.
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.  Do all this earlier, so as to avoid problems with calls
to brk in the interim.  When doing it, avoid functions like
putenv that may allocate memory.  Special case for __PPC64__,
which needs ASLR disabled in dumped Emacs too.
---
 admin/CPP-DEFINES |  2 +-
 configure.ac      | 20 +++++++++++---------
 src/emacs.c       | 53 ++++++++++++++++++++++++++++++-----------------------
 3 files changed, 42 insertions(+), 33 deletions(-)

diff --git a/admin/CPP-DEFINES b/admin/CPP-DEFINES
index 796b57d..d404dee 100644
--- a/admin/CPP-DEFINES
+++ b/admin/CPP-DEFINES
@@ -237,7 +237,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
diff --git a/configure.ac b/configure.ac
index 678e98e..9da23d1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1615,15 +1615,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([if personality ADDR_NO_RANDOMIZE flag exists],
+  [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
diff --git a/src/emacs.c b/src/emacs.c
index 5c187e7..b0e5a05 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -106,7 +106,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
 
@@ -674,6 +674,35 @@ main (int argc, char **argv)
 
   stack_base = &dummy;
 
+  dumping = !initialized && (strcmp (argv[argc - 1], "dump") == 0
+			     || strcmp (argv[argc - 1], "bootstrap") == 0);
+
+#ifdef HAVE_PERSONALITY_ADDR_NO_RANDOMIZE
+
+  /* True if address randomization interferes with memory allocaiton.  */
+# ifdef __PPC64__
+  bool disable_aslr = true;
+# else
+  bool disable_aslr = dumping;
+# endif
+
+  if (disable_aslr)
+    {
+      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 the user and then try without a
+	     clean slate.  */
+	  fprintf (stderr, "%s: %s\n", argv[0], strerror (errno));
+	}
+    }
+#endif
+
 #ifndef CANNOT_DUMP
   might_dump = !initialized;
 #endif
@@ -781,28 +810,6 @@ 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"))
-    {
-      /* 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);
-
-      /* If the exec fails, try to dump anyway.  */
-      emacs_perror (argv[0]);
-    }
-#endif /* HAVE_PERSONALITY_LINUX32 */
-
 #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
-- 
2.5.5


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* bug#24033: Porting emacs-25 to GNU/Linux ppc64 with draft glibc 2.24
  2016-07-20  8:02 bug#24033: Porting emacs-25 to GNU/Linux ppc64 with draft glibc 2.24 Paul Eggert
@ 2016-07-20 14:59 ` Eli Zaretskii
  2016-07-20 17:09   ` Paul Eggert
  0 siblings, 1 reply; 5+ messages in thread
From: Eli Zaretskii @ 2016-07-20 14:59 UTC (permalink / raw)
  To: Paul Eggert; +Cc: 24033

> From: Paul Eggert <eggert@cs.ucla.edu>
> Date: Wed, 20 Jul 2016 10:02:32 +0200
> 
> I'd like to backport the attached patch from master to emacs-25. The 
> idea is that Emacs 25 should work with glibc 2.24 (which is still in 
> draft form). glibc is withdrawing support for some deprecated symbols 
> like malloc_set_state and __malloc_initialize_hook. Emacs is intended to 
> be portable to systems lacking these symbols, but this apparently does 
> not work on ppc64 and ppc64le platforms. As noted in 
> <https://sourceware.org/ml/libc-alpha/2016-07/msg00546.html>, the 
> attached patch has been tested on emacs-25 and works on the affected 
> platforms. I've also tested it on unaffected platforms such as x86 and 
> x86-64.

Would it be possible to tweak the patch so that it doesn't change the
code on platforms other than PPC64?  Maybe I misunderstand, but it
looks like some changes are also being done in the non-PPC64 branches
of the patch, and I'd like to avoid that if possible.  (It's okay to
move the code around and change it syntactically, as long as the
semantics is intact for non-PPC64 platforms.)

Thanks.





^ permalink raw reply	[flat|nested] 5+ messages in thread

* bug#24033: Porting emacs-25 to GNU/Linux ppc64 with draft glibc 2.24
  2016-07-20 14:59 ` Eli Zaretskii
@ 2016-07-20 17:09   ` Paul Eggert
  2016-07-20 18:52     ` Eli Zaretskii
  0 siblings, 1 reply; 5+ messages in thread
From: Paul Eggert @ 2016-07-20 17:09 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 24033

[-- Attachment #1: Type: text/plain, Size: 259 bytes --]

On 07/20/2016 04:59 PM, Eli Zaretskii wrote:
>
> Would it be possible to tweak the patch so that it doesn't change the
> code on platforms other than PPC64?

Sure, something like the attached patch perhaps? If so, I can ask my 
PPC64 correspondent to try it.

[-- Attachment #2: 0001-Port-to-glibc-2.24-pre-release-ppc64.patch --]
[-- Type: text/x-patch, Size: 2199 bytes --]

From 37bc57cf803f2ab0b7a7844730ebc17eb43e942d Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Tue, 19 Jul 2016 15:23:14 +0200
Subject: [PATCH] Port to glibc 2.24 (pre-release) + ppc64

Backport from master (Bug#24033).
Inspired by a suggestion by Florian Weimer in:
https://sourceware.org/ml/libc-alpha/2016-07/msg00425.html
* src/emacs.c (main) [__PPC64__]:
Special case for __PPC64__, which needs ASLR disabled in
dumped Emacs too.
---
 src/emacs.c | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/src/emacs.c b/src/emacs.c
index 5c187e7..2480dfc 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -674,6 +674,26 @@ main (int argc, char **argv)
 
   stack_base = &dummy;
 
+#if defined HAVE_PERSONALITY_LINUX32 && defined __PPC64__
+  /* This code partly duplicates the HAVE_PERSONALITY_LINUX32 code
+     below.  This duplication is planned to be fixed in a later
+     Emacs release.  */
+# define ADD_NO_RANDOMIZE 0x0040000
+  int pers = personality (0xffffffff);
+  if (! (pers & ADD_NO_RANDOMIZE)
+      && 0 <= personality (pers | ADD_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 the user and then try without a
+	 clean slate.  */
+      perror (argv[0]);
+    }
+# undef ADD_NO_RANDOMIZE
+#endif
+
 #ifndef CANNOT_DUMP
   might_dump = !initialized;
 #endif
@@ -784,7 +804,7 @@ main (int argc, char **argv)
   dumping = !initialized && (strcmp (argv[argc - 1], "dump") == 0
 			     || strcmp (argv[argc - 1], "bootstrap") == 0);
 
-#ifdef HAVE_PERSONALITY_LINUX32
+#if defined HAVE_PERSONALITY_LINUX32 && !defined __PPC64__
   if (dumping && ! getenv ("EMACS_HEAP_EXEC"))
     {
       /* Set this so we only do this once.  */
@@ -801,7 +821,7 @@ main (int argc, char **argv)
       /* If the exec fails, try to dump anyway.  */
       emacs_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,
-- 
2.5.5


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* bug#24033: Porting emacs-25 to GNU/Linux ppc64 with draft glibc 2.24
  2016-07-20 17:09   ` Paul Eggert
@ 2016-07-20 18:52     ` Eli Zaretskii
  2016-07-21 11:30       ` Paul Eggert
  0 siblings, 1 reply; 5+ messages in thread
From: Eli Zaretskii @ 2016-07-20 18:52 UTC (permalink / raw)
  To: Paul Eggert; +Cc: 24033

> Cc: 24033@debbugs.gnu.org
> From: Paul Eggert <eggert@cs.ucla.edu>
> Date: Wed, 20 Jul 2016 19:09:40 +0200
> 
> On 07/20/2016 04:59 PM, Eli Zaretskii wrote:
> >
> > Would it be possible to tweak the patch so that it doesn't change the
> > code on platforms other than PPC64?
> 
> Sure, something like the attached patch perhaps? If so, I can ask my 
> PPC64 correspondent to try it.

Thanks, this looks good to me for emacs-25.





^ permalink raw reply	[flat|nested] 5+ messages in thread

* bug#24033: Porting emacs-25 to GNU/Linux ppc64 with draft glibc 2.24
  2016-07-20 18:52     ` Eli Zaretskii
@ 2016-07-21 11:30       ` Paul Eggert
  0 siblings, 0 replies; 5+ messages in thread
From: Paul Eggert @ 2016-07-21 11:30 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 24033-done

On 07/20/2016 08:52 PM, Eli Zaretskii wrote:
> Thanks, this looks good to me for emacs-25.

OK, I installed it and am closing this bug report.






^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2016-07-21 11:30 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-07-20  8:02 bug#24033: Porting emacs-25 to GNU/Linux ppc64 with draft glibc 2.24 Paul Eggert
2016-07-20 14:59 ` Eli Zaretskii
2016-07-20 17:09   ` Paul Eggert
2016-07-20 18:52     ` Eli Zaretskii
2016-07-21 11:30       ` Paul Eggert

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).