From: Jan Djärv Date: Wed, 20 Oct 2004 16:23:30 +0000 (+0000) Subject: * emacs.c (my_heap_start, heap_bss_diff, MAX_HEAP_BSS_DIFF): X-Git-Tag: ttn-vms-21-2-B4~4461 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=dede27921696e4e940c93fa7335066864c93ccfd;p=emacs.git * 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. --- diff --git a/src/ChangeLog b/src/ChangeLog index 5260196d5cd..f1cdd38152d 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,19 @@ +2004-10-20 Jan Dj,Ad(Brv + + * 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 * data.c (Flocal_variable_if_set_p): Doc fix. diff --git a/src/Makefile.in b/src/Makefile.in index f25e0f9d842..deb33730644 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -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 diff --git a/src/config.in b/src/config.in index 49095ca4e5a..136f4ecd55d 100644 --- a/src/config.in +++ b/src/config.in @@ -414,6 +414,9 @@ Boston, MA 02111-1307, USA. */ /* Define to 1 if you have the 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. */ diff --git a/src/emacs.c b/src/emacs.c index 6ecfdbd4231..bb601ea8643 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -67,6 +67,10 @@ Boston, MA 02111-1307, USA. */ #include #endif +#ifdef HAVE_PERSONALITY_LINUX32 +#include +#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. */ diff --git a/src/lastfile.c b/src/lastfile.c index df678b42876..d6292e30040 100644 --- a/src/lastfile.c +++ b/src/lastfile.c @@ -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) */