strace:SIGFPE在发生任何事情之前

时间:2011-02-21 23:43:33

标签: c++ linux strace

我在特定计算机上执行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输出)。知道什么可能导致我的问题吗?感谢。

2 个答案:

答案 0 :(得分:3)

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

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

最近的一些发行版gcc设置为默认情况下将标志传递给链接器(--hash-style=gnu),这会导致它仅在二进制文件中发出.gnu.hash部分。 / p>

如果这样的二进制文件在旧系统上运行,并且旧的动态链接器不理解.gnu.hash,那么它将以这种方式失败。在动态链接期间(在二进制文件本身执行任何操作之前),很早就发生了故障,这就是为什么你几乎没有strace的输出。

答案 1 :(得分:0)

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