Cygwin vs Fiber
そもそもCygwinではFiberが動かないようです。
http://www.cygwin.com/ml/cygwin/2004-12/msg00085.html
MLの投稿にレスも付いてませんし、このコードは今のバージョンでも動きません。
いろいろ試した結果、ファイバ関数の中でCRT関数を呼ばない限り落ちないことが分かりました。
CRT関数の呼び出し箇所をgdbで覗いてみると、スレッド固有領域(TSS/TLS)へのアクセスで落ちています。
このTLSへのアクセスはマクロ_REENTを介して行われています。マクロを展開すると、
_REENT
→ __getreent()
→ (&_my_tls.local_clib)
→ (&(*((_cygtls *) (_tlsbase - CYGTLS_PADSIZE))).local_clib)
→ (&(*((_cygtls *) (_tlsbase - 12700))).local_clib)
となります。また、
extern char *_tlsbase __asm__ ("%fs:4");
で、ここにはスタックのベースアドレスが入っているようです。
ファイバ切り替えのタイミングで_cygtlsをコピーしてやれば動きそうですが、どこまでコピーしてよいのやら。ちなみに、sizeof(_cygtls) == 4212 でした。