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

标签 windows multithreading msvcrt

当通过 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/

相关文章:

linux - Zlib 解压缩脚本适用于 linux 但不适用于 windows : error -5 while decompressing data: incomplete or truncated stream

windows - 使用 QSettings 在 Windows 上读取注册表值

c++ - 更快地处理 SendARP 函数

vb.net - 在多个线程中运行不同的进程而不会在VB.NET 2中重叠

visual-c++ - _control87() 是否也设置了 SSE MXCSR 控制寄存器?

c++ - 在一个非常简单的程序中检测到内存泄漏。该怎么办?

windows - 有没有一种方法可以使用rust为Windows设置环境变量

java - 当 AsyncTask 也使用另一个线程时如何设置延迟时间?

java - Java 中有趣的线程行为

linker - 如何在 VS2005 中构建使用 MDd dll 的 MTd 项目