使用太多静态链接的CRT解决fls限制?

Moo*_*ook 5 windows multithreading msvcrt

当通过LoadLibrary加载外部DLL(不在我们的控制之下)时,我们遇到的问题是这些DLL中的静态链接CRT无法分配光纤本地存储.这类似于mskb 193462,除了这是FLS并且只有128个.

有没有有用的方法来解决这个问题?CRT正在使用GetProcAddress来查找FlsAlloc(因为这显然从未在XP中存在过),所以它甚至真的需要它吗?

(这是在Vista上,其中FlsAlloc实际存在; DLL似乎使用MSVC8)

Chr*_*cke 3

坦率地说,除了加载更少的 dll 之外,没有任何解决方案。

您可以挂钩 dll 的导入地址表 - 但这发生得太晚了,因为您只能在 LoadLibrary 返回时安装 IAT 挂钩,并且 CRT 初始化代码可能会执行以响应已经处理过的 DllProcessAttach。

我猜你可以在内存中找到 kernel32.dll 模块,并修补 GetProcAddress 或 FlsAlloc 的导出地址以指向你的实现。但这种方法已经变得非常黑客化了。