From 86e7a27c39b8ca2240e6a0c6a9e838f83c23f72c Mon Sep 17 00:00:00 2001 From: Ulrich Müller Date: Sun, 11 May 2008 09:46:37 +0000 Subject: Add patch to fix dumping on kernel 2.6.25, bug 221281. --- emacs/18.59/05_all_bss-heap-gap.patch | 128 ++++++++++++++++++++++++++ emacs/21.4/17_all_bss-heap-gap.patch | 164 ++++++++++++++++++++++++++++++++++ 2 files changed, 292 insertions(+) create mode 100644 emacs/18.59/05_all_bss-heap-gap.patch create mode 100644 emacs/21.4/17_all_bss-heap-gap.patch diff --git a/emacs/18.59/05_all_bss-heap-gap.patch b/emacs/18.59/05_all_bss-heap-gap.patch new file mode 100644 index 0000000..215e951 --- /dev/null +++ b/emacs/18.59/05_all_bss-heap-gap.patch @@ -0,0 +1,128 @@ +Prereq: 2007-01-30 +diff -ur emacs-18.59-orig/src/ChangeLog emacs-18.59/src/ChangeLog +--- emacs-18.59-orig/src/ChangeLog 2007-01-30 01:00:00.000000000 +0100 ++++ emacs-18.59/src/ChangeLog 2008-05-11 02:12:37.000000000 +0200 +@@ -1,3 +1,18 @@ ++2008-05-11 Ulrich Mueller ++ ++ * emacs.c: Handle gap between end of BSS and heap, backported ++ from Emacs 22. Original changes by Jan Djarv and Masatake YAMATO. ++ This fixes dumping on Linux 2.6.25. ++ (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 ADD_NO_RANDOMIZE and exec ourself again. ++ ++ * lastfile.c: (my_endbss, my_endbss_static) New variables. ++ ++ * s-linux.h (HAVE_PERSONALITY_LINUX32): Define. ++ + 2007-01-30 Ulrich Mueller + + * x11term.c (internal_socket_read): Handle XK_BackSpace key. +diff -ur emacs-18.59-orig/src/emacs.c emacs-18.59/src/emacs.c +--- emacs-18.59-orig/src/emacs.c 2007-01-29 21:47:56.000000000 +0100 ++++ emacs-18.59/src/emacs.c 2008-05-11 01:49:58.000000000 +0200 +@@ -78,6 +78,10 @@ + #endif + #endif + ++#ifdef HAVE_PERSONALITY_LINUX32 ++#include ++#endif ++ + #ifndef O_RDWR + #define O_RDWR 2 + #endif +@@ -110,6 +114,16 @@ + int xargc; + #endif /* HAVE_X_WINDOWS */ + ++/* 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 USG_SHARED_LIBRARIES + /* If nonzero, this is the place to put the end of the writable segment + at startup. */ +@@ -241,6 +255,45 @@ + int skip_args = 0; + extern int errno; + extern void malloc_warning (); ++ extern char *sbrk (); ++ ++ 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 ++ - (my_endbss > my_endbss_static ? my_endbss : my_endbss_static); ++ } ++ ++#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 ++ && 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"); ++ ++ /* 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. */ ++ perror ("execvp"); ++ } ++ } ++#endif /* HAVE_PERSONALITY_LINUX32 */ + + /* Map in shared memory, if we are using that. */ + #ifdef HAVE_SHM +diff -ur emacs-18.59-orig/src/lastfile.c emacs-18.59/src/lastfile.c +--- emacs-18.59-orig/src/lastfile.c 1991-03-31 00:05:55.000000000 +0100 ++++ emacs-18.59/src/lastfile.c 2008-05-11 01:52:45.000000000 +0200 +@@ -41,3 +41,13 @@ + #endif + + char my_edata = 0; ++ ++/* 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]; ++ ++/* The Alpha MSVC linker globally segregates all static and public bss ++ data, so we must take both into account to determine the true extent ++ of the bss area used by Emacs. */ ++static char _my_endbss[1]; ++char * my_endbss_static = _my_endbss; +diff -ur emacs-18.59-orig/src/s-linux.h emacs-18.59/src/s-linux.h +--- emacs-18.59-orig/src/s-linux.h 2007-01-29 21:47:56.000000000 +0100 ++++ emacs-18.59/src/s-linux.h 2008-05-11 01:58:40.000000000 +0200 +@@ -161,6 +161,7 @@ + #define HAVE_SYS_SIGLIST /* we have a (non-standard) sys_siglist */ + #define SYS_SIGLIST_DECLARED + #define HAVE_GETWD /* cure conflict with getcwd? */ ++#define HAVE_PERSONALITY_LINUX32 /* personality LINUX32 can be set */ + + #define NO_SIOCTL_H /* don't have sioctl.h */ + #define SYSV_SYSTEM_DIR /* use dirent.h */ diff --git a/emacs/21.4/17_all_bss-heap-gap.patch b/emacs/21.4/17_all_bss-heap-gap.patch new file mode 100644 index 0000000..33e82ce --- /dev/null +++ b/emacs/21.4/17_all_bss-heap-gap.patch @@ -0,0 +1,164 @@ +http://bugs.gentoo.org/220899 +temacs segfaults in dump-emacs under Linux 2.6.25 +Patch backported from Emacs 22, it comprises the following changes: + +2005-07-01 Masatake YAMATO + + * emacs.c (main): Passing ADD_NO_RANDOMIZE to `personality'. + +2004-10-20 Jan Djärv + + * 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. + + * lastfile.c: Make my_endbss and my_endbss_static available on all + platforms. + + * configure.in (HAVE_PERSONALITY_LINUX32): New test if PER_LINUX32 + can be set. + +--- emacs-21.4-orig/configure.in 2008-05-11 00:02:58.000000000 +0200 ++++ emacs-21.4/configure.in 2008-05-11 00:29:23.000000000 +0200 +@@ -1358,6 +1358,18 @@ + AC_CHECK_HEADERS(sys/select.h sys/timeb.h sys/time.h unistd.h utime.h \ + linux/version.h sys/systeminfo.h termios.h limits.h string.h stdlib.h \ + termcap.h stdio_ext.h fcntl.h term.h strings.h) ++ ++AC_MSG_CHECKING(if personality LINUX32 can be set) ++AC_TRY_COMPILE([#include ], [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.]) ++fi ++ + AC_HEADER_STDC + AC_HEADER_TIME + AC_DECL_SYS_SIGLIST +--- emacs-21.4-orig/src/config.in 2002-07-09 00:23:31.000000000 +0200 ++++ emacs-21.4/src/config.in 2008-05-11 00:13:38.000000000 +0200 +@@ -183,6 +183,7 @@ + #undef HAVE_UALARM + #undef HAVE_SYS_WAIT_H + #undef HAVE_STRINGS_H ++#undef HAVE_PERSONALITY_LINUX32 + + #undef HAVE_LIBDNET + #undef HAVE_LIBPTHREADS +--- emacs-21.4-orig/src/emacs.c 2002-08-29 21:27:07.000000000 +0200 ++++ emacs-21.4/src/emacs.c 2008-05-11 00:26:38.000000000 +0200 +@@ -61,6 +61,10 @@ + #include + #endif + ++#ifdef HAVE_PERSONALITY_LINUX32 ++#include ++#endif ++ + #ifndef O_RDWR + #define O_RDWR 2 + #endif +@@ -181,6 +185,16 @@ + 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 */ +@@ -692,7 +706,11 @@ + 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; +@@ -725,6 +743,18 @@ + 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 ++ - (my_endbss > my_endbss_static ? my_endbss : my_endbss_static); ++ } ++ + #ifdef LINUX_SBRK_BUG + __sbrk (1); + #endif +@@ -763,6 +793,33 @@ + } + } + ++#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"); ++ ++ /* 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. */ ++ 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)) +--- emacs-21.4-orig/src/lastfile.c 1999-01-17 20:16:08.000000000 +0100 ++++ emacs-21.4/src/lastfile.c 2008-05-11 00:01:55.000000000 +0200 +@@ -40,7 +40,6 @@ + + char my_edata[] = "End of Emacs initialized data"; + +-#ifdef WINDOWSNT + /* 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,4 +49,3 @@ + of the bss area used by Emacs. */ + static char _my_endbss[1]; + char * my_endbss_static = _my_endbss; +-#endif -- cgit v1.2.3-65-gdbad