On 2008-06-09 18:02 +0200, Sven Joachim wrote:
> A patch is available from [2], I will try to adopt it to the Debian
> package later this evening.
> [2] http://bugs.gentoo.org/attachment.cgi?id=152791&action=view
Imported it as debian/patches/fix-dumping.diff with `quilt import' and
edited debian/patches/series to put autofiles.diff back to the last
line. Since the patch modifies configure.in, configure has to be
regenerated, and according to debian/rules I should run
`debian/rules autofiles-sync'. However, that did *not* work:
,----
| Now at patch autofiles.diff
| test "$(QUILT_PATCHES=debian/patches quilt top)" = autofiles.diff
| QUILT_PATCHES=debian/patches quilt pop
| Removing patch autofiles.diff
| Restoring aclocal.m4
| Restoring configure
|
| Now at patch fix-dumping.diff
| mkdir -p debian/tmp-autofiles/old
| tar cpSf - --exclude ./debian --exclude ./.pc . | tar -C
debian/tmp-autofiles/old -xpSf -
| cp -a debian/tmp-autofiles/old debian/tmp-autofiles/new
| # rm aclocal.m4 so it doesn't confuse newer autoconfs, but touch it
| # so ./Makefile won't be upset if it's not recreated (b/c not needed).
| cd debian/tmp-autofiles/new && rm -f aclocal.m4
| cd debian/tmp-autofiles/new && touch aclocal.m4
| cd debian/tmp-autofiles/new && aclocal
| cd debian/tmp-autofiles/new && autoconf
| autoconf: Undefined macros:
| configure.in:1351:AC_SYS_LARGEFILE
| configure.in:1454:AC_C_PROTOTYPES
| configure.in:1455:AC_C_VOLATILE
| configure.in:2052:AC_FUNC_MKTIME
| configure.in:2059:AC_FUNC_FSEEKO
| configure.in:29:AC_CONFIG_LIBOBJ_DIR(src)
| make: *** [autofiles-sync] Error 1
`----
Since I'm clueless when it comes to autotools stuff, somebody else has
to take it up from here. Anyway, here's the patch to
debian/patches/series:
--8<---------------cut here---------------start------------->8---
--- emacs21-21.4a+1.old/debian/patches/series 2008-06-09 19:05:57.000000000
+0200
+++ emacs21-21.4a+1/debian/patches/series 2008-06-09 18:45:56.000000000
+0200
@@ -32,6 +32,7 @@
whitespace-readonly-infloop.diff
fix-x-vs-no-x-diffs.diff
ldapsearch-output.diff
-autofiles.diff
CVE-2007-6109.diff
CVE-2007-2833.diff
+fix-dumping.diff
+autofiles.diff
--8<---------------cut here---------------end--------------->8---
And the new patch debian/patches/fix-dumping.diff as attachment:
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 <[EMAIL PROTECTED]>
* emacs.c (main): Passing ADD_NO_RANDOMIZE to `personality'.
2004-10-20 Jan Djärv <[EMAIL PROTECTED]>
* 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 <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.])
+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 <sys/resource.h>
#endif
+#ifdef HAVE_PERSONALITY_LINUX32
+#include <sys/personality.h>
+#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
Regards,
Sven