■
http://d.hatena.ne.jp/higepon/20051204/1133693332
あー、すいません。酔った勢いとかでかなり適当なこと話してたような気がします。
で、Monaで例外をちょろっとだけ調べてみたのですが、GCCのターゲットマクロとかを書いてクロスコンパイラ作らないといけないような感じでした。以下、参考までに。
まず、fno-rtti fno-exception外して、throwする関数をビルドすると、
hello.o(.text+0xe):hello.cpp: undefined reference to `__cxa_allocate_exception' hello.o(.text+0x1b):hello.cpp: undefined reference to `typeinfo for int' hello.o(.text+0x2b):hello.cpp: undefined reference to `__cxa_throw'
こうなるかと。で、これは、stdc++に入ってるので -lstdc++ 付けると、
... ... undefined reference to `_Unwind_SjLj_Unregister' ... undefined reference to `_Unwind_SjLj_Resume' ... In function `_cxa_call_unexpected': ... undefined reference to `_Unwind_SjLj_Register' ... undefined reference to `_Unwind_SjLj_Resume'
こんな感じになるかと思います。こいつらがunwindを行うライブラリ関数で libgcc.a に入ってます。で、-lgccを付けると
... undefined reference to `_imp__WaitForSingleObject@8' ... undefined reference to `InterlockedDecrement@4' ... In function `_gthr_win32_mutex_unlock': ... undefined reference to `InterlockedDecrement@4' ... undefined reference to `_imp__ReleaseSemaphore@12'
こんな感じになります。こいつらは、gthreadと呼ばれるもので、色んな環境のスレッドのラッパみたいなものです。unwindで使ってます。
んで、現状のように、cygwinなりmingwなりのgccを使うようにしてると、ここで、gthreadがwin32用になってしまうので、どうしようもなくなります。
Monaのスレッドは全然わからないので、なんとも言えないですが、多分ここで、Monaのスレッドに対応したgthreadを書いて、それを使うクロスコンパイラを作る、といったような感じになるのではないか、と思います。(一応、ビルド時に--enable-thread=noでスレッドを使わないようにもできるかもしれないです。が、この場合、例外がスレッドセーフでなくなります)
で、そうなると、config.gccなんかをいじって、ターゲット"i386-pc-monaos"対応とかして、config/i386/t-monaとか書いて…と、いったような感じになってしまうわけで、あの時は、適当に「すぐできそうじゃないか」みたいな話の流れにしてしまいましたが、あんまり簡単ではなさそうです…