diff options
Diffstat (limited to 'compiler/main')
-rw-r--r-- | compiler/main/SysTools.hs | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/compiler/main/SysTools.hs b/compiler/main/SysTools.hs index 8ff0d9b6be..080cc0bc7b 100644 --- a/compiler/main/SysTools.hs +++ b/compiler/main/SysTools.hs @@ -738,6 +738,30 @@ The flag is only needed on ELF systems. On Windows (PE) and Mac OS X -} +{- Note [Windows static libGCC] + +The GCC versions being upgraded to in #10726 are configured with +dynamic linking of libgcc supported. This results in libgcc being +linked dynamically when a shared library is created. + +This introduces thus an extra dependency on GCC dll that was not +needed before by shared libraries created with GHC. This is a particular +issue on Windows because you get a non-obvious error due to this missing +dependency. This dependent dll is also not commonly on your path. + +For this reason using the static libgcc is preferred as it preserves +the same behaviour that existed before. There are however some very good +reasons to have the shared version as well as described on page 181 of +https://gcc.gnu.org/onlinedocs/gcc-5.2.0/gcc.pdf : + +"There are several situations in which an application should use the + shared ‘libgcc’ instead of the static version. The most common of these + is when the application wishes to throw and catch exceptions across different + shared libraries. In that case, each of the libraries as well as the application + itself should use the shared ‘libgcc’. " + +-} + neededLinkArgs :: LinkerInfo -> [Option] neededLinkArgs (GnuLD o) = o neededLinkArgs (GnuGold o) = o @@ -815,7 +839,9 @@ getLinkerInfo' dflags = do , "-Wl,--reduce-memory-overheads" -- Increase default stack, see -- Note [Windows stack usage] - , "-Xlinker", "--stack=0x800000,0x800000" ] + -- Force static linking of libGCC + -- Note [Windows static libGCC] + , "-Xlinker", "--stack=0x800000,0x800000", "-static-libgcc" ] _ -> do -- In practice, we use the compiler as the linker here. Pass -- -Wl,--version to get linker version info. |