msys2 gcc でスタックのサイズを増やしたい

某研究課題のために,ログも含めて結構な量のメモリ確保が必要なプログラムを書いた.Linux 上で gcc でビルドして動作させていた時には何の問題もなかったのだが,諸事情で msys か cygwin の上で同じことをやらないといけなくなり,コンパイルしたところ,コンパイルは何事もなくできるのだが,実行時に

segmentation fault (core dumped)

なる宣告が (T_T).配列かポインタか,いずれにしてもそこ周りの不具合であることはすぐに察するが,確認のため

gcc -g hoge.c -o hoge ...

としてデバッグシンボルを追加したバイナリを作り,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 分くらいで何とかできました。