2012-11-12 22 views
5

現在我有3個共享對象,A.so,B.so,C.so隱式調用時如何使用RTLD_DEEPBIND?

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 

我希望結果是 「來這裏B」,我可以使用dlopenRTLD_DEEPBIND標誌,
但花費太多時間將功能從隱式調用更改爲顯式調用。
有沒有辦法解決這個問題?

gcc -Wl,-Bsymbolic在此解決方案中不起作用。

那麼,如果A.c包含通用的實現。它確實有效。

回答

1

它看起來像動態鏈接器在運行時搜索一個符號時,它選擇它遇到的第一個符號。搜索順序取決於二進制文件的DT_NEEDED部分中的庫的順序,而這個順序又取決於編譯期間命令行中庫的確切順序。 因此,在編譯test.c時,確保libB.so位於命令行上的libC.so之前。

相關問題