linux 下同名符號衝突問題解決方法

2021-08-27 01:18:40 字數 836 閱讀 1279

最近的工作中遇到如下令人蛋疼的問題:

linux 下有三個模組aa、bb、cc,基本情況如下:

cc 編譯連線得到 cc.so 動態庫,cc 中有如下介面: cc_fun bb 編譯連線得到 bb.a 靜態庫,bb 中有如下介面: bb_fun aa 編譯後通過 -lbb 鏈結選項的方式連線 bb.a 得到 aa 可執行程式,並呼叫 bb.a 的介面函式 bb_fun(): main 工作中發現 aa 在執行時行為異常,總是有記憶體洩露和功能異常,通過定位發現問題集中在同名的 do() 函式上。通過輸出列印發現程式中兩次呼叫 do() 函式都呼叫到了 bb 模組中的 do() 函式,而 cc 模組中的 do() 函式從未被呼叫到,導致程式行為異常和記憶體洩露。

後經多方查證了解到因為 linux 程式中各個庫中的符號表最終都會載入到程式所在的全域性符號表中,此時如果有同名符號就只能呼叫到第乙個載入進來的符號,也就是說後邊載入的同名符號都會被之前的覆蓋。cc 模組中的 do() 函式被 bb 模組中的 do() 函式覆蓋了,所以無法被呼叫到。

廢話不多說。。。

在試驗過很多不滿意的方法之後,最終的解決方法如下:

1.在 cc 的 makefile 中加入 -wl,-bsymbolic -wl,--version-script,version 的連線選項,意思是用 version 檔案中的指令碼指定其匯出哪些函式。

2.version 檔案的實現如下: vers; 意思是指定 cc 模組只匯出介面函式 cc_fun,其餘函式都設為 local 不做匯出。

將該檔案儲存在 makefile 所在目錄即可。

3.重新編譯連線三個模組,問題解決。

o(∩_∩)o哈哈~,蛋,終於不疼了。

linux 下同名符號衝突問題解決方案

linux 下同名符號程式設計客棧衝突問題解決方案 最近的工作中遇到如下令人蛋疼的問題 linux 下有三個模組aa bb ccuihxn,基本情況如下 cc 編譯連線得到 cc.so 動態庫,cc 中有如下介面 cc fun bb 編譯連線得到 bb.a 靜態庫,bb 中有如下介面 bb fun ...

GCC的符號可見性 解決多個庫同名符號衝突問題

問題 最近專案遇到一些問題,場景如下 主程式依賴了兩個庫liba的funca函式和libb的funcb函式。示意的 main.cpp 如下 include int funca int,int int funcb int,int int main liba示意實現 liba.cpp 如下 int su...

解決同名dll衝突的問題

問題描述 軟體同時整合兩種ipc的sdk時,遇到dll同名的情況,因此在呼叫時會出現衝突的情況。解決方法如下 採用動態載入dll庫的方法。include common.h include iostream include tchar.h include windows.h using namespa...