unix平臺(tái)動(dòng)態(tài)連接庫(kù)的管理是什么-創(chuàng)新互聯(lián)

這篇文章給大家介紹unix平臺(tái)動(dòng)態(tài)連接庫(kù)的管理是什么,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

目前創(chuàng)新互聯(lián)已為近1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁(yè)空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、沈河網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

    世界上唯一不變的是變化,對(duì)于動(dòng)態(tài)連接庫(kù)更是如此。動(dòng)態(tài)庫(kù)天生為方便程序的更新而設(shè)計(jì),只需要替代庫(kù)文件,無(wú)需重新編譯主程序,即可運(yùn)行更新后的版本。另外,動(dòng)態(tài)庫(kù)是多應(yīng)用共享的,多個(gè)程序使用同一個(gè)庫(kù),那么庫(kù)只會(huì)加載一份。
    但是,現(xiàn)實(shí)往往不這么簡(jiǎn)單。既然動(dòng)態(tài)庫(kù)有新版本,那就會(huì)有與舊版本兼容或者不兼容的情況出現(xiàn)。當(dāng)系統(tǒng)里存在多個(gè)使用此動(dòng)態(tài)庫(kù)的應(yīng)用程序時(shí),如果是兼容舊版本的更新還好,如果是不兼容,那么使用舊版本的應(yīng)用程序就會(huì)受影響不能正常運(yùn)行。特別的,當(dāng)動(dòng)態(tài)庫(kù)集中放在系統(tǒng)指定的庫(kù)目錄下時(shí)(windows的system32),版本的沖突就形成了著名的“windows dll hell”。

    為了解決這個(gè)問(wèn)題,很多UNIX系統(tǒng)使用了ELF格式的DT_SONAME字段來(lái)應(yīng)對(duì)。例如,linux的ld命令中,就有這么一個(gè)選項(xiàng)。
       -h name
       -soname=name
           When creating an ELF shared object, set the internal DT_SONAME
           field to the specified name.  When an executable is linked with a
           shared object which has a DT_SONAME field, then when the executable
           is run the dynamic linker will attempt to load the shared object
           specified by the DT_SONAME field rather than the using the file
           name given to the linker.
    表示使用-h或者-soname選項(xiàng),可以在動(dòng)態(tài)庫(kù)里指定DT_SONAME字段,保存運(yùn)行時(shí)查找的動(dòng)態(tài)庫(kù)名字,使得編譯時(shí)和運(yùn)行時(shí)動(dòng)態(tài)庫(kù)名可以不同。例如,編譯libwel.so時(shí)使用-soname=libwel.so.1,那么編譯可執(zhí)行程序時(shí)-lwel,連接libwel.so,會(huì)記錄運(yùn)行時(shí)在搜索路徑查找libwel.so.1加載。

    ELF是一種應(yīng)用非常廣泛的二進(jìn)制目標(biāo)格式,與之類(lèi)似的,UNIX的二進(jìn)制目標(biāo)還有a.out格式(SCO UNIX),XCOFF格式(AIX)。這兩種格式就無(wú)法支持soname了。

    那么,如何使多個(gè)版本的動(dòng)態(tài)連接庫(kù)同時(shí)支持呢,總結(jié)一下使用這種命名方式既可以新舊不兼容版本共存,又可以兼容版本正常升級(jí)。動(dòng)態(tài)庫(kù)命名為libxxx.so.n.m,soname名為libxxx.so.n,建立軟連接libxxx.so指向最新的n版本libxxx.so.n供編譯可執(zhí)行程序使用,建立軟連接libxxx.so.n指向版本n最新的m版本。這樣,n的變化表示不兼容舊版本的改動(dòng),相同n下m的變化表示兼容n版本的改動(dòng)。
    還是以libwel.so舉例。1.0版本的wel.c提供的函數(shù)void welcome(void) { printf("aaa\n"); },編譯成庫(kù)libwel.so.1.0,soname為libwel.so.1。建立軟連接libwel.so.1,libwel.so。使用1.0庫(kù)的主程序main1.c調(diào)用welcome(),編譯成main1程序。1.1版本的wel.c改成void welcome(void) { printf("bbb\n"); },動(dòng)態(tài)庫(kù)只修改內(nèi)部實(shí)現(xiàn),對(duì)外接口兼容1.0版本,編譯成庫(kù)libwel.so.1.1。此時(shí)更新軟連接libwel.so.1為libwel.so.1.1,主程序main1無(wú)需變動(dòng),即可輸出更新后的bbb。2.0版本的wel.c改變了對(duì)外接口,提供的函數(shù)void welcome(char *p) { printf("%s\n",p); }。編譯成庫(kù)libwel.so.2.0,soname為libwel.so.2。建立軟連接libwel.so.2,libwel.so。使用2.0庫(kù)的主程序main2.c應(yīng)以一個(gè)參數(shù)調(diào)用welcome("test")。main1和main2主程序互不兼容,必須分別調(diào)用版本1和版本2的庫(kù)。此時(shí),庫(kù)目錄下存在libwel.so.1指向1.1版本,libwel.so.2指向2.0版本,main1會(huì)連接1.1版本運(yùn)行,main2會(huì)連接2.0版本運(yùn)行。由此可見(jiàn),小版本升級(jí)時(shí)應(yīng)用程序自動(dòng)使用最新版本,大版本升級(jí)時(shí),使用舊版本的“過(guò)時(shí)”應(yīng)用程序不受影響,從而避免了動(dòng)態(tài)庫(kù)版本的混亂。

    同樣,以link方式為例,給出各UNIX平臺(tái)加設(shè)soname的動(dòng)態(tài)庫(kù)編譯方法。(AIX不支持)

 linux:
  編譯libwel.so:
   gcc -fPIC -shared -Wl,-soname,libwel.so.1 -o libwel.so.1.0 wel.c -lc
   ln -sf libwel.so.1.0 libwel.so.1
   ln -sf libwel.so.1 libwel.so
    -Wl,-soname,libwel.so.1 指定libwel.so.1.0的實(shí)際soname為libwel.so.1

 sco unix open server:
  編譯libwel.so:
   cc -K pic -G -h libwel.so.1 -o libwel.so.1.0 wel.c -lc
   ln -sf libwel.so.1.0 libwel.so.1
   ln -sf libwel.so.1 libwel.so
    -h libwel.so.1 指定libwel.so.1.0的實(shí)際soname為libwel.so.1

 HP UX:
  編譯libwel.so:
   cc +z -c wel.c
   ld -b -o libwel.sl.1.0 wel.o +h libwel.sl.1 -lc
   ln -sf libwel.sl.1.0 libwel.sl.1
   ln -sf libwel.sl.1 libwel.sl
    +h libwel.sl.1 指定libwel.sl.1.0的實(shí)際soname為libwel.sl.1

 SUN OS:
  編譯libwel.so:
   cc -G -h libwel.so.1 -o libwel.so.1.0 wel.c -lc
   ln -sf libwel.so.1.0 libwel.so.1
   ln -sf libwel.so.1 libwel.so
    -h libwel.so.1 指定libwel.so.1.0的實(shí)際soname為libwel.so.1

關(guān)于unix平臺(tái)動(dòng)態(tài)連接庫(kù)的管理是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

文章標(biāo)題:unix平臺(tái)動(dòng)態(tài)連接庫(kù)的管理是什么-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://muchs.cn/article34/ddcjpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站定制開(kāi)發(fā)、網(wǎng)站排名、網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)、小程序開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)