2010-04-23 19 views
3

我有一个可疑来源库,它被file识别为32位可执行文件。但是,当我尝试在32位CentOS 4.4机器上尝试dlopen时,dlopen终止于SIGFPE。当然,如果二进制格式有问题,那么dlopen应该处理错误?在linux上,什么会导致dlopen发出SIGFPE?

所以问题是:什么样的问题可以导致dlopen发出SIGFPE?

回答

5

一些可能的原因是:

  1. 被零除(排除这种使用gdb)
  2. 架构不匹配
  3. (你自己编译的DSO在相同的架构,或者是预构建?)
  4. ABI兼容性问题(为另一个Linux发行版加载DSO)。

Here是关于哈希生成在GNU系统中的ELF格式,其中一个ABI不匹配可以在系统中引起SIGFPE当你混搭DSO的不是那号发行/系统上的一个有趣的讨论。

运行GDB对您的可执行文件:

]$ gdb ./my_executable 
(gdb) run 

当程序崩溃时,得到一个回溯与

(gdb) bt 

如果堆栈中do_lookup_x()结束,那么你很可能有同样的问题,并应确保你的DSO对于你试图加载它的系统是正确的...但是你确实说它有可疑来源所以这个问题可能是一个类似于描述的ABI问题。

获取非可疑的库/可执行文件! ;)

好运

+1

莫大的联系,谢谢。 我的问题是库已经在64位RHEL5机器上交叉编译,我试图在32位RHEL4机器上运行。魔术技巧是在RHEL 5机器上重建库时使用“-m32 -Wl, - hash-style = both”。 – kdt 2010-04-23 12:34:35

+0

@kdt - 很高兴听到您解决它! – 2010-04-23 14:57:52

相关问题