diff --git a/aclocal.m4 b/aclocal.m4
index 0852dbf..d604cc0 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -4,6 +4,34 @@
 # ensure we don't clash with any pre-supplied autoconf ones.
 
 
+AC_DEFUN([GHC_SELECT_FILE_EXTENSIONS],
+[
+    $2=''
+    $3='.so'
+    case $1 in
+    *-unknown-cygwin32)
+        AC_MSG_WARN([GHC does not support the Cygwin target at the moment])
+        AC_MSG_WARN([I'm assuming you wanted to build for i386-unknown-mingw32])
+        exit 1
+        ;;
+    *-unknown-mingw32)
+        windows=YES
+        $2='.exe'
+        $3='.dll'
+        ;;
+    i386-apple-darwin|powerpc-apple-darwin)
+        $3='.dylib'
+        ;;
+    x86_64-apple-darwin)
+        $3='.dylib'
+        ;;
+    arm-apple-darwin10)
+        $2='.a'
+        $3='.dylib'
+        ;;
+    esac
+])
+
 # FPTOOLS_SET_PLATFORM_VARS
 # ----------------------------------
 # Set the platform variables
@@ -86,25 +114,12 @@ AC_DEFUN([FPTOOLS_SET_PLATFORM_VARS],
         GHC_CONVERT_OS([$target_os], [$TargetArch], [TargetOS])
     fi
 
+    GHC_SELECT_FILE_EXTENSIONS([$host], [exeext_host], [soext_host])
+    GHC_SELECT_FILE_EXTENSIONS([$target], [exeext_target], [soext_target])
     windows=NO
-    exeext=''
-    soext='.so'
     case $host in
-    *-unknown-cygwin32)
-        AC_MSG_WARN([GHC does not support the Cygwin target at the moment])
-        AC_MSG_WARN([I'm assuming you wanted to build for i386-unknown-mingw32])
-        exit 1
-        ;;
     *-unknown-mingw32)
         windows=YES
-        exeext='.exe'
-        soext='.dll'
-        ;;
-    i386-apple-darwin|powerpc-apple-darwin)
-        soext='.dylib'
-        ;;
-    x86_64-apple-darwin)
-        soext='.dylib'
         ;;
     esac
 
@@ -149,8 +164,10 @@ AC_DEFUN([FPTOOLS_SET_PLATFORM_VARS],
     AC_SUBST(BuildVendor_CPP)
     AC_SUBST(TargetVendor_CPP)
 
-    AC_SUBST(exeext)
-    AC_SUBST(soext)
+    AC_SUBST(exeext_host)
+    AC_SUBST(exeext_target)
+    AC_SUBST(soext_host)
+    AC_SUBST(soext_target)
 ])
 
 
diff --git a/compiler/main/DriverPipeline.hs b/compiler/main/DriverPipeline.hs
index aa49e70..6d28391 100644
--- a/compiler/main/DriverPipeline.hs
+++ b/compiler/main/DriverPipeline.hs
@@ -1874,7 +1874,13 @@ linkBinary dflags o_files dep_packages = do
 
     rc_objs <- maybeCreateManifest dflags output_fn
 
-    SysTools.runLink dflags (
+    -- On iOS, instead of an executable we create a static library.
+    -- We can't use any dynamic libraries when doing this, so here we strip the
+    -- ones that would otherwise get added.
+    let link = case platformOS (targetPlatform dflags) of
+            OSiOS -> SysTools.runLibtool
+            _     -> SysTools.runLink
+    link dflags (
                        map SysTools.Option verbFlags
                       ++ [ SysTools.Option "-o"
                          , SysTools.FileOption "" output_fn
@@ -1938,15 +1944,16 @@ linkBinary dflags o_files dep_packages = do
 exeFileName :: DynFlags -> FilePath
 exeFileName dflags
   | Just s <- outputFile dflags =
-      if platformOS (targetPlatform dflags) == OSMinGW32
-      then if null (takeExtension s)
-           then s <.> "exe"
-           else s
-      else s
+      case platformOS (targetPlatform dflags) of 
+          OSMinGW32 -> s <?.> "exe"
+          OSiOS     -> s <?.> "a"
+          _         -> s
   | otherwise =
       if platformOS (targetPlatform dflags) == OSMinGW32
       then "main.exe"
       else "a.out"
+ where s <?.> ext | null (takeExtension s) = s <.> ext
+                  | otherwise              = s
 
 maybeCreateManifest
    :: DynFlags
diff --git a/compiler/main/SysTools.lhs b/compiler/main/SysTools.lhs
index d43826a..926a1f8 100644
--- a/compiler/main/SysTools.lhs
+++ b/compiler/main/SysTools.lhs
@@ -15,7 +15,7 @@ module SysTools (
         runUnlit, runCpp, runCc, -- [Option] -> IO ()
         runPp,                   -- [Option] -> IO ()
         runSplit,                -- [Option] -> IO ()
-        runAs, runLink,          -- [Option] -> IO ()
+        runAs, runLink, runLibtool, -- [Option] -> IO ()
         runMkDLL,
         runWindres,
         runLlvmOpt,
@@ -717,6 +717,13 @@ runLink dflags args = do
   mb_env <- getGccEnv args2
   runSomethingFiltered dflags id "Linker" p args2 mb_env
 
+runLibtool :: DynFlags -> [Option] -> IO ()
+runLibtool dflags args = do
+  let (p,args0) = ("libtool", [Option "-static"])
+      args1 = args0 ++ args
+  mb_env <- getGccEnv args1
+  runSomethingFiltered dflags id "Linker" p args1 mb_env
+
 runMkDLL :: DynFlags -> [Option] -> IO ()
 runMkDLL dflags args = do
   let (p,args0) = pgm_dll dflags
@@ -1315,6 +1322,7 @@ linkDynLib dflags0 o_files dep_packages
                  ++ map Option pkg_lib_path_opts
                  ++ map Option pkg_link_opts
               )
+        OSiOS -> throwGhcExceptionIO (ProgramError "dynamic libraries are not supported on iOS target")
         _ -> do
             -------------------------------------------------------------------
             -- Making a DSO
diff --git a/ghc.mk b/ghc.mk
index d8d222e..db325f5 100644
--- a/ghc.mk
+++ b/ghc.mk
@@ -658,8 +658,10 @@ BUILD_DIRS += compiler
 BUILD_DIRS += utils/hsc2hs
 BUILD_DIRS += utils/ghc-pkg
 BUILD_DIRS += utils/testremove
+ifeq "$(Stage1Only)" "NO"
 BUILD_DIRS += utils/ghctags
 BUILD_DIRS += utils/dll-split
+endif
 BUILD_DIRS += utils/ghc-pwd
 BUILD_DIRS += utils/ghc-cabal
 BUILD_DIRS += utils/hpc
diff --git a/libraries/haskeline b/libraries/haskeline
--- a/libraries/haskeline
+++ b/libraries/haskeline
@@ -1 +1 @@
-Subproject commit 40bcd6ac30577d1d240166674d1e328ac52c1fd5
+Subproject commit 40bcd6ac30577d1d240166674d1e328ac52c1fd5-dirty
diff --git a/libraries/primitive b/libraries/primitive
--- a/libraries/primitive
+++ b/libraries/primitive
@@ -1 +1 @@
-Subproject commit 75c3379b6d76e914cc3c7ffd290b6b1cad7ea3e6
+Subproject commit 75c3379b6d76e914cc3c7ffd290b6b1cad7ea3e6-dirty
diff --git a/libraries/terminfo b/libraries/terminfo
--- a/libraries/terminfo
+++ b/libraries/terminfo
@@ -1 +1 @@
-Subproject commit 116d3ee6840d52bab69c880d775ae290a20d64bc
+Subproject commit 116d3ee6840d52bab69c880d775ae290a20d64bc-dirty
diff --git a/libraries/time b/libraries/time
--- a/libraries/time
+++ b/libraries/time
@@ -1 +1 @@
-Subproject commit 12ba4321d34d646cf9040ad12810c4257d26ade9
+Subproject commit 12ba4321d34d646cf9040ad12810c4257d26ade9-dirty
diff --git a/libraries/transformers b/libraries/transformers
--- a/libraries/transformers
+++ b/libraries/transformers
@@ -1 +1 @@
-Subproject commit a59fb93860f84ccd44178dcbbb82cfea7e02cd07
+Subproject commit a59fb93860f84ccd44178dcbbb82cfea7e02cd07-dirty
diff --git a/libraries/vector b/libraries/vector
--- a/libraries/vector
+++ b/libraries/vector
@@ -1 +1 @@
-Subproject commit f27156970d9480806a5defcfea5367187c2a6997
+Subproject commit f27156970d9480806a5defcfea5367187c2a6997-dirty
diff --git a/mk/project.mk.in b/mk/project.mk.in
index 7b25368..28692d4 100644
--- a/mk/project.mk.in
+++ b/mk/project.mk.in
@@ -125,11 +125,11 @@ BuildVendor_CPP                 = @BuildVendor_CPP@
 LeadingUnderscore=@LeadingUnderscore@
 
 # Pin a suffix on executables? If so, what (Windows only).
-exeext0=@exeext@
-exeext1=@exeext@
-exeext2=@exeext@
-exeext3=@exeext@
-soext=@soext@
+exeext0=@exeext_host@
+exeext1=@exeext_target@
+exeext2=@exeext_target@
+exeext3=@exeext_target@
+soext=@soext_target@
 
 # Windows_Host=YES if on a Windows platform
 ifneq "$(findstring $(HostOS_CPP), mingw32 cygwin32)" ""
