Ensure that we always link against libm
authorBen Gamari <bgamari.foss@gmail.com>
Fri, 28 Jul 2017 17:41:04 +0000 (13:41 -0400)
committerBen Gamari <ben@smart-cactus.org>
Fri, 28 Jul 2017 17:41:06 +0000 (13:41 -0400)
ld.gold is particularly picky that we declare all of our link
dependencies on Nix. See #14022.

Test Plan: Validate on Nix

Reviewers: austin

Subscribers: hvr, rwbarton, thomie

GHC Trac Issues: #14022

Differential Revision: https://phabricator.haskell.org/D3787

compiler/main/DriverPipeline.hs
compiler/main/SysTools.hs

index 3fc35e5..7f70377 100644 (file)
@@ -1932,6 +1932,7 @@ linkBinary' staticLink dflags o_files dep_packages = do
                       ++ [ SysTools.Option "-o"
                          , SysTools.FileOption "" output_fn
                          ]
+                      ++ libmLinkOpts
                       ++ map SysTools.Option (
                          []
 
index 3d16124..c73e47c 100644 (file)
@@ -39,6 +39,9 @@ module SysTools (
 
         Option(..),
 
+        -- platform-specifics
+        libmLinkOpts,
+
         -- frameworks
         getPkgFrameworkOpts,
         getFrameworkOpts
@@ -1537,6 +1540,7 @@ linkDynLib dflags0 o_files dep_packages
 
             runLink dflags (
                     map Option verbFlags
+                 ++ libmLinkOpts
                  ++ [ Option "-o"
                     , FileOption "" output_fn
                     ]
@@ -1556,6 +1560,16 @@ linkDynLib dflags0 o_files dep_packages
                  ++ map Option pkg_link_opts
               )
 
+-- | Some platforms require that we explicitly link against @libm@ if any
+-- math-y things are used (which we assume to include all programs). See #14022.
+libmLinkOpts :: [Option]
+libmLinkOpts =
+#if defined(HAVE_LIBM)
+  [Option "-lm"]
+#else
+  []
+#endif
+
 getPkgFrameworkOpts :: DynFlags -> Platform -> [InstalledUnitId] -> IO [String]
 getPkgFrameworkOpts dflags platform dep_packages
   | platformUsesFrameworks platform = do