diff --git a/compiler/backpack/DriverBkp.hs b/compiler/backpack/DriverBkp.hs
index f30c676e26c8b40d6c872142d9d896ac5591c0fd..ef06c3fa92d1d80646e92ce6419d560a55ddc335 100644
--- a/compiler/backpack/DriverBkp.hs
+++ b/compiler/backpack/DriverBkp.hs
@@ -341,9 +341,11 @@ buildUnit session cid insts lunit = do
             -- nope
             hsLibraries = [],
             extraLibraries = [],
+            extraLibrariesStatic = [],
             extraGHCiLibraries = [],
             libraryDynDirs = [],
             libraryDirs = [],
+            libraryDirsStatic = [],
             frameworks = [],
             frameworkDirs = [],
             ccOptions = [],
diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs
index 70f50f2a8bb86a02a0c36ab3948398d842409438..ce861d4cff819b845f18591dd09d994905fd7a21 100644
--- a/compiler/main/DynFlags.hs
+++ b/compiler/main/DynFlags.hs
@@ -722,6 +722,7 @@ data GeneralFlag
    | Opt_KeepOFiles
 
    | Opt_BuildDynamicToo
+   | Opt_BuildStaticExe -- ^ when linking an executable, make it fully static
 
    -- safe haskell flags
    | Opt_DistrustAllPackages
@@ -1581,6 +1582,7 @@ isOneShot _other  = False
 data GhcLink
   = NoLink              -- ^ Don't link at all
   | LinkBinary          -- ^ Link object code into a binary
+  | LinkBinaryStatic    -- ^ Link object code into a fully static binary
   | LinkInMemory        -- ^ Use the in-memory dynamic linker (works for both
                         --   bytecode and object code).
   | LinkDynLib          -- ^ Link objects into a dynamic lib (DLL on Windows, DSO on ELF platforms)
@@ -3136,6 +3138,8 @@ dynamic_flags_deps = [
         (noArg (\d -> d { ghcLink=LinkDynLib }))
   , make_ord_flag defGhcFlag "staticlib"
         (noArg (\d -> d { ghcLink=LinkStaticLib }))
+  , make_ord_flag defGhcFlag "staticexe"
+        (NoArg (setGeneralFlag Opt_BuildStaticExe))
   , make_ord_flag defGhcFlag "dynload"            (hasArg parseDynLibLoaderMode)
   , make_ord_flag defGhcFlag "dylib-install-name" (hasArg setDylibInstallName)
 
@@ -5572,6 +5576,8 @@ compilerInfo dflags
        ("Support reexported-modules",  "YES"),
        -- Whether or not we support extended @-package foo (Foo)@ syntax.
        ("Support thinning and renaming package flags", "YES"),
+       -- Whether or not we support library-dirs-static in package databases.
+       ("Support library-dirs-static", "YES"),
        -- Whether or not we support Backpack.
        ("Support Backpack", "YES"),
        -- If true, we require that the 'id' field in installed package info
diff --git a/compiler/main/PackageConfig.hs b/compiler/main/PackageConfig.hs
index 7d096895b4778820783ee173a92fc162f8d9adf2..b445297f5ad445f176ed5237dae5b53892c68760 100644
--- a/compiler/main/PackageConfig.hs
+++ b/compiler/main/PackageConfig.hs
@@ -105,9 +105,11 @@ pprPackageConfig InstalledPackageInfo {..} =
       field "trusted"              (ppr trusted),
       field "import-dirs"          (fsep (map text importDirs)),
       field "library-dirs"         (fsep (map text libraryDirs)),
+      field "library-dirs-static"  (fsep (map text libraryDirsStatic)),
       field "dynamic-library-dirs" (fsep (map text libraryDynDirs)),
       field "hs-libraries"         (fsep (map text hsLibraries)),
       field "extra-libraries"      (fsep (map text extraLibraries)),
+      field "extra-libraries-static" (fsep (map text extraLibrariesStatic)),
       field "extra-ghci-libraries" (fsep (map text extraGHCiLibraries)),
       field "include-dirs"         (fsep (map text includeDirs)),
       field "includes"             (fsep (map text includes)),
diff --git a/compiler/main/Packages.hs b/compiler/main/Packages.hs
index ca2e74dfcf395be424cfa917031971fb18a1ff5c..ca895861c08013d7abd658b832775a21d3bc8c93 100644
--- a/compiler/main/Packages.hs
+++ b/compiler/main/Packages.hs
@@ -666,6 +666,7 @@ mungePackagePaths top_dir pkgroot pkg =
       importDirs  = munge_paths (importDirs pkg),
       includeDirs = munge_paths (includeDirs pkg),
       libraryDirs = munge_paths (libraryDirs pkg),
+      libraryDirsStatic = munge_paths (libraryDirsStatic pkg),
       libraryDynDirs = munge_paths (libraryDynDirs pkg),
       frameworkDirs = munge_paths (frameworkDirs pkg),
       haddockInterfaces = munge_paths (haddockInterfaces pkg),
@@ -1798,20 +1799,27 @@ getPackageLinkOpts :: DynFlags -> [PreloadUnitId] -> IO ([String], [String], [St
 getPackageLinkOpts dflags pkgs =
   collectLinkOpts dflags `fmap` getPreloadPackagesAnd dflags pkgs
 
+getLibraries :: DynFlags -> PackageConfig -> [String]
+getLibraries dflags pc
+  | gopt Opt_BuildStaticExe dflags = extraLibrariesStatic pc
+  | otherwise                      = extraLibraries pc
+
 collectLinkOpts :: DynFlags -> [PackageConfig] -> ([String], [String], [String])
 collectLinkOpts dflags ps =
     (
         concatMap (map ("-l" ++) . packageHsLibs dflags) ps,
-        concatMap (map ("-l" ++) . extraLibraries) ps,
+        concatMap (map ("-l" ++) . getLibraries dflags) ps,
         concatMap ldOptions ps
     )
+  where
+
 collectArchives :: DynFlags -> PackageConfig -> IO [FilePath]
 collectArchives dflags pc =
   filterM doesFileExist [ searchPath </> ("lib" ++ lib ++ ".a")
                         | searchPath <- searchPaths
                         , lib <- libs ]
   where searchPaths = nub . filter notNull . libraryDirsForWay dflags $ pc
-        libs        = packageHsLibs dflags pc ++ extraLibraries pc
+        libs        = packageHsLibs dflags pc ++ getLibraries dflags pc
 
 getLibs :: DynFlags -> [PreloadUnitId] -> IO [(String,String)]
 getLibs dflags pkgs = do
@@ -1869,11 +1877,13 @@ packageHsLibs dflags p = map (mkDynName . addSuffix) (hsLibraries p)
         expandTag t | null t = ""
                     | otherwise = '_':t
 
--- | Either the 'libraryDirs' or 'libraryDynDirs' as appropriate for the way.
+-- | Either the 'libraryDirs', 'libraryDirsStatic', or 'libraryDynDirs'
+-- as appropriate for the way.
 libraryDirsForWay :: DynFlags -> PackageConfig -> [String]
 libraryDirsForWay dflags
-  | WayDyn `elem` ways dflags = libraryDynDirs
-  | otherwise                 = libraryDirs
+  | WayDyn `elem` ways dflags      = libraryDynDirs
+  | gopt Opt_BuildStaticExe dflags = libraryDirsStatic
+  | otherwise                      = libraryDirs
 
 -- | Find all the C-compiler options in these and the preload packages
 getPackageExtraCcOpts :: DynFlags -> [PreloadUnitId] -> IO [String]
diff --git a/hadrian/hadrian.cabal b/hadrian/hadrian.cabal
index 013896e88718082d77532fa489fc46df915acfbb..90e47b1865373744bf2a8ab5587e67da7143a3ce 100644
--- a/hadrian/hadrian.cabal
+++ b/hadrian/hadrian.cabal
@@ -133,7 +133,7 @@ executable hadrian
     other-extensions:    MultiParamTypeClasses
                        , TypeFamilies
     build-depends:       base                 >= 4.8     && < 5
-                       , Cabal                >= 3.0     && < 3.1
+                       , Cabal                >= 3.0     && < 3.3
                        , containers           >= 0.5     && < 0.7
                        , directory            >= 1.3.1.0 && < 1.4
                        , extra                >= 1.4.7
diff --git a/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs b/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs
index af7966c0ef4a31d9a189b948324bd9dfb335ec86..e4d83433c4e9721bc4ecfb72af0619a86e2780d2 100644
--- a/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs
+++ b/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs
@@ -268,7 +268,9 @@ resolveContextData context@Context {..} = do
           , includes        = C.includes        buildInfo
           , installIncludes = C.installIncludes buildInfo
           , extraLibs       = C.extraLibs       buildInfo
+          , extraLibsStatic = C.extraLibsStatic buildInfo
           , extraLibDirs    = C.extraLibDirs    buildInfo
+          , extraLibDirsStatic = C.extraLibDirsStatic buildInfo
           , asmSrcs         = C.asmSources      buildInfo
           , cSrcs           = C.cSources        buildInfo
           , cmmSrcs         = C.cmmSources      buildInfo
diff --git a/hadrian/src/Hadrian/Haskell/Cabal/Type.hs b/hadrian/src/Hadrian/Haskell/Cabal/Type.hs
index 2b5d51a719cc1522f334030d70fa85240e2f1b31..a02754c3c351f053dec1817440db56503d2e7775 100644
--- a/hadrian/src/Hadrian/Haskell/Cabal/Type.hs
+++ b/hadrian/src/Hadrian/Haskell/Cabal/Type.hs
@@ -50,7 +50,9 @@ data ContextData = ContextData
     , includes           :: [String]
     , installIncludes    :: [String]
     , extraLibs          :: [String]
+    , extraLibsStatic    :: [String]
     , extraLibDirs       :: [String]
+    , extraLibDirsStatic :: [String]
     , asmSrcs            :: [String]
     , cSrcs              :: [String]
     , cmmSrcs            :: [String]
diff --git a/libraries/Cabal b/libraries/Cabal
index 63331c95ed15cc7e3d83850d308dc3a86a8c3c76..cc4ae8a3dd818c0d67b1988157cc63245dfd4d13 160000
--- a/libraries/Cabal
+++ b/libraries/Cabal
@@ -1 +1 @@
-Subproject commit 63331c95ed15cc7e3d83850d308dc3a86a8c3c76
+Subproject commit cc4ae8a3dd818c0d67b1988157cc63245dfd4d13
diff --git a/libraries/ghc-boot/GHC/PackageDb.hs b/libraries/ghc-boot/GHC/PackageDb.hs
index 31073711d4908b9609a1c54b31b6b175ce1ddb52..60d15237ba70911d222bf0bbc3497b0400420291 100644
--- a/libraries/ghc-boot/GHC/PackageDb.hs
+++ b/libraries/ghc-boot/GHC/PackageDb.hs
@@ -106,8 +106,10 @@ data InstalledPackageInfo compid srcpkgid srcpkgname instunitid unitid modulenam
        importDirs         :: [FilePath],
        hsLibraries        :: [String],
        extraLibraries     :: [String],
+       extraLibrariesStatic :: [String],
        extraGHCiLibraries :: [String],
        libraryDirs        :: [FilePath],
+       libraryDirsStatic  :: [FilePath],
        libraryDynDirs     :: [FilePath],
        frameworks         :: [String],
        frameworkDirs      :: [FilePath],
@@ -189,8 +191,10 @@ emptyInstalledPackageInfo =
        importDirs         = [],
        hsLibraries        = [],
        extraLibraries     = [],
+       extraLibrariesStatic = [],
        extraGHCiLibraries = [],
        libraryDirs        = [],
+       libraryDirsStatic  = [],
        libraryDynDirs     = [],
        frameworks         = [],
        frameworkDirs      = [],
@@ -437,8 +441,8 @@ instance (RepInstalledPackageInfo a b c d e f g) =>
          packageName packageVersion
          sourceLibName
          abiHash depends abiDepends importDirs
-         hsLibraries extraLibraries extraGHCiLibraries
-         libraryDirs libraryDynDirs
+         hsLibraries extraLibraries extraLibrariesStatic extraGHCiLibraries
+         libraryDirs libraryDirsStatic libraryDynDirs
          frameworks frameworkDirs
          ldOptions ccOptions
          includes includeDirs
@@ -459,8 +463,10 @@ instance (RepInstalledPackageInfo a b c d e f g) =>
     put importDirs
     put hsLibraries
     put extraLibraries
+    put extraLibrariesStatic
     put extraGHCiLibraries
     put libraryDirs
+    put libraryDirsStatic
     put libraryDynDirs
     put frameworks
     put frameworkDirs
@@ -491,8 +497,10 @@ instance (RepInstalledPackageInfo a b c d e f g) =>
     importDirs         <- get
     hsLibraries        <- get
     extraLibraries     <- get
+    extraLibrariesStatic <- get
     extraGHCiLibraries <- get
     libraryDirs        <- get
+    libraryDirsStatic  <- get
     libraryDynDirs     <- get
     frameworks         <- get
     frameworkDirs      <- get
@@ -519,8 +527,8 @@ instance (RepInstalledPackageInfo a b c d e f g) =>
               (map fromStringRep depends)
               (map (\(k,v) -> (fromStringRep k, v)) abiDepends)
               importDirs
-              hsLibraries extraLibraries extraGHCiLibraries
-              libraryDirs libraryDynDirs
+              hsLibraries extraLibraries extraLibrariesStatic extraGHCiLibraries
+              libraryDirs libraryDirsStatic libraryDynDirs
               frameworks frameworkDirs
               ldOptions ccOptions
               includes includeDirs
diff --git a/utils/ghc-pkg/Main.hs b/utils/ghc-pkg/Main.hs
index 946ae72007091a4af7b671e55cc12eb4379f4eee..eb367fb9d3697859ca426f3cd31e2908641f8259 100644
--- a/utils/ghc-pkg/Main.hs
+++ b/utils/ghc-pkg/Main.hs
@@ -975,6 +975,7 @@ mungePackagePaths top_dir pkgroot pkg =
       importDirs  = munge_paths (importDirs pkg),
       includeDirs = munge_paths (includeDirs pkg),
       libraryDirs = munge_paths (libraryDirs pkg),
+      libraryDirsStatic = munge_paths (libraryDirsStatic pkg),
       libraryDynDirs = munge_paths (libraryDynDirs pkg),
       frameworkDirs = munge_paths (frameworkDirs pkg),
       haddockInterfaces = munge_paths (haddockInterfaces pkg),
@@ -1375,8 +1376,10 @@ convertPackageInfoToCacheFormat pkg =
        GhcPkg.importDirs         = importDirs pkg,
        GhcPkg.hsLibraries        = hsLibraries pkg,
        GhcPkg.extraLibraries     = extraLibraries pkg,
+       GhcPkg.extraLibrariesStatic = extraLibrariesStatic pkg,
        GhcPkg.extraGHCiLibraries = extraGHCiLibraries pkg,
        GhcPkg.libraryDirs        = libraryDirs pkg,
+       GhcPkg.libraryDirsStatic  = libraryDirsStatic pkg,
        GhcPkg.libraryDynDirs     = libraryDynDirs pkg,
        GhcPkg.frameworks         = frameworks pkg,
        GhcPkg.frameworkDirs      = frameworkDirs pkg,
@@ -1897,6 +1900,7 @@ checkPackageConfig pkg verbosity db_stack
   checkDuplicateDepends (depends pkg)
   mapM_ (checkDir False "import-dirs")  (importDirs pkg)
   mapM_ (checkDir True  "library-dirs") (libraryDirs pkg)
+  mapM_ (checkDir True  "library-dirs-static") (libraryDirsStatic pkg)
   mapM_ (checkDir True  "dynamic-library-dirs") (libraryDynDirs pkg)
   mapM_ (checkDir True  "include-dirs") (includeDirs pkg)
   mapM_ (checkDir True  "framework-dirs") (frameworkDirs pkg)
@@ -1906,7 +1910,7 @@ checkPackageConfig pkg verbosity db_stack
   checkExposedModules db_stack pkg
   checkOtherModules pkg
   let has_code = Set.null (openModuleSubstFreeHoles (Map.fromList (instantiatedWith pkg)))
-  when has_code $ mapM_ (checkHSLib verbosity (libraryDirs pkg ++ libraryDynDirs pkg)) (hsLibraries pkg)
+  when has_code $ mapM_ (checkHSLib verbosity (libraryDirs pkg ++ libraryDirsStatic pkg ++ libraryDynDirs pkg)) (hsLibraries pkg)
   -- ToDo: check these somehow?
   --    extra_libraries :: [String],
   --    c_includes      :: [String],