5

この質問がこのフォーラムで以前に繰り返された場合は申し訳ありません。Macでdylibのロードとアンロードが期待どおりに機能しないという問題があります(特にアンロード部分)。問題は、実行可能ファイルがあり、A.dylib という共有ライブラリをロードし、ロードされた共有ライブラリを使用して B.dylib というライブラリをロードするかどうかです。後の段階でライブラリ B.dylib をアンロードしようとすると、エラー コードが返されません (返される int 値は 0 です。通常の dlopen 関数と dlclose 関数を使用してライブラリをロードおよびアンロードしているため、0 は正常にアンロードされたことを意味します)。 、しかし、アクティビティモニターまたはlsofを使用して確認すると、b.dylibがまだメモリ内にあります。

現在、このコードを Windows、Linux、および Mac に移植しています。Windows と Linux は期待どおりに動作しますが、Mac だけで問題が発生します。

Mac 開発者ライブラリを読んでいて、次のことがわかりました: "動的ライブラリがアンロードされないケースがいくつかあります: 1) 主な実行可能ファイルがそれに対してリンクしている、2) アンロードをサポートしない API (例: NSAddImage()) を使用して、それまたはそれに依存する他の動的ライブラリをロードしました。3) 動的ライブラリは dyld の共有キャッシュにあります。」

私の場合、最初の 2 つのケースのいずれにも当てはまりません。私はケース3を疑っています。
これが私の質問です: 1. ケース 3 であることを確認するにはどうすればよいですか? 2. はいの場合、どのように修正しますか? 3. そうでない場合、どうすれば修正できますか? 4. Mac はなぜそんなに違うのですか?

この点で何か助けていただければ幸いです!

ありがとう、ヤン

4

1 に答える 1

4

共有ライブラリを実行可能ファイルにロードすると、そのライブラリによってエクスポートされたすべてのシンボルが、実行可能ファイルに必要なシンボルを解決する候補になるため、DYLD リンカーが意図しないシンボルにバインドすると、ライブラリがロードされたままになります。nm を使用して共有ライブラリ内のシンボルを一覧表示したり、動的リンカーのデバッグ出力を有効にするように環境変数を設定したりできます ( dyld のこのマニュアル ページを参照)。DYLD_PRINT_BINDINGS 環境変数を設定する必要があります。

ほとんどの場合、エクスポートされるシンボルを、実行可能ファイルで使用される特定のサブセットに限定して、使用するシンボルのみがバインドされるようにする必要があります。これは、必要なシンボルをファイルに配置し、-exported_symbols_list オプションを介してリンカーに渡すことで実行できます。そうしないと、dyload されたライブラリにシンボルをバインドすることになり、実行可能ファイルのシンボルを解決するために必要であり、dlclose() が呼び出されたときにアンロードされないため、アンロードされません。

于 2012-11-15T18:22:54.290 に答える