动态加载静态链接到libz3.dll的dll失败,LoadLibrary失败后的GetlastError返回"Invalid access to memory location“错误。可以动态加载libz3.dll吗?
发布于 2014-11-14 01:32:54
调试显示libz3.dll初始化失败无效* memory::allocate(size_t s)在以下行: g_memory_thread_alloc_size += s;
asm中的同一行:
mov eax,dword ptr __tls_index (0A79058h)
mov ecx,dword ptr fs:2Ch
mov eax,dword ptr ecx+eax*4
g_memory_thread_alloc_size的值从名为__tls_index的位置加载到eax寄存器中。程序中只有一个线程,__tls_index处的值为零。Fs指向TEB,fs:2Ch指向TEB.ThreadLocalStorage。下一次读取得到ecx = 0。所以问题出在指向TLS的未初始化指针上。
我在Windows2003Server上运行我的exe。非官方的TLS实现描述称,在Windows Vista之前,当使用隐式TLS的模块在进程初始化时(在静态导入解析期间)未被加载时,隐式TLS(使用declspec(线程))不会运行。
这意味着分布式libz3.dll不能在早于Vista的Windows上动态加载。
在不使用每线程存储的情况下重新编译dll (我将#if defined(_WINDOWS) || defined(_USE_THREAD_LOCAL)更改为#if 0)解决了这个问题。据我所知,不使用每线程存储是OSes的正常行为,而不是Windows。是否可以在Windows上使用此解决方案?
发布于 2014-11-13 01:02:59
我不确定“静态链接到libz3.dll”是什么意思,但一般来说,是的,可以动态加载libz3.dll (我们的API也是这样做的)。一个经常遇到的问题是,当发生32/64位冲突时,系统没有提供良好的错误消息,例如,Python 32位将拒绝加载64位DLL,反之亦然,两者都提供了本质上是“没有libz3.dll”的错误消息。
在这种情况下,关于对内存的无效访问的投诉可能表明“静态链接”部分存在问题。
https://stackoverflow.com/questions/26872805
复制相似问题