日記(日記とは言っていない)

https://zenn.dev/23prime に移行しました。

stack build が通らなくなった時のメモ

先日,急に stack build できなくなったので,メモ.

環境とか

  • OS: Ubuntu 18.04 LTS (64bit)
  • Stack: Version 1.7.1
  • stack.yaml での GHC バージョン指定: lts-11.7

事の発端

新しいプロジェクトで stack build したら,次のようなエラーでリンクに失敗しました.

    /usr/bin/x86_64-linux-gnu-ld.gold: エラー: /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgmp.a(realloc.o): requires dynamic R_X86_64_PC32 reloc against 'stderr' which may overflow at runtime; recompile with -fPIC
    /usr/bin/x86_64-linux-gnu-ld.gold: エラー: /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgmp.a(assert.o): requires dynamic R_X86_64_PC32 reloc against 'stderr' which may overflow at runtime; recompile with -fPIC
    /usr/bin/x86_64-linux-gnu-ld.gold: エラー: /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgmp.a(memory.o): requires dynamic R_X86_64_PC32 reloc against 'stderr' which may overflow at runtime; recompile with -fPIC
    /usr/bin/x86_64-linux-gnu-ld.gold: エラー: /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgmp.a(lt23-init2.o): requires dynamic R_X86_64_PC32 reloc against 'stderr' which may overflow at runtime; recompile with -fPIC
    collect2: error: ld returned 1 exit status
    `gcc' failed in phase `Linker'. (Exit code: 1)

最近の変更とか

  • Ubuntu や Stack は新バージョンが降ってきたらすぐに更新したので,最終更新は5月頃.
  • その後,意図的に環境の大きな変更はしていない.
  • その後,6月に新しいプロジェクトを作り,普通に build できていたので,割と急にコケるようになった印象.

試したこと

やってみたことのメモ.

0. とりあえず apt update apt upgradereboot

意味なかった.

1. GHC の再インストール

調べてみると,次のような記事が.

-fPIC を付けて再コンパイルしてください。

というエラーメッセージは一致しているので,解決方法として挙げられている

$ stack setup --reinstall

を打ってみます.

stack setup は通るものの,stack build はコケる.エラーメッセージも変わりません.

2. ~/.stack を飛ばして setup しなおす

↑ をやってみたが,エラーメッセージは変わりません.

さらに,他のプロジェクトも build できなくなって,実質 SEKAI NO OWARI になりました.

3. GHCnopie 版にしてみる

プロジェクト直下の stack.yaml

ghc-build: nopie

を追記.その上で stack setup すると,ghc-nopie-8.2.2 がインストールされます.

この上で stack build しますが,同じエラー.

4. 既にインストールされている GHC を使う

/opt/ 以下にいる GHC を使うようにしてみます.

stack.yaml

system-ghc: true

を追記.

さらに,resolver のバージョンを,こちらの GHC に合わせます.

$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 8.0.1

これに合わせるため,ここ を参考に

resolver: lts-7.24

と書き換えます.

これで stack build しても,やはり同じエラー.

5. Stack の setting を手動で書き換える

Stack の faq を参考にしました.

色々書いてありますが,#2712 の方法を試しました.

ここ でも同じようなことしてます.

一回 rm -rf ~/.stack し,stack.yaml を元に戻して,もう一回 stack setup します.

すると ~/.stack/programs/x86_64-linux/ghc-8.2.2/lib/ghc-8.2.2/settings が生成されているので,コイツを編集します.

- ("C compiler flags", " -fno-stack-protector"),
+ ("C compiler flags", " -fPIC -fno-stack-protector"),

これで stack build するも,同じエラー.

こっちのコメント のようにしてみます.

- ("C compiler flags", " -fno-stack-protector"),
+ ("C compiler flags", " -fno-PIE -fno-stack-protector"),
- ("C compiler link flags", " -fuse-ld=gold"),
+ ("C compiler link flags", " -no-pie -fuse-ld=gold"),
- ("ld flags", ""),
+ ("ld flags", "-no-pie"),

これでも同じエラー.

色々とオプションを書き換えたりしてみましたが,全部ダメでした.

6. Stack のバージョンを落とす

現在は 1.7.1

$ stack --version
Version 1.7.1, Git revision 681c800873816c022739ca7ed14755e85a579565 (5807 commits) x86_64 hpack-0.28.2

リリースノート を見てみると,1.6.5 あたりで PIE に関する仕様が変わってるっぽいので,1.6.1 あたりに落としてみます.

$ stack upgrade --binary-version 1.6.1

これで stack build しても,やっぱりダメ.

7. GMP 関連のパッケージの再インストール

このメモを Twitter にぶん投げたら 天才ハカーからリプをいただいた ので, この辺 のパッケージの再インストールを試みました.

明らかにそれっぽい libgmpxx4ldbl とかいうライブラリがあったので,

$ sudo apt install libgmpxx4ldbl

を打ってみたら,

libgmpxx4ldbl は手動でインストールしたと設定されました。

とかいう怪しい日本語が返ってきたので,再インストールしてみました.

$ sudo apt --reinstall install libgmpxx4ldbl

すると,なんと無事に通るようになった!!!

結論

ちなみに解決への考え方として, リンク時のエラーで,/usr以下とかでのライブラリでコケてる場合は依存パッケージ見直すのが先決 参考にしてた記事のやつはhome dir下とのリンクエラーなので今回の解決にはならない

https://twitter.com/kazuzac/status/1019962416933658625

こういうことらしい(ライブラリの場所とか全然気にしてなかったし,よく見たら全部 GMP 関連でエラー吐いてる…).

@kazuzac さんに感謝🙏🙏🙏