在linux上,什么可能导致dlopen发出SIGFPE?

kdt*_*kdt 3 linux dlopen sigfpe

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

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

Aid*_*ell 5

一些可能的原因是:

  1. 除以零(用gdb统计这个)
  2. 架构不匹配(您是否在同一架构上自行编译DSO?还是预先构建?)
  3. ABI兼容性问题(在一个不同的Linux发行版上加载为一个Linux发行版构建的DSO).

以下是关于GNU系统中ELF格式的哈希生成的有趣讨论,当混合和匹配非基于该发行版/系统的DSO时,ABI不匹配可能导致系统上的SIGFPE.

使用以下命令对可执行文件运行GDB

]$ gdb ./my_executable
(gdb) run
Run Code Online (Sandbox Code Playgroud)

当程序崩溃时,获取回溯

(gdb) bt
Run Code Online (Sandbox Code Playgroud)

如果堆栈结束do_lookup_x ()然后您可能会遇到相同的问题,并且应该确保您的DSO对于您尝试加载它的系统是正确的...但是您确实说它有可疑的起源因此问题可能是类似于ABI的问题描述的那个.

得到一个不可疑的库/可执行文件!;)

祝好运