1

我在特定机器上执行 C++ 程序时遇到问题。这是整个 strace 输出:

26936 execve("/data1/xfm/bin/xfm", ["/data1/xfm/bin/xfm", "-d", "-s", "/data1/smail/", "-p", "/data1/xfm", "-m", "Mailing.176"], [/* 21 vars */]) = 0
26936 uname({sys="Linux", node="smail2.<removed>.com", ...}) = 0
26936 brk(0)                            = 0x98f7000
26936 --- SIGFPE (Floating point exception) @ 0 (0) ---
26936 +++ killed by SIGFPE +++

我已经在其他几台机器上安装并运行了这个可执行文件,没有任何问题(并且有数千行 strace 输出)。知道什么可能导致我的问题吗?谢谢。

4

2 回答 2

3

我的猜测是问题机器运行的是较旧的 Linux 发行版:据我所知,通常的原因是二进制文件中的符号哈希表与动态链接器不匹配。

动态链接的二进制文件(或相关的库)可能在名为 的部分中具有经典的 ELF 符号哈希表.hash,或在名为 的部分中具有新的 GNU 符号哈希表.gnu.hash,或两者兼而有之。

一些较新的发行版已gcc设置--hash-style=gnu默认将标志传递给链接器 ( ),这导致它仅发出.gnu.hash二进制文件中的一部分。

如果这样的二进制文件在具有不理解的旧动态链接器的旧系统上运行.gnu.hash,它将完全以这种方式失败。失败发生在很早的时候,在动态链接期间(在二进制文件实际上做任何事情之前),这就是为什么你几乎没有从strace.

于 2011-02-22T00:14:23.480 回答
0

只有这些信息很难给出答案。您应该尝试在 gdb 中运行您的程序或插入 sigfpe 信号处理程序以确定错误的确切位置及其原因。

于 2011-02-21T23:53:36.943 回答