- /* The effect of this mremap() call is only the ensure that we have
- * a sufficient number of virtually contiguous pages. As returned from
- * mremap, the pages past the end of the file are not backed. We give
- * them a backing by using MAP_FIXED to map in anonymous pages.
- */
- oc->image = mremap( oc->image, n, m, MREMAP_MAYMOVE );
-
- if( oc->image == MAP_FAILED )
- {
- errorBelch( "Unable to mremap for Jump Islands\n" );
- return 0;
- }
-
- if( mmap( oc->image + n, m - n, PROT_READ | PROT_WRITE | PROT_EXEC,
- MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0 ) == MAP_FAILED )
- {
- errorBelch( "Unable to mmap( MAP_FIXED ) for Jump Islands\n" );
- return 0;
- }
+ oc->symbol_extras = mmap (NULL, sizeof(SymbolExtra) * count,
+ PROT_EXEC|PROT_READ|PROT_WRITE,
+ MAP_PRIVATE|MAP_ANONYMOUS|EXTRA_MAP_FLAGS,
+ 0, 0);
+ if (oc->symbol_extras == MAP_FAILED)
+ {
+ errorBelch( "Unable to mmap() for jump islands\n" );
+ return 0;
+ }
+#ifdef x86_64_HOST_ARCH
+ if ((StgWord)oc->symbol_extras > 0x80000000)
+ {
+ barf("mmap() returned memory outside 2Gb");
+ }
+#endif
+ }
+ else
+ {
+ oc->symbol_extras = (SymbolExtra *) (oc->image + aligned);