最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年06月15日 11:41:06   投稿:lqh  
這篇文章主要介紹了 linux 下同名符號(hào)沖突問題解決方案的相關(guān)資料,需要的朋友可以參考下

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

最近的工作中遇到如下的問題:

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

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

aa 編譯后通過 -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)存泄露和功能異常,通過定位發(fā)現(xiàn)問題集中在同名的 do() 函數(shù)上。通過輸出打印發(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è)庫中的符號(hào)表最終都會(huì)加載到程序所在的全局符號(hào)表中,此時(shí)如果有同名符號(hào)就只能調(diào)用到第一個(gè)加載進(jìn)來的符號(hào),也就是說后邊加載的同名符號(hào)都會(huì)被之前的覆蓋。cc 模塊中的 do() 函數(shù)被 bb 模塊中的 do() 函數(shù)覆蓋了,所以無法被調(diào)用到。

廢話不多說。。。

在試驗(yà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è)模塊,問題解決。

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

相關(guān)文章

  • shell腳本一鍵部署docker的實(shí)現(xiàn)步驟

    shell腳本一鍵部署docker的實(shí)現(xiàn)步驟

    作為一名經(jīng)驗(yàn)豐富的開發(fā)者,我們經(jīng)常需要使用Docker來快速部署各種應(yīng)用,本文主要介紹了shell腳本一鍵部署docker的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • linux shell中單引號(hào)、雙引號(hào)、反引號(hào)、反斜杠的區(qū)別

    linux shell中單引號(hào)、雙引號(hào)、反引號(hào)、反斜杠的區(qū)別

    shell可以識(shí)別4種不同類型的引字符號(hào): 單引號(hào)字符' 雙引號(hào)字符" 反斜杠字符\ 反引號(hào)字符`的區(qū)別,學(xué)習(xí)shell編程的朋友可以看下
    2013-01-01
  • 在shell腳本中獲取上個(gè)月最后一天的日期方法

    在shell腳本中獲取上個(gè)月最后一天的日期方法

    今天小編就為大家分享一篇在shell腳本中獲取上個(gè)月最后一天的日期方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • 深入淺出Shell編程 Shell變量介紹

    深入淺出Shell編程 Shell變量介紹

    先不要管Shell的版本,來看看Shell 變量,在Shell中有三種變量:系統(tǒng)變量,環(huán)境變量,用戶變量。其中用戶變量在編程過程中使用最多,系統(tǒng)變量在對(duì)參數(shù)判斷和命令返回值判斷會(huì)使用,環(huán)境變量主要是在程序運(yùn)行的時(shí)候需要設(shè)置。
    2013-01-01
  • 腳本自動(dòng)添加crontab示例

    腳本自動(dòng)添加crontab示例

    這篇文章主要介紹了腳本自動(dòng)添加crontab示例,需要的朋友可以參考下
    2014-04-04
  • Linux?中的export與alias命令詳解

    Linux?中的export與alias命令詳解

    export和alias都是用來簡化命令行輸入的工具。export用于設(shè)置環(huán)境變量,環(huán)境變量是一些系統(tǒng)級(jí)別的變量,用于指定一些系統(tǒng)的默認(rèn)值或者搜索路徑等,這篇文章主要介紹了Linux?中的export與alias命令,需要的朋友可以參考下
    2023-04-04
  • Shell腳本break和continue命令簡明教程

    Shell腳本break和continue命令簡明教程

    這篇文章主要介紹了Shell腳本break和continue命令簡明教程,break和continue命令用來在未達(dá)到循環(huán)結(jié)束條件時(shí)強(qiáng)制跳出循環(huán),需要的朋友可以參考下
    2014-07-07
  • shell腳本4種執(zhí)行方式

    shell腳本4種執(zhí)行方式

    Linux中shell腳本的執(zhí)行通常有4種方式,分別為工作目錄執(zhí)行,絕對(duì)路徑執(zhí)行,sh執(zhí)行,shell環(huán)境執(zhí)行。這篇文章主要介紹了shell腳本4種執(zhí)行方式 ,需要的朋友可以參考下
    2019-05-05
  • shell腳本換行問題實(shí)戰(zhàn)記錄

    shell腳本換行問題實(shí)戰(zhàn)記錄

    換行相信大家都不陌生,下面這篇文章主要給大家介紹了關(guān)于shell腳本換行問題的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • 一天一個(gè)shell命令 文本操作系列-linux dd使用教程

    一天一個(gè)shell命令 文本操作系列-linux dd使用教程

    dd 是 Linux/UNIX 下的一個(gè)非常有用的命令,作用是用指定大小的塊拷貝一個(gè)文件,并在拷貝的同時(shí)進(jìn)行指定的轉(zhuǎn)換
    2016-05-05

最新評(píng)論

黔江区| 梨树县| 楚雄市| 溧阳市| 大渡口区| 桑植县| 荔波县| 喀什市| 柏乡县| 肃北| 军事| 赤峰市| 天峻县| 策勒县| 江陵县| 莱西市| 乌拉特中旗| 辽中县| 安顺市| 莱芜市| 四子王旗| 唐海县| 花垣县| 枣阳市| 永康市| 庄浪县| 遂宁市| 扬州市| 桑日县| 涡阳县| 普洱| 田东县| 左权县| 益阳市| 民和| 瑞昌市| 贵德县| 上栗县| 松滋市| 武安市| 西青区|