muslでビルドするにはmusl.ccが便利
Binaryenのビルド済みwasm-optを使うとセグフォする現象に遭遇した時、ビルドを手元で再現するためにmuslを使う必要があったのでメモ。1
musl libc
muslはlibcなので、コンパイラはgccのままsysrootを差し替えることで大体うまいことコンパイルできる。
この設定をmusl-toolsパッケージのmusl-gccラッパーコマンドが勝手にやってくれるが、C++用のラッパーが用意されてなかったりスッとはビルドできない。あとツールチェインに入ってるSanitizer達がglibcを想定してビルドされてたり出来ないことが結構ある。
なので、最初からmuslをターゲットとしてビルドされたツールチェインが欲しくなり、そこでビルド済みのmuslツールチェインを配布しているmusl.ccが便利。2
$ curl -LO https://musl.cc/x86_64-linux-musl-native.tgz $ tar xfz x86_64-linux-musl-native.tgz $ tree -L 1 ./x86_64-linux-musl-native ./x86_64-linux-musl-native |-- bin |-- include |-- lib |-- libexec |-- share |-- usr -> . `-- x86_64-linux-musl
CMakeで使う
musl.ccのツールチェインはsysrootをgccコマンドの相対で設定してくれるので、CMAKE_C_COMPILERさえ設定していれば、特に追加で指定する必要はない。
cmake ../.. -G Ninja \ -DCMAKE_C_COMPILER=./x86_64-linux-musl-native/bin/gcc \ -DCMAKE_CXX_COMPILER=./x86_64-linux-musl-native/bin/g++
-
これは結局muslのスレッドスタックサイズのデフォルト値がglibcよりかなり小さくてスタックオーバーフローしてただけだった https://github.com/WebAssembly/binaryen/issues/4401↩
-
これはOfficialではないがOpenJDKとかでも使われてる↩