如何在 Haskell 中与 GNU 黄金链接器而不是 ld 链接



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

我怀疑这是因为ld很慢。

如何通过切换到gold链接器来缩短链接时间?

使用 gold 链接速度提高 3 倍

从 GHC 7.8 开始,你可以告诉 GHC 和 cabal(在运行时不必重新编译 GHC(与 GNU Gold 链接。

您需要在.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快,将项目的总链接时间从 150 秒减少到 40 秒。


更新:使用 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

比较最终可执行链接时间的链接时间乘以我的项目:

ld   124 seconds
gold  36 seconds
lld   11 seconds