From c8749d21d9fbb5c644b098fee74caf876ca5206c Mon Sep 17 00:00:00 2001 From: "pho@cielonegro.org" Date: Tue, 30 Nov 2010 14:27:00 +0000 Subject: [PATCH] rts/Linker.c (loadArchive): This routine should be aware of Mach-O misalignment of malloc'ed memory regions. --- rts/Linker.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/rts/Linker.c b/rts/Linker.c index a0e578e..92c1197 100644 --- a/rts/Linker.c +++ b/rts/Linker.c @@ -1685,6 +1685,9 @@ loadArchive( char *path ) char tmp[12]; char *gnuFileIndex; int gnuFileIndexSize; +#if !defined(USE_MMAP) && defined(darwin_HOST_OS) + int misalignment; +#endif IF_DEBUG(linker, debugBelch("loadArchive: Loading archive `%s'\n", path)); @@ -1854,8 +1857,13 @@ loadArchive( char *path ) we use malloc then we can be given memory above 2^32. In the mmap case we're probably wasting lots of space; we could do better. */ -#ifdef USE_MMAP +#if defined(USE_MMAP) image = mmapForLinker(memberSize, MAP_ANONYMOUS, -1); +#elif defined(darwin_HOST_OS) + /* See loadObj() */ + misalignment = machoGetMisalignment(f); + image = stgMallocBytes(memberSize + misalignment, "loadArchive(image)"); + image += misalignment; #else image = stgMallocBytes(memberSize, "loadArchive(image)"); #endif @@ -1872,7 +1880,7 @@ loadArchive( char *path ) oc = mkOc(path, image, memberSize, archiveMemberName #ifndef USE_MMAP #ifdef darwin_HOST_OS - , 0 + , misalignment #endif #endif ); -- 1.7.10.4