真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

linux下同名符號沖突怎么辦-創(chuàng)新互聯(lián)

小編給大家分享一下linux下同名符號沖突怎么辦,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)公司作為成都網(wǎng)站建設公司,專注成都網(wǎng)站建設、網(wǎng)站設計,有關成都企業(yè)網(wǎng)站定制方案、改版、費用等問題,行業(yè)涉及成都混凝土泵車等多個領域,已為上千家企業(yè)服務,得到了客戶的尊重與認可。

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

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

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

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

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

bb 編譯連接得到 bb.a 靜態(tài)庫,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ù),此時應該會調(diào)用cc模塊中的do()函數(shù) 
do();//調(diào)用名為do的bb模塊內(nèi)部函數(shù)(與cc模塊中的do()函數(shù)同名,實現(xiàn)卻不相同) 
…… 
}

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

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

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

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

廢話不多說。。。

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

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

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

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

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

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

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

以上是“l(fā)inux下同名符號沖突怎么辦”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


當前名稱:linux下同名符號沖突怎么辦-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://weahome.cn/article/eeejd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部