diff -ru libffi-3.0.10/include/ffi.h.in libffi-3.0.10+iPhone/include/ffi.h.in
--- libffi-3.0.10/include/ffi.h.in	2011-08-23 14:28:00.000000000 +0000
+++ libffi-3.0.10+iPhone/include/ffi.h.in	2012-03-18 23:19:19.000000000 +0000
@@ -274,7 +274,16 @@
 __declspec(align(8))
 #endif
 typedef struct {
+union {
+#if @FFI_EXEC_TRAMPOLINE_TABLE@
+    struct {
+      void *trampoline_table;
+      void *trampoline_table_entry;
+    };
+#endif
   char tramp[FFI_TRAMPOLINE_SIZE];
+};
+
   ffi_cif   *cif;
   void     (*fun)(ffi_cif*,void*,void**,void*);
   void      *user_data;
@@ -307,7 +316,15 @@
 # pragma pack 8
 #endif
 typedef struct {
+union {
+#if @FFI_EXEC_TRAMPOLINE_TABLE@
+    struct {
+      void *trampoline_table;
+      void *trampoline_table_entry;
+    };
+#endif
   char tramp[FFI_TRAMPOLINE_SIZE];
+};
 
   ffi_cif   *cif;
 
@@ -328,7 +345,15 @@
 } ffi_raw_closure;
 
 typedef struct {
+union {
+#if @FFI_EXEC_TRAMPOLINE_TABLE@
+    struct {
+      void *trampoline_table;
+      void *trampoline_table_entry;
+    };
+#endif
   char tramp[FFI_TRAMPOLINE_SIZE];
+};
 
   ffi_cif   *cif;
 
diff -ru libffi-3.0.10/libtool-version libffi-3.0.10+iPhone/libtool-version
--- libffi-3.0.10/libtool-version	2011-08-22 18:38:12.000000000 +0000
+++ libffi-3.0.10+iPhone/libtool-version	2012-03-18 23:08:29.000000000 +0000
@@ -26,4 +26,4 @@
 #    release, then set age to 0.
 #
 # CURRENT:REVISION:AGE
-5:10:0
+4:1:0
diff -ru libffi-3.0.10/src/arm/ffi.c libffi-3.0.10+iPhone/src/arm/ffi.c
--- libffi-3.0.10/src/arm/ffi.c	2011-08-23 14:28:04.000000000 +0000
+++ libffi-3.0.10+iPhone/src/arm/ffi.c	2012-03-18 23:15:50.000000000 +0000
@@ -552,7 +552,7 @@
   free (closure);
 }
 
-#else
+#endif
 
 #define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX)				\
 ({ unsigned char *__tramp = (unsigned char*)(TRAMP);			\
@@ -570,8 +570,6 @@
                                                     mapping.  */        \
  })
 
-#endif
-
 /* the cif must already be prep'ed */
 
 ffi_status
@@ -591,13 +589,19 @@
     return FFI_BAD_ABI;
     
 #if FFI_EXEC_TRAMPOLINE_TABLE
+if (closure != codeloc) {
   void **config = FFI_TRAMPOLINE_CODELOC_CONFIG(codeloc);
   config[0] = closure;
   config[1] = closure_func;
-#else
+} else {
+#endif
+
   FFI_INIT_TRAMPOLINE (&closure->tramp[0], \
 		       closure_func,  \
 		       codeloc);
+
+#if FFI_EXEC_TRAMPOLINE_TABLE
+}
 #endif
 
   closure->cif  = cif;
