web-dev-qa-db-ja.com

Haskellでldの代わりにGNU goldリンカーとリンクする方法

私のHaskellプロジェクトはLinking dist/build/myapp/myapp ...およびTemplateHaskellコードの実行時に共有ライブラリをロードする際にも。

これはldが遅いためだと思います。

goldリンカーに切り替えることでリンク時間を改善するにはどうすればよいですか?

33
nh2

goldで3倍高速にリンク

GHC 7.8以降 の場合、GHCとcabalに(実行時にGHCを再コンパイルする必要なしに)GNUゴールドでリンクするように指示できます。

.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
44
nh2