主頁(yè) > 知識(shí)庫(kù) > linux 下同名符號(hào)沖突問(wèn)題解決方案

linux 下同名符號(hào)沖突問(wèn)題解決方案

熱門(mén)標(biāo)簽:怎么用百度地圖標(biāo)注坐標(biāo) 上海機(jī)器人外呼系統(tǒng)哪家好 江西全自動(dòng)外呼系統(tǒng)報(bào)價(jià) 400的電話(huà)一般從哪里辦理 春運(yùn)地圖標(biāo)注app 益陽(yáng)400電話(huà)申請(qǐng)辦理流程 昆明電銷(xiāo)機(jī)器人價(jià)格 地圖標(biāo)注人員分布 梧州防封電銷(xiāo)卡

linux 下同名符號(hào)沖突問(wèn)題解決方案

最近的工作中遇到如下令人蛋疼的問(wèn)題:

Linux 下有三個(gè)模塊aa、bb、cc,基本情況如下:

cc 編譯連接得到 cc.so 動(dòng)態(tài)庫(kù),cc 中有如下接口:

cc_fun 
{ 
…… 
do();//調(diào)用名為do的cc模塊內(nèi)部函數(shù) 
…… 
} 
 

bb 編譯連接得到 bb.a 靜態(tài)庫(kù),bb 中有如下接口:

bb_fun 
{ 
…… 
handle = dlopen(cc.so, RTLD_LAZY);//加載cc.so 
pccfun = dlsym(handle, “cc_fun”);//獲取cc_fun函數(shù)指針 
(*pccfun)();//調(diào)用cc_fun函數(shù),此時(shí)應(yīng)該會(huì)調(diào)用cc模塊中的do()函數(shù) 
do();//調(diào)用名為do的bb模塊內(nèi)部函數(shù)(與cc模塊中的do()函數(shù)同名,實(shí)現(xiàn)卻不相同) 
…… 
} 

aa 編譯后通過(guò) -lbb 鏈接選項(xiàng)的方式連接 bb.a 得到 aa 可執(zhí)行程序,并調(diào)用 bb.a 的接口函數(shù) bb_fun():

main 
{ 
…… 
bb_fun();//調(diào)用bb_fun函數(shù) 
…… 
} 
 

工作中發(fā)現(xiàn) aa 在運(yùn)行時(shí)行為異常,總是有內(nèi)存泄露和功能異常,通過(guò)定位發(fā)現(xiàn)問(wèn)題集中在同名的 do() 函數(shù)上。通過(guò)輸出打印發(fā)現(xiàn)程序中兩次調(diào)用 do() 函數(shù)都調(diào)用到了 bb 模塊中的 do() 函數(shù),而 cc 模塊中的 do() 函數(shù)從未被調(diào)用到,導(dǎo)致程序行為異常和內(nèi)存泄露。

后經(jīng)多方查證了解到因?yàn)?linux 程序中各個(gè)庫(kù)中的符號(hào)表最終都會(huì)加載到程序所在的全局符號(hào)表中,此時(shí)如果有同名符號(hào)就只能調(diào)用到第一個(gè)加載進(jìn)來(lái)的符號(hào),也就是說(shuō)后邊加載的同名符號(hào)都會(huì)被之前的覆蓋。cc 模塊中的 do() 函數(shù)被 bb 模塊中的 do() 函數(shù)覆蓋了,所以無(wú)法被調(diào)用到。

廢話(huà)不多說(shuō)。。。

在試驗(yàn)過(guò)很多不滿(mǎn)意的方法之后,最終的解決方法如下:

1.在 cc 的 makefile 中加入 -Wl,-Bsymbolic -Wl,--version-script,version 的連接選項(xiàng),意思是用 version 文件中的腳本指定其導(dǎo)出哪些函數(shù)。

2.version 文件的實(shí)現(xiàn)如下:

VERS{ 
global: 
cc_fun; 
local: *; 
}; 

意思是指定 cc 模塊只導(dǎo)出接口函數(shù) cc_fun,其余函數(shù)都設(shè)為 local 不做導(dǎo)出。

將該文件保存在 makefile 所在目錄即可。

3.重新編譯連接三個(gè)模塊,問(wèn)題解決。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

您可能感興趣的文章:
  • 解決Linux系統(tǒng)中python matplotlib畫(huà)圖的中文顯示問(wèn)題
  • 基于Linux系統(tǒng)中python matplotlib畫(huà)圖的中文顯示問(wèn)題的解決方法
  • linux下安裝nodejs及npm的方法
  • Linux 在Shell腳本中使用函數(shù)實(shí)例詳解
  • linux系統(tǒng)下ubuntu重啟apache服務(wù)命令
  • VirtualBox安裝Archlinux并配置桌面環(huán)境
  • linux定時(shí)任務(wù)訪(fǎng)問(wèn)url實(shí)例

標(biāo)簽:惠州 亳州 河南 九江 新疆 北京 贛州 懷化

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《linux 下同名符號(hào)沖突問(wèn)題解決方案》,本文關(guān)鍵詞  linux,下,同名,符號(hào),沖突,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《linux 下同名符號(hào)沖突問(wèn)題解決方案》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于linux 下同名符號(hào)沖突問(wèn)題解決方案的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章