なんかいろいろ調べてたら解決したっぽい。
明らかに Cygwin でしか発生しないことから、#if defined(__CYGWIN__)
まわりのコードを雑に grep して追っていたら、Cygwin の時だけ初期化されてなさそうなコードを見つけて、試しに取り除いたら、あっさり解消してしまった。
挙動としては GC が発生すると、そのあとに明らかにおかしいアドレスへのアクセスで SIGSEGV を吐くため、辻褄があってなくもないかなというくらいの気持ちではあったが、とはいえ正直「何故かセグらなくなります」とだけ書いた PR を出しても、理由を説明できないから絶対 merge されないよなと思って、追加でいろいろ調べてた。
こういう時はだいたい blame で歴史を遡っていくけど、運良くきちんと Cygwin 向けの分岐が生まれた理由が見つかった。
この commit がされた 2010 年の時点で Cygwin の Signal Stack まわりの挙動が中途半端な (& SIGSEGV が発生する) ため、Cygwin の場合だけ native_thread_init_stack
を call しないようにしたとのことであった。
一方で今は SIGSEGV が起きなくなっているから、SIgnal Stack はきちんと動いているのでは?ということで Cygwin 側の実装を追っていたら、2015 年に実装したよという commit があった。
以上より他のプラットフォームと同じ処理をさせても問題なさそうということで PR を作成したという流れ。