diff options
author | pho@cielonegro.org <unknown> | 2010-11-30 14:27:00 +0000 |
---|---|---|
committer | pho@cielonegro.org <unknown> | 2010-11-30 14:27:00 +0000 |
commit | c8749d21d9fbb5c644b098fee74caf876ca5206c (patch) | |
tree | 1bc3bf6b2c24c6e8b0b1935846d3cae7f99f99c8 | |
parent | f9597b672c50fec048cfd0eebbf172ae21217fef (diff) | |
download | haskell-c8749d21d9fbb5c644b098fee74caf876ca5206c.tar.gz |
rts/Linker.c (loadArchive):
This routine should be aware of Mach-O misalignment of malloc'ed memory regions.
-rw-r--r-- | rts/Linker.c | 12 |
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 ); |