more on the emacs-20.3 segfault
Wolfram Gloger
wmglo@dent.med.uni-muenchen.de
Fri May 28 05:20:00 GMT 1999
> This won't change anything. You cannot install the malloc hook before the
> dynamic linker has passed control to the executable, when it is already
> too late. A constructor won't help either because initializers are called
> after the initial atexit.
Yes, but using __malloc_initialize_hook seems to work just fine for me
with glibc-2.2.1. Patch for emacs-20.3 appended below. Only issue
before I forward it to the Emacs maintainers is whether it works with
libc5, where __malloc_initialize_hook wasn't a weak symbol. Can you
all check whether the patch works for you as well ?
Thanks,
Wolfram.
1999-05-28 Wolfram Gloger <wmglo@dent.med.uni-muenchen.de>
* emacs.c [DOUG_LEA_MALLOC] (malloc_initialize_hook): New
function, assigned to the global __malloc_initialize_hook pointer.
(main): Move malloc_set_state call into malloc_initialize_hook
so that it happens as early as possible.
--- emacs.c 1999/05/28 11:16:33 1.1
+++ emacs.c 1999/05/28 11:52:37
@@ -543,6 +543,26 @@
}
}
+#ifdef DOUG_LEA_MALLOC
+
+/* malloc() can be invoked even before main() (e.g. by the dynamic
+ linker), so the dumped malloc state must be restored as early as
+ possible using this special hook. */
+
+static void
+malloc_initialize_hook ()
+{
+ if (initialized)
+ {
+ malloc_set_state (malloc_state_ptr);
+ free (malloc_state_ptr);
+ }
+}
+
+void (*__malloc_initialize_hook)() = malloc_initialize_hook;
+
+#endif /* DOUG_LEA_MALLOC */
+
/* ARGSUSED */
int
main (argc, argv, envp)
@@ -567,8 +587,6 @@
if (initialized)
{
extern void r_alloc_reinit ();
- malloc_set_state (malloc_state_ptr);
- free (malloc_state_ptr);
r_alloc_reinit ();
}
#endif
More information about the Libc-hacker
mailing list