summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
authorpho@cielonegro.org <unknown>2010-11-30 14:27:00 +0000
committerpho@cielonegro.org <unknown>2010-11-30 14:27:00 +0000
commitc8749d21d9fbb5c644b098fee74caf876ca5206c (patch)
tree1bc3bf6b2c24c6e8b0b1935846d3cae7f99f99c8 /rts
parentf9597b672c50fec048cfd0eebbf172ae21217fef (diff)
downloadhaskell-c8749d21d9fbb5c644b098fee74caf876ca5206c.tar.gz
rts/Linker.c (loadArchive):
This routine should be aware of Mach-O misalignment of malloc'ed memory regions.
Diffstat (limited to 'rts')
-rw-r--r--rts/Linker.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/rts/Linker.c b/rts/Linker.c
index a0e578e4de..92c1197f32 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
);