当通过 LoadLibrary 加载外部 DLL(不受我们控制)时,我们遇到了一个问题,即这些 DLL 中的静态链接 CRT 无法分配光纤本地存储。这类似于 mskb 193462 ,除了这是 FLS,而且只有 128 个。
有什么有用的方法可以解决这个问题吗? CRT 无论如何都在使用 GetProcAddress 来查找 FlsAlloc(因为它在 XP 中显然不存在),所以它真的需要它吗?
(这是在 Vista 上,FlsAlloc 实际存在;DLL 似乎正在使用 MSVC8)
最佳答案
坦率地说,除了加载更少的 dll 之外,这里没有解决方案。
您可以 Hook dll 的导入地址表 - 但那会发生得太晚,因为您只能在 LoadLibrary 返回时安装 IAT Hook ,并且 CRT 初始化代码可能会响应 DllProcessAttach 而执行,而 DllProcessAttach 已经被处理过。
我猜你可以在内存中找到 kernel32.dll 模块,并修补 GetProcAddress 或 FlsAlloc 的导出地址以指向你的实现。但这种方法变得非常骇人听闻。
关于windows - 使用太多静态链接的 CRT 解决 fls 限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1437422/