diff --git a/Cabal.hs b/Cabal.hs
--- a/Cabal.hs
+++ b/Cabal.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE OverloadedStrings, RecordWildCards #-}
 
 module Cabal (initializeGHC) where
 
@@ -16,7 +16,6 @@
 import GHCApi
 import GHCChoice
 import qualified Gap
-import Language.Haskell.Extension
 import System.Directory
 import System.FilePath
 import Types
@@ -34,18 +33,17 @@
         return (fileName,logReader)
     withCabal = do
         (owdir,cdir,cfile) <- liftIO getDirs
-        binfo <- liftIO $ parseCabalFile cfile
-        let (idirs',exts',mlang) = extractBuildInfo binfo
-            exts = map (addX . Gap.extensionToString)  exts'
-            lang = maybe "-XHaskell98" (addX . show) mlang
-            gopts = ghcOptions ++ exts ++ [lang]
-        changeToCabalDirectory cdir
-        let idirs = case idirs' of
+        binfo@BuildInfo{..} <- liftIO $ parseCabalFile cfile
+        let exts = map (addX . Gap.extensionToString) $ usedExtensions binfo
+            lang = maybe "-XHaskell98" (addX . show) defaultLanguage
+            libs = map ("-l" ++) extraLibs
+            libDirs = map ("-L" ++) extraLibDirs
+            gopts = ghcOptions ++ exts ++ [lang] ++ libs ++ libDirs
+            idirs = case hsSourceDirs of
                 []   -> [cdir,owdir]
-                dirs -> dirs ++ [owdir]
-            file = ajustFileName fileName owdir cdir
+                dirs -> map (cdir </>) dirs ++ [owdir]
         logReader <- initSession opt gopts idirs logging
-        return (file,logReader)
+        return (fileName,logReader)
     addX = ("-X" ++)
 
 ----------------------------------------------------------------
@@ -61,26 +59,7 @@
     toMaybe [] = Nothing
     toMaybe (x:_) = Just x
 
--- SourceDirs, Extensions, and Language
-extractBuildInfo :: BuildInfo -> ([String],[Extension],Maybe Language)
-extractBuildInfo binfo = (hsSourceDirs binfo
-                         ,oldExtensions binfo
-                         ,defaultLanguage binfo)
-
 ----------------------------------------------------------------
-
-ajustFileName :: FilePath -> FilePath -> FilePath -> FilePath
-ajustFileName name olddir newdir
-  | olen == nlen = name
-  | otherwise    = drop (nlen+1) olddir </> name
-  where
-    olen = length olddir
-    nlen = length newdir
-
-changeToCabalDirectory :: FilePath -> Ghc ()
-changeToCabalDirectory dir = do
-    liftIO $ setCurrentDirectory dir
-    workingDirectoryChanged
 
 -- CurrentWorkingDir, CabalDir, CabalFile
 getDirs :: IO (FilePath,FilePath,FilePath)
diff --git a/GHCApi.hs b/GHCApi.hs
--- a/GHCApi.hs
+++ b/GHCApi.hs
@@ -45,7 +45,7 @@
     d' = d {
         packageFlags = ghcPackage : packageFlags d
       , importPaths = idirs
-      , ghcLink = NoLink
+      , ghcLink = LinkInMemory
       , hscTarget = HscInterpreted
       , flags = flags d
       }
diff --git a/GHCMod.hs b/GHCMod.hs
--- a/GHCMod.hs
+++ b/GHCMod.hs
@@ -62,7 +62,7 @@
 parseArgs :: [OptDescr (Options -> Options)] -> [String] -> (Options, [String])
 parseArgs spec argv
     = case getOpt Permute spec argv of
-        (o,n,[]  ) -> (foldl (flip id) defaultOptions o, n)
+        (o,n,[]  ) -> (foldr id defaultOptions o, n)
         (_,_,errs) -> throw (CmdArg errs)
 
 ----------------------------------------------------------------
diff --git a/ghc-mod.cabal b/ghc-mod.cabal
--- a/ghc-mod.cabal
+++ b/ghc-mod.cabal
@@ -1,5 +1,5 @@
 Name:                   ghc-mod
-Version:                1.10.11
+Version:                1.10.12
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
 License:                BSD3
