diff options
Diffstat (limited to 'rts/Linker.c')
-rw-r--r-- | rts/Linker.c | 10 |
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")); |