RTLD_DEFAULT

Gaucheの拡張パッケージであるc-wrapperをWindowsで使えるようにと四苦八苦している。
しかし、ようやく原因らしきものがが捕めた。現状ではdlsymを単純にGetProcAddressで代用していたのだが、ここに誤りがあるようだ。

void* dlsym(void* handle, const char* name) {
 return GetProcAddress((HMODULE)handle, name);
}

モジュールのハンドルと、そのモジュール内にあることが期待されるシンボル名からアドレスを返すという挙動は全く同じなのだが、dlsymは通常のハンドルとは別にRTLD_DEFAULTという擬似ハンドルを受け取ることが出来る。dlsymはRTLD_DEFAULTが渡された場合にはロード済みのモジュールからシンボルを捜す。
この挙動をWindowsで再現しようとするなら、ロードされているモジュール全てに対してGetProcAddressを試みてみるしかないかと思う。Windowsでロード済みのモジュールを得るのは面倒なのでdlopenが呼ばれたときの結果を記録しておく方針で書こうと考えている。
Document ID: 52389dc6c36412f392e45814c3c95945