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