C ランタイムライブラリ • https://www.musl-libc.org • コンテナ容量削減の目的で Alpine Linux などで使われている • glibc でビルドした実行ファイルがそのまま動くが一部動かないものがある • musl が原因で Alpine Linux で動かない場合の一般的な解決策 a. Alpine Linux をやめて Debian などを使う → コンテナサイズふえる b. Alpine Linux の中に glibc もインストールする → めんどくさい https://gitlab.com/dar/hugo/blob/feat-postCSS/Dockerfile
checkout development $ docker run --rm -it -v $PWD:/src --workdir /src registry.gitlab.com/pages/hugo/hugo_extended /bin/sh /src # hugo Building sites ... Segmentation fault まずは報告のあったサイトで hugo を動かしてみる
new threads on glibc is determined based on the resource limit governing the main thread’s stack (RLIMIT_STACK). It generally ends up being 2-10 MB. musl provides a default stack size of 80k. This does not include the guard page, nor does it include the space used for TLS unless total TLS size is very small. So the actual map size may appear closer to 90k, with around 80k usable by the application. This size was determined empirically with the goals of not gratuitously breaking applications but also not causing large amounts of memory and virtual address space to be committed in programs with large numbers of threads. Programs needing larger stacks, or which explicitly want a smaller stack, should make this explicit with pthread_attr_setstacksize. For largely unrestrained use of the standard library, a minimum of 12k is recommended, but stack sizes down to 2k are allowed. https://wiki.musl-libc.org/functional-differences-from-glibc.html • muslはスレッドに対して極端に少ない スタックを割り当てる • 80KBと書いてあるが現在は128KBに 増量されている • 解決方法はスレッドを作る前に pthread_attr_setstacksize() などでス タックサイズを増やすこと • Ruby・Python含む様々なプロジェクト がmuslのスタックオーバーフローに辛 酸を舐めさせられている • Goではlibsassのような外部ライブラリ を呼び出すときに問題になる
PT_GNU_STACK header this facilitates building software that assumes a large default stack size without any patching to call pthread_setattr_default_np or pthread_attr_setstacksize at each thread creation site, using just LDFLAGS. normally the PT_GNU_STACK header is used only to reflect whether executable stack is desired, but with GNU ld at least, passing -Wl,-z,stack-size=N will set a size on the program header. with this patch, that size will be incorporated into the default stack size (subject to increase-only rule and DEFAULT_STACK_MAX limit). http://git.musl-libc.org/cgit/musl/commit/?id=7b3348a98c139b4 b4238384e52d4b0eb237e4833 • なんと ELF のプログラムヘッダの PT_GNU_STACK セクションのサイズで デフォルトスタックサイズを変更できる 機能が追加されていることがわかった (ELF = Linux などで使われる実行ファ イルの形式のこと) • リンク時のオプションで -Wl,-z,stack-size=N のように設 定することが前提だが… • 実行ファイルしかなくても ELF プログラ ムヘッダにバイナリパッチできればス タックサイズは増やせる!