1

私は持っている:

  • アプリケーションA
  • 動的ライブラリD
  • 静的ライブラリS

どこ:

  • A は、コンパイル時に静的ライブラリ S とリンクされます。
  • D は S をリンクせずにコンパイルされますが、そのヘッダー ファイルを使用します
  • A はdlopen、実行時に D をロードするために使用します。

コンパイル時に D を S にリンクせずに、A で実行するときに D が S で定義されたシンボルを使用することは可能ですか? つまり、D はグローバル名前空間のシンボルにアクセスできますか?

その他の注意事項: S から関数を呼び出すには、D と A の両方が必要です。理想的には、S を変更したくありません。

これを試してみたところ、次のようになりました(SのシンボルがDで使用されている場合):

dyld: lazy symbol binding failed: Symbol not found: __Z14myFunctioni

これは次のいずれかであると思います。

  1. 既存の関数 'myFunction(int)' は共有ライブラリで使用できません (セキュリティ?)
  2. この関数のシンボル名は、別の方法でマングルされた名前になっています (編集: テストしextern "C"てこれを除外しました)。

おそらく、別の設定でコンパイルする必要がありますか、それとも常にすべての S を D にリンクする必要がありますか? また、S が動的ライブラリそのものになったら、状況は変わりますか?

ありがとうございました

4

1 に答える 1

2

ライブラリ内の外部参照は、そのライブラリの依存関係リスト内のライブラリと、以前に RTLD_GLOBAL フラグで開かれた他のライブラリを使用して解決されます。実行可能ファイルがフラグ「-rdynamic」 (または同義の「--export-dynamic」) でリンクされている場合、実行可能ファイルのグローバル シンボルは、動的にロードされたライブラリの参照を解決するためにも使用されます。

于 2012-07-15T15:05:33.307 に答える