1

4つの共有ライブラリを持つ実行可能ファイルがあり、依存関係ツリーは次のようになります。実行可能アプリはとのdlopenを実行foo.sobar.soます。foo.so次に、へのリンクfooHelper.soとへのbar.soリンクbarHelper.so

さて、問題はそれfooHelper.soでありbarHelper.so、同じシンボルのいくつかを持っています。funcたとえば、とにさまざまな実装があるとしfooHelper.soましょうbarHelper.so。の実装を強制的foo.soに使用し、を使用する方法はありますか?現在起こっていることは、ヘルパーのリンクの順序に応じて、の実装の1つだけがとの両方で使用されるということです。これは、デフォルトのUnixリンケージモデルが原因です。シンボルの定義がすでにロードされている場合、後でロードされる共有ライブラリからの他の定義はすべて破棄されます。基本的に、fooHelper.sobar.sobarHelper.sofuncfoo.sobar.sofunc最初にリンクされたヘルパーライブラリから取得されます。共有ライブラリのソースコードを変更せずに、適切なマッピングを明示的に指定する方法が必要です。

私はg++4.4でLinuxに取り組んでいます。

4

2 に答える 2

3

foo.soにfooHelper.soの実装を使用させ、bar.soにbarHelper.soの実装を使用させる方法はありますか?

はい:それRTLD_LOCALが目的です(dlopeningfoo.sobar.so)。

RTLD_LOCAL
  This is the converse of RTLD_GLOBAL, and the default if neither flag
  is specified. Symbols defined in this library are not made available
  to resolve references in subsequently loaded libraries.
于 2012-12-21T06:04:50.103 に答える
0

両方の関数がたまたま同じ名前空間にある場合、Cでプログラミングしている場合は、少し問題があります。探す用語は「関数のオーバーロード」です。このトピックに関する以前の議論がありました、例えばこれ: Cでの関数のオーバーロード

編集:http://litdream.blogspot.de/2007/03/dynamic-loading-using-dlopen-api-in-c.html

于 2012-12-05T07:27:51.133 に答える