首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态加载libz3.dll

动态加载libz3.dll
EN

Stack Overflow用户
提问于 2014-11-12 03:20:15
回答 2查看 515关注 0票数 1

动态加载静态链接到libz3.dll的dll失败,LoadLibrary失败后的GetlastError返回"Invalid access to memory location“错误。可以动态加载libz3.dll吗?

EN

回答 2

Stack Overflow用户

发布于 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上使用此解决方案?

票数 1
EN

Stack Overflow用户

发布于 2014-11-13 01:02:59

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26872805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档