]> git.eshelyaron.com Git - emacs.git/commitdiff
* emacs.c (my_heap_start, heap_bss_diff, MAX_HEAP_BSS_DIFF):
authorJan Djärv <jan.h.d@swipnet.se>
Wed, 20 Oct 2004 16:23:30 +0000 (16:23 +0000)
committerJan Djärv <jan.h.d@swipnet.se>
Wed, 20 Oct 2004 16:23:30 +0000 (16:23 +0000)
New variables and constant.
(main): Calculate heap_bss_diff.  If we are dumping and the
heap_bss_diff is greater than MAX_HEAP_BSS_DIFF, set PER_LINUX32
and exec ourself again.
(Fdump_emacs): If heap_bss_diff is greater than MAX_HEAP_BSS_DIFF
print a warning.

* lastfile.c: Make my_endbss and my_endbss_static available on all
platforms.

* Makefile.in (RUN_TEMACS): Remove @SETARCH@.
* config.in (HAVE_PERSONALITY_LINUX32): Regenerate.

src/ChangeLog
src/Makefile.in
src/config.in
src/emacs.c
src/lastfile.c

index 5260196d5cde50cf61ba31fc809f7b442b6cf59d..f1cdd38152d4e2d962685930a0ea862b89533115 100644 (file)
@@ -1,3 +1,19 @@
+2004-10-20  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * emacs.c (my_heap_start, heap_bss_diff, MAX_HEAP_BSS_DIFF):
+       New variables and constant.
+       (main): Calculate heap_bss_diff.  If we are dumping and the
+       heap_bss_diff is greater than MAX_HEAP_BSS_DIFF, set PER_LINUX32
+       and exec ourself again.
+       (Fdump_emacs): If heap_bss_diff is greater than MAX_HEAP_BSS_DIFF
+       print a warning.
+
+       * lastfile.c: Make my_endbss and my_endbss_static available on all
+       platforms.
+
+       * Makefile.in (RUN_TEMACS): Remove @SETARCH@.
+       * config.in (HAVE_PERSONALITY_LINUX32): Regenerate.
+
 2004-10-19  Luc Teirlinck  <teirllm@auburn.edu>
 
        * data.c (Flocal_variable_if_set_p): Doc fix.
index f25e0f9d84256bd8c82fce34be0e939bb5ea40d4..deb33730644776e3387bb7742cba6d6f3778c807 100644 (file)
@@ -905,12 +905,7 @@ LIBES = $(LOADLIBES) $(LIBS) $(LIBX) $(LIBSOUND) \
 #define OBJECTS_MACHINE
 #endif
 
-#ifdef HAVE_RANDOM_HEAPSTART
-#undef i386
-RUN_TEMACS = @SETARCH@ i386 ./temacs
-#else
 RUN_TEMACS = ./temacs
-#endif
 
 all: emacs${EXEEXT} OTHER_FILES
 
index 49095ca4e5afae98101b22d558c7385c475edfbb..136f4ecd55deff80c44c02e508089feea834f90e 100644 (file)
@@ -414,6 +414,9 @@ Boston, MA 02111-1307, USA.  */
 /* Define to 1 if you have the <nlist.h> header file. */
 #undef HAVE_NLIST_H
 
+/* Define to 1 if personality LINUX32 can be set. */
+#undef HAVE_PERSONALITY_LINUX32
+
 /* Define to 1 if you have the png library (-lpng). */
 #undef HAVE_PNG
 
@@ -432,9 +435,6 @@ Boston, MA 02111-1307, USA.  */
 /* Define to 1 if you have the `random' function. */
 #undef HAVE_RANDOM
 
-/* Define to 1 if this OS randomizes the start address of the heap. */
-#undef HAVE_RANDOM_HEAPSTART
-
 /* Define to 1 if you have the `recvfrom' function. */
 #undef HAVE_RECVFROM
 
@@ -757,9 +757,9 @@ Boston, MA 02111-1307, USA.  */
 /* If using the C implementation of alloca, define if you know the
    direction of stack growth for your system; otherwise it will be
    automatically deduced at run-time.
-        STACK_DIRECTION > 0 => grows toward higher addresses
-        STACK_DIRECTION < 0 => grows toward lower addresses
-        STACK_DIRECTION = 0 => direction of growth unknown */
+       STACK_DIRECTION > 0 => grows toward higher addresses
+       STACK_DIRECTION < 0 => grows toward lower addresses
+       STACK_DIRECTION = 0 => direction of growth unknown */
 #undef STACK_DIRECTION
 
 /* Define to 1 if you have the ANSI C header files. */
index 6ecfdbd423154c9f78899045eac7395c62a13656..bb601ea8643af5ef71d831a7cda9f1c591b3fe20 100644 (file)
@@ -67,6 +67,10 @@ Boston, MA 02111-1307, USA.  */
 #include <sys/resource.h>
 #endif
 
+#ifdef HAVE_PERSONALITY_LINUX32
+#include <sys/personality.h>
+#endif
+
 #ifndef O_RDWR
 #define O_RDWR 2
 #endif
@@ -192,6 +196,17 @@ int display_arg;
    Tells GC how to save a copy of the stack.  */
 char *stack_bottom;
 
+/* The address where the heap starts (from the first sbrk (0) call).  */
+static void *my_heap_start;
+
+/* The gap between BSS end and heap start as far as we can tell.  */
+static unsigned long heap_bss_diff;
+
+/* If the gap between BSS end and heap start is larger than this we try to
+   work around it, and if that fails, output a warning in dump-emacs.  */
+#define MAX_HEAP_BSS_DIFF (1024*1024)
+
+
 #ifdef HAVE_WINDOW_SYSTEM
 extern Lisp_Object Vwindow_system;
 #endif /* HAVE_WINDOW_SYSTEM */
@@ -733,7 +748,11 @@ malloc_initialize_hook ()
       free (malloc_state_ptr);
     }
   else
-    malloc_using_checking = getenv ("MALLOC_CHECK_") != NULL;
+    {
+      if (my_heap_start == 0)
+        my_heap_start = sbrk (0);
+      malloc_using_checking = getenv ("MALLOC_CHECK_") != NULL;
+    }
 }
 
 void (*__malloc_initialize_hook) () = malloc_initialize_hook;
@@ -809,6 +828,17 @@ main (argc, argv
   stack_base = &dummy;
 #endif
 
+  if (!initialized)
+    {
+      extern char my_endbss[];
+      extern char *my_endbss_static;
+
+      if (my_heap_start == 0)
+        my_heap_start = sbrk (0);
+
+      heap_bss_diff = (char *)my_heap_start - max (my_endbss, my_endbss_static);
+    }
+
 #ifdef LINUX_SBRK_BUG
   __sbrk (1);
 #endif
@@ -852,6 +882,28 @@ main (argc, argv
        }
     }
 
+#ifdef HAVE_PERSONALITY_LINUX32
+  /* See if there is a gap between the end of BSS and the heap.
+     In that case, set personality and exec ourself again.  */
+  if (!initialized
+      && (strcmp (argv[argc-1], "dump") == 0
+          || strcmp (argv[argc-1], "bootstrap") == 0)
+      && heap_bss_diff > MAX_HEAP_BSS_DIFF)
+    {
+      if (! getenv ("EMACS_HEAP_EXEC"))
+        {
+          /* Set this so we only do this once.  */
+          putenv("EMACS_HEAP_EXEC=true");
+          personality (PER_LINUX32);
+          execvp (argv[0], argv);
+
+          /* If the exec fails, try to dump anyway.  */
+          perror ("execvp");
+        }
+    }
+#endif /* HAVE_PERSONALITY_LINUX32 */
+
+
 /* Map in shared memory, if we are using that.  */
 #ifdef HAVE_SHM
   if (argmatch (argv, argc, "-nl", "--no-shared-memory", 6, NULL, &skip_args))
@@ -2130,6 +2182,17 @@ You must run Emacs in batch mode in order to dump it.  */)
   if (! noninteractive)
     error ("Dumping Emacs works only in batch mode");
 
+  if (heap_bss_diff > MAX_HEAP_BSS_DIFF)
+    {
+      fprintf (stderr, "**************************************************\n");
+      fprintf (stderr, "Warning: Your system has a gap between BSS and the\n");
+      fprintf (stderr, "heap.  This usually means that exec-shield or\n");
+      fprintf (stderr, "something similar is in effect.  The dump may fail\n");
+      fprintf (stderr, "because of this.  See the section about exec-shield\n");
+      fprintf (stderr, "in etc/PROBLEMS for more information.\n");
+      fprintf (stderr, "**************************************************\n");
+    }
+
   /* Bind `command-line-processed' to nil before dumping,
      so that the dumped Emacs will process its command line
      and set up to work with X windows if appropriate.  */
index df678b42876d368f4f2ca878b7c8e92f76e16758..d6292e300406673ad5705d6719402fe4ff7839a4 100644 (file)
@@ -40,7 +40,6 @@ Boston, MA 02111-1307, USA.  */
 
 char my_edata[] = "End of Emacs initialized data";
 
-#if defined(WINDOWSNT) || defined(CYGWIN)
 /* Help unexec locate the end of the .bss area used by Emacs (which
    isn't always a separate section in NT executables).  */
 char my_endbss[1];
@@ -50,7 +49,6 @@ char my_endbss[1];
    of the bss area used by Emacs.  */
 static char _my_endbss[1];
 char * my_endbss_static = _my_endbss;
-#endif
 
 /* arch-tag: 67e81ab4-e14f-44b2-8875-c0c12252223e
    (do not change this comment) */