繁体   English   中英

strace:发生任何事情之前SIGFPE

[英]strace: SIGFPE before anything happens

我在特定计算机上执行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输出)。 任何想法可能导致我的问题吗? 谢谢。

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

动态链接的二进制文件(或相应的库)在.hash节中可能具有经典的ELF符号哈希表,在.gnu.hash节中可能具有新的GNU符号哈希表,或两者都有。

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

如果这样的二进制文件在具有旧的动态链接器的旧系统上运行,而该旧的动态链接器不了解.gnu.hash ,则它将完全以这种方式失败。 故障发生在动态链接的非常早的时候(在二进制文件实际上不执行任何操作之前),这就是为什么strace实际上没有输出的原因。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM