8

dlopen() 内で初期化されたライブラリがメインプログラムが所有する静的変数を初期化する理由を知っている人はいますか? メイン プログラムと共有ライブラリの両方に静的変数のコピーがありますが、何らかの理由で共有ライブラリがメイン プログラムの静的変数のコピーを再初期化して破棄し、メイン プログラムがそれを破棄しようとすると segfault が発生します。

これは、シンボル テーブルでの不適切な名前マングリングの場合ですか?

4

1 に答える 1

7

これは、実行時リンカーがプロセス内のシンボルのアクティブなコピーを 1 つだけ必要とする場合です。共有オブジェクトと実行可能ファイルの両方にシンボルのコピーがある場合、実行時リンカーはそれらのいずれかへのすべての参照を解決します。

この問題を解決するためにできることは、共有オブジェクトをビルドするときに、リンカーのバージョン コマンドを使用してシンボル削減を使用することです。静的変数のシンボルがグローバルでないことを確認してください。そうすれば、探している動作が得られます。

于 2010-04-13T18:04:15.637 に答える