如何 link 使用 GNU gold linker 而不是 Haskell 中的 ld

How to link with the GNU gold linker instead of ld in Haskell

我的 Haskell 项目在 Linking dist/build/myapp/myapp ... 以及执行 TemplateHaskell 代码时加载共享库上花费了大量时间。

我怀疑这是因为 ld 很慢。

如何通过切换到 gold linker 提高 link 倍?

Link 使用 gold

快 3 倍

Since GHC 7.8,您可以使用 GNU gold 告诉 GHC 和 cabal(在 运行 时无需重新编译 GHC)到 link。

您需要在 .cabal 文件中:

library:
  ghc-options: -optl-fuse-ld=gold
  ld-options:  -fuse-ld=gold

executable myExecutable
  ghc-options: -optl-fuse-ld=gold
  ld-options:  -fuse-ld=gold

(请注意,您可能希望在命令行上将这些标志传递给 stack/cabal/Setup.hs,而不是在 .cabal 文件中对它们进行硬编码,以免减少包的便携性。)

对我来说 3.5x 更快,将项目的总 link 时间从 150 秒减少到 40 秒。


更新:Link lld

快 10 倍

有关完整示例,请参阅 https://github.com/nh2/link-with-lld-example;关键部分:

library
  ghc-options: "-pgmP clang" "-pgmc clang" "-pgma clang" "-pgml clang" "-optl-fuse-ld=lld"
  ld-options:  -fuse-ld=lld

executable myExecutable
  ghc-options: "-pgmP clang" "-pgmc clang" "-pgma clang" "-pgml clang"
  ld-options:  -fuse-ld=lld

最终可执行文件 link 时间与我的项目的 link 时间比较:

ld   124 seconds
gold  36 seconds
lld   11 seconds