5

今、私は3つの共有オブジェクト、A.so、B.so、C.soを持っています

    A.c    
    void libA()  
    {  
        common();  
    }  

    B.c
    void common()  
    {  
        printf("COME HERE B\n");  
    }  

    C.c
    void common()  
    {     
        printf("COME HERE C\n");  
    }  
    (just ingore the .h files)

    test.c
    int main()  
    {  
      libA();    
      return 1;  
    }  

complie:  
gcc -fPIC -shared libB.so libB.c  
gcc -fPIC -shared libA.so libA.c ./libB.so  
gcc -o test test.c libC.so libA.so  

結果が「COME HERE B」になりdlopenRTLD_DEEPBINDフラグを使用できることを望み
ますが、プロジェクトで関数を暗黙的な呼び出しから明示的な呼び出しに変更するには時間がかかりすぎます。
とにかくこの問題を解決する方法はありますか?

gcc -Wl,-Bsymbolicこのソリューションでは機能しません。

まあ、Ac に共通の実装が含まれているとします。それは機能します。

4

1 に答える 1

1

ダイナミック リンカーが実行時にシンボルを検索するときに、最初に見つかったシンボルを選択するように見えます。検索順序はDT_NEEDED、バイナリのセクション内のライブラリの順序に依存し、コンパイル中のコマンド ライン内のライブラリの正確な順序に依存します。そのため、コンパイル時にコマンドラインのlibB.so前にあることを確認してください。libC.sotest.c

于 2015-01-11T22:38:29.170 に答える