2017-02-18 5 views
0

私は2つの動的ライブラリa.soとb.so.を持っています。両方のライブラリには、各ライブラリに異なるコードを持つ関数f()が含まれています。この関数は、別の関数ga()およびgb()から各ライブラリで呼び出されます。重複シンボル動的ロード

また、dlopen()を使用してこれら2つのライブラリを動的にロードする実行可能プログラムもあります。このプログラムは、ある時点でga()とgb()を呼び出します。それぞれの場合にどのような関数f()が実行されますか?

これはすべてCコードなので、f()はa.soとb.soの両方で同じシンボルである必要があります。

答えて

0

それぞれの場合にどのような関数f()が実行されますか?

は、に依存します。

その後、fコンパイルまたはa.sob.soを結ぶ、とf()(すなわちないstatic機能)グローバルあるときは、通常のUNIXライクなシステムであり、あなたは特別なフラグを使用しなかった場合どちらの共有ライブラリからでも最初にdlopenが呼び出され、dlopenRTLD_GLOBALフラグが使用されたとします。

この答えは、あなたがリンク時にコンパイル時、または-Bsymbolic-fvisibility=hiddenを使用するときに変化する、または2つのインスタンスに異なるシンボルバージョンを割り当てることfの可視性やリンカのバージョンのスクリプトを制限するために、リンカスクリプトを使用するか、またはRTLD_LOCALとまたは...(私は行動を変えるためにもっと多くの方法が欠けていると確信しています)。

+0

コンパイルに特別なフラグは使用されませんでした。しかし、少し質問を簡略化しました。実際には、重複しているのは私にとってはあいまいなAdaコードなので、これは面倒です。 – juanrgar

関連する問題