summaryrefslogtreecommitdiff
path: root/rts/Linker.c
diff options
context:
space:
mode:
Diffstat (limited to 'rts/Linker.c')
-rw-r--r--rts/Linker.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/rts/Linker.c b/rts/Linker.c
index 34028d4490..544e7675f0 100644
--- a/rts/Linker.c
+++ b/rts/Linker.c
@@ -501,9 +501,6 @@ initLinker_ (int retain_cafs)
mmap_32bit_base = (void*)RtsFlags.MiscFlags.linkerMemBase;
}
- if (RTS_LINKER_USE_MMAP)
- m32_allocator_init();
-
#if defined(OBJFORMAT_PEi386)
initLinker_PEi386();
#endif
@@ -1233,6 +1230,7 @@ void freeObjectCode (ObjectCode *oc)
ocDeinit_ELF(oc);
#endif
+ m32_allocator_free(oc->m32);
stgFree(oc->fileName);
stgFree(oc->archiveMemberName);
@@ -1311,6 +1309,10 @@ mkOc( pathchar *path, char *image, int imageSize,
/* chain it onto the list of objects */
oc->next = NULL;
+#if RTS_LINKER_USE_MMAP
+ oc->m32 = m32_allocator_new();
+#endif
+
IF_DEBUG(linker, debugBelch("mkOc: done\n"));
return oc;
}
@@ -1629,6 +1631,8 @@ int ocTryLoad (ObjectCode* oc) {
# endif
if (!r) { return r; }
+ m32_allocator_flush(oc->m32);
+
// run init/init_array/ctors/mod_init_func
IF_DEBUG(linker, debugBelch("ocTryLoad: ocRunInit start\n"));