3

file私は、32ビット実行可能ファイルとして識別される疑わしい起源のライブラリを持っています。ただし、dlopen32 ビットの CentOS 4.4 マシンで試してみると、dlopen は で終了しSIGFPEます。確かに、バイナリのフォーマットに何か問題があった場合dlopen、エラーを処理する必要がありますか?

問題は次のとおりです。dlopen が SIGFPE を発行する原因となる問題は何ですか?

4

1 に答える 1

5

考えられる理由は次のとおりです。

  1. ゼロによる除算 (gdb で除外)
  2. アーキテクチャーの不一致 (同じアーキテクチャーで DSO を自分でコンパイルしましたか? または事前にビルドされていますか?)
  3. ABI の互換性の問題 (ある Linux ディストリビューション用にビルドされた DSO を別の Linux ディストリビューションにロードする)。

GNU システムでの ELF 形式でのハッシュ生成に関する興味深い議論があります。ABIの不一致により、そのディストリビューション/システムで構築されていない DSO を組み合わせて一致させると、システムで SIGFPE が発生する可能性があります。

次を使用して、実行可能ファイルに対して GDB を実行します。

]$ gdb ./my_executable
(gdb) run

プログラムがクラッシュしたら、バックトレースを取得します

(gdb) bt

スタックが終了する場合do_lookup_x ()は、同じ問題が発生している可能性が高く、ロードしようとしているシステムに対して DSO が正しいことを確認する必要があります...ただし、疑わしい起源があるため、問題はおそらく次のような ABI の問題です説明したもの。

疑いのないライブラリ/実行可能ファイルを入手してください! ;)

幸運を

于 2010-04-23T10:43:18.867 に答える