LoadLibraryが正常に動作しない場合が存在する

DLLに対して常にLoadLibraryが可能であるとは限りません。遅延読み込みしたDLLについても同様の事が言えます。



具体的には以下のケースで確実に失敗します。

  • TLS(スレッドローカルストレージ)を静的変数で利用している(→確実にアクセス違反)
  • 静的(グローバル)な関数ポインタを利用している(→別途初期化手続きが必要?)

その他の要因も存在しますが、この2つが特に気づかない部分です。基本的にCランタイム初期化ルーチン(VCでいう_DllMainCrtStartup)で処理されている処理を疑えば良いのではないかと私は理解しています。

ちなみにDLL内でTLSが静的に利用されているか否かは「Platform SDK」等に含まれる「dumpbin」等で、「.TLSセクション」の有無を確認するのが確実です。Visual Studio 2005付属のdumpbinでは「/TLS」を使っても確認できるようです。

また、「LoadLibrary」と「FreeLibrary」がプロセスの開始時と終了時にしか呼び出されない事を前提に作成しているDLL(≒unloadをサポートしないDLL)もあります。

(マルチスレッド対応な)第三者のライブラリを使うときには注意してください。



[MSDN] – 規則と制約 (TLS)

[MSDN] – DLL の遅延読み込みの制約

[MSDN] – リンク方式の使い分け



(05/12/19) 一部追記。

(05/12/20) 一部訂正、追加事例、参考リンク追加。

Leave a Reply

Be the First to Comment!

Notify of
avatar
wpDiscuz