linux 呼叫不同動態庫,匯入符號衝突問題

2021-10-20 21:28:56 字數 695 閱讀 1937

假設存在兩個庫 liba.so, libb.so, 內部有相同的函式名 testfunc, 但是各自實現不一樣。

例如:在liba.so中, 函式 testfunc 列印 「this is liba.so testfunc 」

在libb.so中, 函式 testfunc 列印 「this is libb.so testfunc」 

其中函式testfunc 都在可執行程式 program中使用到,通過dlopen()函式的方式連線。

然後在實際執行program過程中發現:

(1)呼叫dlopen() 通過匯出符號依次獲得liba.so 和 libb.so 中函式testfunc 符號。

(2)在program主程式中呼叫a->testfunc,列印 「this is liba.so testfunc 」。

(3)在program主程式中呼叫b->testfunc,無任何列印。

也就是說, 根據載入動態庫的順序,不同函式庫相同的函式符號,先載入的符號位址可用,後載入的符號位址錯誤,無法定位。

在建立動態鏈結庫時,gcc/g++選項中新增編譯選項

-wl,-bsymbolic.

其中wl表示將緊跟其後的引數,傳遞給聯結器ld。bsymbolic表示強制採用本地的全域性變數定義,這樣就不會出現動態鏈結庫的全域性變數定義被應用程式/動態鏈結庫中的同名定義給覆蓋了

由「反射」,聯想到的動態呼叫不同模組的函式

usr bin env python coding utf8 from lib import account url input 請模擬輸入 url 頁面 if url.endswith login r account.login print r elif url.endswith logout r...

Linux 動態庫的顯示呼叫

分類 動態庫與靜態庫 2012 03 17 23 56 1710人閱讀收藏 舉報 linux null library 測試web服務 apache 10.動態庫的顯式呼叫 庫函式dlopen 將開啟乙個新庫,並把它裝入記憶體。該函式主要用來載入庫中的符號,這些符號在編譯的時候是不知道的。比如apa...

linux動態庫多層級呼叫

這是乙個小知識點,今天拿出來說說。我們有乙個應用test,它呼叫了乙個動態庫so1.so,而這個so1.so又呼叫了so2.so。so1.so的編譯命令列gcc o so2.so lso1 lrt lstdc test的編譯命令列gcc o test lso1 lrt lstdc 會報錯,說是在so...