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 upgrade
と reboot
意味なかった.
1. GHC の再インストール
調べてみると,次のような記事が.
-fPIC を付けて再コンパイルしてください。
というエラーメッセージは一致しているので,解決方法として挙げられている
$ stack setup --reinstall
を打ってみます.
stack setup
は通るものの,stack build
はコケる.エラーメッセージも変わりません.
2. ~/.stack
を飛ばして setup しなおす
↑ をやってみたが,エラーメッセージは変わりません.
さらに,他のプロジェクトも build
できなくなって,実質 SEKAI NO OWARI になりました.
3. GHC を nopie
版にしてみる
プロジェクト直下の 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 さんに感謝🙏🙏🙏