[Gauche-devel-jp] Re: undefined reference to `_imp__GC_malloc_atomic' ?

Back to archive index

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



Gauche-devel-jp メーリングリストの案内
Back to archive index