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 に答える