1

このStackoverflowエントリで説明されている状況を回避しようとしています: 顧客のボックスで生成されたコアファイルのデバッグ。すべてのライブラリを静的にコンパイルする場合、コアダンプ時に共有ライブラリを常に収集する必要はありませんか?基本的に、gdbを使用してコアファイルをロードし、クラッシュしたアプリケーションを調べることができる状況になりたいと思っています。

必要なすべてのライブラリを静的にリンクするルートをたどる場合は、何に注意する必要がありますか。glibとpthreadが最大の問題を引き起こす可能性があると思います。

Valgrindは役に立たなくなりますか?すべてが静的にコンパイルされているバイナリに対してValgrindをロードすると、エラーが見つかりますか?または、静的にコンパイルされていないバイナリを維持して、Valgrindが引き続き機能するようにします。straceはどうですか?

インストールベースが大きく、レガシーアプリケーションでもあるため、クラッシュすることがよくあります。すべての共有ライブラリを収集することは困難になりつつあります-私は別の解決策が必要です。

編集:タイプミスを修正しました。

4

1 に答える 1

2

すべてのライブラリを静的にコンパイルすると、コアダンプ時に共有ライブラリを常に収集する必要がなくなります。

はい。

ただし、一般的な考えに反して、静的にリンクされたバイナリは、動的にリンクされたバイナリよりも移植性が低くなります(少なくともLinuxでは)。

特に、次の関数のいずれかを使用する場合:、、、、、 (およびそれ以上) gethostbyname、リンク時に次のような警告が表示されます。gethostbyaddrgetpwentgetpwnamgetpwuid

Using 'getpwuid' in statically linked applications requires at runtime
the shared libraries from the glibc version used for linking.

この警告の意味するところは、リンク時に使用したバージョンとは異なるバージョンのglibcが顧客にインストールされている場合(つまりシステムlibcとは異なる場合)、プログラムがクラッシュする可能性があるということですそれはあなたの現在の状況よりも明らかに悪い状況なので、静的リンクがあなたにとって良い解決策であるとは思いません。

于 2012-07-25T16:32:59.367 に答える