·DedeCMS網(wǎng)管建站首選 ·三步解決<垃圾郵件> ·找網(wǎng)管朋友來網(wǎng)管u家. ·空間/域名/中資源... ·Max網(wǎng)吧安全衛(wèi)士II,,中國網(wǎng)管聯(lián)盟專用版下載 Windows Linux Cisco 網(wǎng)絡(luò)技術(shù) 數(shù)據(jù)庫 黑客攻防 DotNet Java PHP 認(rèn)證 新聞資訊 服務(wù)器 存儲(chǔ)資訊 網(wǎng)絡(luò)設(shè)備 網(wǎng)管學(xué)堂 技術(shù)專題 焦點(diǎn) 網(wǎng)吧頻道 當(dāng)前位置: > bitsCN.com > linux > 系統(tǒng)管理 > 系統(tǒng)管理 > 關(guān)于Linux靜態(tài)庫和動(dòng)態(tài)庫的分析 關(guān)于Linux靜態(tài)庫和動(dòng)態(tài)庫的分析 基本概念 庫有動(dòng)態(tài)與靜態(tài)兩種,,動(dòng)態(tài)通常用.so為后綴,,靜態(tài)用.a為后綴,。 網(wǎng)管論壇bbs_bitsCN_com
1,、使用庫 中國網(wǎng)管論壇bbs.bitsCN.com
網(wǎng)管論壇bbs_bitsCN_com
/*testlib.c*/ 網(wǎng)管下載dl. #include 網(wǎng)管聯(lián)盟bitsCN_com #include 網(wǎng)管u家u.bitscn@com
使用如下命令進(jìn)行編譯 $gcc -c testlib.c -o testlib.o 網(wǎng)管網(wǎng)www.
中國網(wǎng)管聯(lián)盟bitsCN.com
中國網(wǎng)管聯(lián)盟bitsCN.com 2,、動(dòng)態(tài)庫的路徑問題 為了讓執(zhí)行程序順利找到動(dòng)態(tài)庫,,有三種方法: 中國網(wǎng)管論壇bbs.bitsCN.com (1)把庫拷貝到/usr/lib和/lib目錄下。 中國網(wǎng)管論壇bbs.bitsCN.com (2)在LD_LIBRARY_PATH環(huán)境變量中加上庫所在路徑,。例如動(dòng)態(tài)庫libhello.so在/home/ting/lib目錄下,,以bash為例,,使用命令: $export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ting/lib 網(wǎng)管論壇bbs_bitsCN_com (3) 修改/etc/ld.so.conf文件,把庫所在的路徑加到文件末尾,,并執(zhí)行l(wèi)dconfig刷新,。這樣,加入的目錄下的所有庫文件都可見,。 網(wǎng)管網(wǎng)www_bitscn_com 3,、查看庫中的符號(hào) 網(wǎng)管網(wǎng)www. 有時(shí)候可能需要查看一個(gè)庫中到底有哪些函數(shù),nm命令可以打印出庫中的涉及到的所有符號(hào),。庫既可以是靜態(tài)的也可以是動(dòng)態(tài)的,。nm列出的符號(hào)有很多,常見的有 三種,,一種是在庫中被調(diào)用,,但并沒有在庫中定義(表明需要其他庫支持),用U表示,;一種是庫中定義的函數(shù),,用T表示,這是最常見的,;另外一種是所謂的“弱 態(tài)”符號(hào),,它們雖然在庫中被定義,但是可能被其他庫中的同名符號(hào)覆蓋,,用W表示,。例如,假設(shè)開發(fā)者希望知道上文提到的hello庫中是否定義了 printf(): 網(wǎng)管下載dl. $nm libhello.so |grep printf U 網(wǎng)管聯(lián)盟bitsCN_com 其中printf U表示符號(hào)printf被引用,,但是并沒有在函數(shù)內(nèi)定義,,由此可以推斷,要正常使用hello庫,,必須有其它庫支持,,再使用ldd命令查看hello依賴于哪些庫: 網(wǎng)管聯(lián)盟bitsCN@com $ldd hello libc.so.6=>/lib/libc.so.6(0x400la000) /lib/ld-linux.so.2=>/lib/ld-linux.so.2 (0x40000000) 從上面的結(jié)果可以繼續(xù)查看printf最終在哪里被定義,,有興趣可以go on 網(wǎng)管bitscn_com
第一步要把源代碼編繹成目標(biāo)代碼。以下面的代碼為例,,生成上面用到的hello庫: /* hello.c */ #include void sayhello() { printf("hello,world "); } 用gcc編繹該文件,,在編繹時(shí)可以使用任何全法的編繹參數(shù),例如-g加入調(diào)試代碼等: gcc -c hello.c -o hello.o 1.連接成靜態(tài)庫 連接成靜態(tài)庫使用ar命令,,其實(shí)ar是archive的意思 $ar cqs libhello.a hello.o 2.連接成動(dòng)態(tài)庫 生成動(dòng)態(tài)庫用gcc來完成,,由于可能存在多個(gè)版本,因此通常指定版本號(hào): $gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o 另外再建立兩個(gè)符號(hào)連接: $ln -s libhello.so.1.0 libhello.so.1 $ln -s libhello.so.1 libhello.so 這樣一個(gè)libhello的動(dòng)態(tài)連接庫就生成了,。最重要的是傳gcc -shared 參數(shù)使其生成是動(dòng)態(tài)庫而不是普通執(zhí)行程序,。 -Wl 表示后面的參數(shù)也就是-soname,libhello.so.1直接傳給連接器ld進(jìn)行處理,。實(shí)際上,每一個(gè)庫都有一個(gè)soname,,當(dāng)連接器發(fā)現(xiàn)它正 在查找的程序庫中有這樣一個(gè)名稱,,連接器便會(huì)將soname嵌入連結(jié)中的二進(jìn)制文件內(nèi),而不是它正在運(yùn)行的實(shí)際文件名,,在程序執(zhí)行期間,,程序會(huì)查找擁有 soname名字的文件,而不是庫的文件名,,換句話說,,soname是庫的區(qū)分標(biāo)志。 這樣做的目的主要是允許系統(tǒng)中多個(gè)版本的庫文件共存,,習(xí)慣上在命名庫文件的時(shí)候通常與soname相同 libxxxx.so.major.minor 其中,,xxxx是庫的名字,major是主版本號(hào),,minor 是次版本號(hào) 中國網(wǎng)管聯(lián)盟bitsCN.com 總結(jié) 網(wǎng)管bitscn_com 通過對(duì)LINUX庫工作的分析,,我們已經(jīng)可以理解程序運(yùn)行時(shí)如何去別的地方尋找“庫”,在下一篇文章中我繼續(xù)研究可執(zhí)行程序的執(zhí)行過程,,這兩天在寫一個(gè)服務(wù)器上的腳本,,快成功了?;ㄔ贚inux上的時(shí)間明顯少了點(diǎn),,等過兩天把這個(gè)小程序開發(fā)完畢以后馬上轉(zhuǎn)回正行。 網(wǎng)管聯(lián)盟bitsCN_com 0頂一下
上一篇:修改VMware虛擬機(jī)網(wǎng)卡MAC地址的方法總結(jié) 下一篇:Linux操作系統(tǒng)下VMware的端口映射 相關(guān)文章列表試用VMware Workstation 6.5 Beta2修復(fù)Linux,、Windows雙系統(tǒng)中Grub的損壞Wubi卸載及Grub的優(yōu)化如何使linux的啟動(dòng)信息顯示到LCD 上面很棒的Ubuntu藍(lán)色主題Linux下Compiz Fusion新特效StackswitchVim編譯器配合ctags實(shí)現(xiàn)函數(shù)原型快速定位使用initrd文件系統(tǒng) U-boot引導(dǎo)Linux方法 最新推薦文章: 1.Wubi卸載及Grub的優(yōu)化 網(wǎng)管論壇交流: ·不瘋魔不成活 |
|