Shiro Kawai
shiro****@lava*****
2004年 6月 5日 (土) 08:55:05 JST
From: shelarcy <shela****@capel*****> Subject: [Gauche-devel-jp] undefined reference to `_imp__GC_malloc_atomic' ? Date: Fri, 04 Jun 2004 14:34:59 +0900 > undefined reference to `_imp__GC_malloc_atomic' のエラーの原因って > 何でしょうか? これは外部のDLLのシンボルへの参照がうまくいってない時に見ますね。 GCのコードが __declspec(dllimport) つきでコンパイルされちゃってるのかな。 GCのコードはlibgauche.dll内に一緒に含まれるので、load.c等のコンパイル 時には__declspec(dllimport)無しで参照されている必要があると思います。 私が昔調べたところでは、外部DLLのシンボルの参照は一種の間接参照になります。 例えば、外部DLLの関数fooを呼びたい場合、こんなふうにソースを書きます: extern __declspec(dllimport) void foo(void); void bar(void) { foo(); } すると、これは実質次のようにコンパイルされます。 void _imp__foo(void); void bar(void) { _imp__foo(); } そして、barを含むDLLの作成時にジャンプテーブルが作られます。 _imp__foo: jump ??? fooを含むDLLがロードされた時に、ローダによってこのジャンプテーブルの ジャンプ先???がfooのアドレスに書き換えられるというわけです。 --shiro