+
+#ifdef MMALLOC_WANT_OVERRIDE_LEGACY
+#ifdef HAVE_GNU_LD
+
+#undef _GNU_SOURCE
+#define _GNU_SOURCE 1
+#include <dlfcn.h>
+
+static void * (*real_malloc) (size_t);
+static void * (*real_realloc) (void*,size_t);
+static void * (*real_free) (void*);
+
+static void mm_gnuld_legacy_init(void) { /* This function is called from mmalloc_preinit(); it works even if it's static because all mm is in mm.c */
+ real_malloc = (void * (*) (size_t)) dlsym(RTLD_NEXT, "malloc");
+ real_realloc = (void * (*) (void*,size_t)) dlsym(RTLD_NEXT, "realloc");
+ real_free = (void * (*) (void*)) dlsym(RTLD_NEXT, "free");
+ __mmalloc_current_heap = __mmalloc_default_mdp;
+}
+
+/* Hello pimple!
+ * DL needs some memory while resolving the malloc symbol, that is somehow problematic
+ * To that extend, we have a little area here living in .BSS that we return if asked for memory before the malloc is resolved.
+ */
+int allocated_junk=0; /* keep track of whether our little area was already given to someone */
+char junkarea[4096];
+
+/* This version use mmalloc if there is a current heap, or the legacy implem if not */
+void *malloc(size_t n) {
+ xbt_mheap_t mdp = __mmalloc_current_heap;
+ void *ret;
+#ifdef MM_LEGACY_VERBOSE
+ static int warned_raw = 0;
+ static int warned_mmalloc = 0;