summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorDuncan Coutts <duncan@well-typed.com>2009-05-15 16:08:14 +0000
committerDuncan Coutts <duncan@well-typed.com>2009-05-15 16:08:14 +0000
commitfa00cc50ecd1aa292657720b7594b7bdb82c970c (patch)
treed95b663f69a1da11e86923c129b785537497d2e5 /compiler
parent3d411991d3c697e5a93e6922582fe8299210e83d (diff)
downloadhaskell-fa00cc50ecd1aa292657720b7594b7bdb82c970c.tar.gz
Keep C main separate from rts lib and link it in for standalone progs
Previously the object code for the C main function lived in the rts lib, however this is a problem when the rts is built as a shared lib. With Windows DLLs it always causes problems while on ELF systems it's a problem when the user decides to use their own C main function rather than a Haskell Main.main. So instead we now put main in it's own tiny little static lib libHSrtsmain.a which we install next to the rts libs. Whenever ghc links a program (without -no-hs-main) then it also links in -lHSrtsmain. For consistency we always do it this way now rather than trying to do it differently for static vs shared libraries.
Diffstat (limited to 'compiler')
-rw-r--r--compiler/main/DriverPipeline.hs8
1 files changed, 8 insertions, 0 deletions
diff --git a/compiler/main/DriverPipeline.hs b/compiler/main/DriverPipeline.hs
index f8f06765a3..6c6930713d 100644
--- a/compiler/main/DriverPipeline.hs
+++ b/compiler/main/DriverPipeline.hs
@@ -1379,6 +1379,13 @@ linkBinary dflags o_files dep_packages = do
let lib_paths = libraryPaths dflags
let lib_path_opts = map ("-L"++) lib_paths
+ -- The C "main" function is not in the rts but in a separate static
+ -- library libHSrtsmain.a that sits next to the rts lib files. Assuming
+ -- we're using a Haskell main function then we need to link it in.
+ let no_hs_main = dopt Opt_NoHsMain dflags
+ let main_lib | no_hs_main = []
+ | otherwise = [ "-lHSrtsmain" ]
+
pkg_link_opts <- getPackageLinkOpts dflags dep_packages
#ifdef darwin_TARGET_OS
@@ -1445,6 +1452,7 @@ linkBinary dflags o_files dep_packages = do
++ framework_opts
#endif
++ pkg_lib_path_opts
+ ++ main_lib
++ pkg_link_opts
#ifdef darwin_TARGET_OS
++ pkg_framework_path_opts