【问题标题】:On linux, what can cause dlopen to emit SIGFPE?在 linux 上,什么会导致 dlopen 发出 SIGFPE?
【发布时间】:2011-02-11 11:15:07
【问题描述】:

我有一个来源可疑的库,由 file 标识为 32 位可执行文件。但是,当我在 32 位 CentOS 4.4 机器上尝试 dlopen 时,dlopen 以 SIGFPE 终止。当然,如果二进制文件的格式有问题,那么dlopen 应该处理错误?

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

【问题讨论】:

    标签: linux dlopen sigfpe


    【解决方案1】:

    一些可能的原因是:

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

    Here 是关于在 GNU 系统中以 ELF 格式生成哈希的有趣讨论,其中 ABI 不匹配可能导致系统上出现 SIGFPE,当您混合和匹配不是在该发行版/系统上构建的 DSO 时。

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

    ]$ gdb ./my_executable
    (gdb) run
    

    当程序崩溃时,获取回溯

    (gdb) bt
    

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

    获取一个可靠的库/可执行文件! ;)

    祝你好运

    【讨论】:

    • 很好的链接,谢谢。我的问题是该库已在 64 位 RHEL5 机器上交叉编译,而我试图在 32 位 RHEL4 机器上运行。魔术技巧是在 RHEL 5 机器上重建库时使用“-m32 -Wl,--hash-style=both”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    相关资源
    最近更新 更多