动态加载libz3.dll

时间:2014-11-11 19:20:15

标签: z3

静态链接到libz3.dll的dll的动态加载失败,失败的LoadLibrary返回后的GetlastError"无效访问内存位置"错误。是否可以动态加载libz3.dll?

2 个答案:

答案 0 :(得分:1)

调试显示此行上的void * memory :: allocate(size_t s)中的libz3.dll初始化失败:   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的指针。

我在Windows 2003 Server上运行我的exe。非官方TLS实现描述说在Windows Vista之前隐式TLS(使用declspec(thread))不起作用 当在进程初始化时(静态导入解析期间)没有加载使用它的模块时。

这意味着分布式libz3.dll无法在早于Vista的Windows上动态加载。

重新编译dll而不使用每个线程存储(我将#if defined(_WINDOWS)|| defined(_USE_THREAD_LOCAL)更改为#if 0)解决了这个问题。我如何理解,而不是使用per 线程存储是操作系统的正常行为,而不是Windows。在Windows上使用此解决方案是否可以?

答案 1 :(得分:0)

我不确定“静态链接到libz3.dll”是什么意思,但一般来说,是的,可以动态加载libz3.dll(我们的API也可以这样做)。一个经常遇到的问题是,当发生32/64位冲突时,系统没有提供良好的错误消息,例如,Python 32位将拒绝加载64位DLL,反之亦然,两者都提供错误消息基本上说“没有libz3.dll”。

在这种特殊情况下,关于无效访问内存的投诉可能表明“静态链接”部分存在问题。