seclan のほえほえルーム

| |

スレッド固有記憶領域を持つ DLLを LoadLibrary すると異常動作する問題

・
2011/08/18 []

Windows では、スレッド毎に固有の記憶領域(TLS)を持たせることができます。C や C++ では、変数に __declspec(thread) 修飾をすることで行えます。この記憶領域を持った Visual C++ / MSC でコンパイルされた DLL を呼び出す場合、DLL がアプリケーションに静的にリンクされていた場合(OS がアプリケーションと同時に読み込む場合)、問題なく動きます。しかし、LoadLibrary を使って読み込んだ DLL の場合、Windows Vista / Windows Server 2008 より前の OS では問題が生じます。

環境DLL読込問題
Win32s不可
Win95不可
Windows 98 / NT変数の値が不定
Windows 2000 / Server 2003 / XP変数の参照で例外発生
Windows Vista / Server 2008 / 7なし
bcc32なし(独自回避)

これは、OS がアプリケーション起動時に、DLL の分も含めてまとめて TLS 領域を確保することから起こる問題です。後からロードされるとその領域を拡張できないので、対応できないということのようです。そのため、ロードする場合には、DLL 側で手動で TlsAlloc などを使う必要があります。bcc32 の場合は回避ルーチンが入っているので、何も考えることなく使用できます。



by seclan

関連


| |

 

配信

6.09 msec