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

时间:2017-04-05 23:38:13

标签: haskell linker gold-linker

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

我怀疑这是因为ld很慢。

如何通过切换到gold链接器来改善链接时间?

1 个答案:

答案 0 :(得分:44)

使用gold

将链接速度提高3倍

Since 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