Index: libffi/src/closures.c
===================================================================
--- libffi.orig/src/closures.c
+++ libffi/src/closures.c
@@ -214,6 +214,8 @@ static int dlmunmap(void *, size_t);
 
 #if !(defined(X86_WIN32) || defined(X86_WIN64)) || defined (__CYGWIN__)
 
+#if FFI_MMAP_EXEC_SELINUX
+
 /* A mutex used to synchronize access to *exec* variables in this file.  */
 static pthread_mutex_t open_temp_exec_file_mutex = PTHREAD_MUTEX_INITIALIZER;
 
@@ -483,6 +485,27 @@ dlmmap (void *start, size_t length, int 
   return dlmmap_locked (start, length, prot, flags, offset);
 }
 
+#else
+
+static void *
+dlmmap (void *start, size_t length, int prot,
+	int flags, int fd, off_t offset)
+{
+  
+  assert (start == NULL && length % malloc_getpagesize == 0
+	  && prot == (PROT_READ | PROT_WRITE)
+	  && flags == (MAP_PRIVATE | MAP_ANONYMOUS)
+	  && fd == -1 && offset == 0);
+  
+#if FFI_CLOSURE_TEST
+  printf ("mapping in %zi\n", length);
+#endif
+  
+  return mmap (start, length, prot | PROT_EXEC, flags, fd, offset);
+}
+
+#endif
+
 /* Release memory at the given address, as well as the corresponding
    executable page if it's separate.  */
 static int
Index: libffi/ChangeLog.libffi
===================================================================
--- libffi.orig/ChangeLog.libffi
+++ libffi/ChangeLog.libffi
@@ -1,3 +1,11 @@
+2009-10-27  Abdulaziz Ghuloum <aghuloum@gmail.com>
+
+	* configure.ac (FFI_MMAP_EXEC_WRIT): Define for snow
+	leopard (i?86-apple-darwin10*).
+	* configure: Rebuilt.
+	* fficonfig.h.in: Rebuilt.
+	* src/closures.c (dlmmap): Define version for snow leopard.
+
 2009-10-05  Bradley Smith  <brad@brad-smith.co.uk>
 
 	* configure.ac, Makefile.am, src/avr32/ffi.c,
Index: libffi/configure.ac
===================================================================
--- libffi.orig/configure.ac
+++ libffi/configure.ac
@@ -163,6 +163,7 @@ case "$host" in
 esac
 
 AC_SUBST(AM_RUNTESTFLAGS)
+AC_SUBST(AM_LTLDFLAGS)
 
 if test $TARGETDIR = unknown; then
   AC_MSG_ERROR(["libffi has not been ported to $host."])
@@ -274,6 +275,14 @@ if test x$TARGET = xX86 || test x$TARGET
     fi
 fi
 
+case "$target" in
+    *-apple-darwin10* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*)
+	AC_DEFINE(FFI_MMAP_EXEC_WRIT, 1,
+		  [Cannot use malloc on this target, so, we revert to
+		   alternative means])
+    ;;
+esac 
+
 AC_CACHE_CHECK([whether .eh_frame section should be read-only],
     libffi_cv_ro_eh_frame, [
 	libffi_cv_ro_eh_frame=no
Index: libffi/configure
===================================================================
--- libffi.orig/configure
+++ libffi/configure
@@ -847,6 +847,7 @@ SPARC_FALSE
 SPARC_TRUE
 MIPS_FALSE
 MIPS_TRUE
+AM_LTLDFLAGS
 AM_RUNTESTFLAGS
 TESTSUBDIR_FALSE
 TESTSUBDIR_TRUE
@@ -4772,13 +4773,13 @@ if test "${lt_cv_nm_interface+set}" = se
 else
   lt_cv_nm_interface="BSD nm"
   echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:4775: $ac_compile\"" >&5)
+  (eval echo "\"\$as_me:4776: $ac_compile\"" >&5)
   (eval "$ac_compile" 2>conftest.err)
   cat conftest.err >&5
-  (eval echo "\"\$as_me:4778: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval echo "\"\$as_me:4779: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
   (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
   cat conftest.err >&5
-  (eval echo "\"\$as_me:4781: output\"" >&5)
+  (eval echo "\"\$as_me:4782: output\"" >&5)
   cat conftest.out >&5
   if $GREP 'External.*some_variable' conftest.out > /dev/null; then
     lt_cv_nm_interface="MS dumpbin"
@@ -5984,7 +5985,7 @@ ia64-*-hpux*)
   ;;
 *-*-irix6*)
   # Find out which ABI we are using.
-  echo '#line 5987 "configure"' > conftest.$ac_ext
+  echo '#line 5988 "configure"' > conftest.$ac_ext
   if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
@@ -7837,11 +7838,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:7840: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:7841: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:7844: \$? = $ac_status" >&5
+   echo "$as_me:7845: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -8176,11 +8177,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8179: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:8180: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:8183: \$? = $ac_status" >&5
+   echo "$as_me:8184: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -8281,11 +8282,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8284: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:8285: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:8288: \$? = $ac_status" >&5
+   echo "$as_me:8289: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -8336,11 +8337,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8339: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:8340: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:8343: \$? = $ac_status" >&5
+   echo "$as_me:8344: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -11139,7 +11140,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11142 "configure"
+#line 11143 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11235,7 +11236,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11238 "configure"
+#line 11239 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -12184,6 +12185,8 @@ case "$host" in
 	;;
   i?86-win32* | i?86-*-cygwin* | i?86-*-mingw*)
 	TARGET=X86_WIN32; TARGETDIR=x86
+	# All mingw/cygwin/win32 builds require this for sharedlib
+	AM_LTLDFLAGS="-no-undefined"
 	;;
   i?86-*-darwin*)
 	TARGET=X86_DARWIN; TARGETDIR=x86
@@ -12263,6 +12266,7 @@ esac
 
 
 
+
 if test $TARGETDIR = unknown; then
   { { $as_echo "$as_me:$LINENO: error: \"libffi has not been ported to $host.\"" >&5
 $as_echo "$as_me: error: \"libffi has not been ported to $host.\"" >&2;}
@@ -14498,7 +14502,7 @@ _ACEOF
 fi
 
 case "$target" in
-    i?86-apple-darwin10*)
+    *-apple-darwin10* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*)
 
 cat >>confdefs.h <<\_ACEOF
 #define FFI_MMAP_EXEC_WRIT 1
