msys2 gcc でスタックのサイズを増やしたい
某研究課題のために,ログも含めて結構な量のメモリ確保が必要なプログラムを書いた.Linux 上で gcc でビルドして動作させていた時には何の問題もなかったのだが,諸事情で msys か cygwin の上で同じことをやらないといけなくなり,コンパイルしたところ,コンパイルは何事もなくできるのだが,実行時に
segmentation fault (core dumped)
なる宣告が (T_T).配列かポインタか,いずれにしてもそこ周りの不具合であることはすぐに察するが,確認のため
としてデバッグシンボルを追加したバイナリを作り,gdb hoge として run すると
chkstk_ms() をした時点で SIGSEGV を受信してお亡くなりになったことが判明.
この関数,memory allocation 関係のところで呼ばれるのだそうで,関数の名称からして stack に関するチェックをしていることは見え見え。
msys にしても gnupack / cygwin にしても結局は bash 環境.bash から起動されるプロセスが使える stack のサイズ = bash に割り当てられた stack size ということで,
ulimit -s
でサイズチェックできる.早速試したら,2032 (byte) と出てきて「ンなもん足りる訳ねえじゃん」と思い,
ulimit -s 10485760
なんてバカでかい数字を設定してみようとすると,エラー無く実行でき,その後に ulimit -s するとちゃんと前回実行時の設定数値が返ってくるので「楽勝!」と思って先のプログラムを実行すると,segmentation fault AGAIN!
いくつかの方の HP で見たのだが,環境によっては ulimit -s 数値 は機能しないのだとか。そこで,コンパイラの方で
gcc -Wl,--stack,10485760 hoge.c -o hoge ...
として ld (linker) に渡す --stack オプションをコンパイル時に指定したら...,無事動きました!今回の新知識は gcc の -Wl, オプション.この後に,ld のためのオプションを上記のように指定できる.
Trouble shooting 開始から完了まで,全く外れたことをやりながらも 90 分くらいで何とかできました。