久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

關(guān)于Linux靜態(tài)庫和動(dòng)態(tài)庫的分析 分析 動(dòng)態(tài) 靜態(tài) 關(guān)于 連接 程序 文件 一個(gè) 使用 ...

 jijo 2008-10-16

  ·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)庫的分析
2007-07-13  作者:bitsCN整理  來源:中國網(wǎng)管聯(lián)盟  點(diǎn)評(píng) 投稿 收藏

  基本概念

  庫有動(dòng)態(tài)與靜態(tài)兩種,,動(dòng)態(tài)通常用.so為后綴,,靜態(tài)用.a為后綴,。

網(wǎng)管論壇bbs_bitsCN_com


  例如:libhello.so libhello.a 為了在同一系統(tǒng)中使用不同版本的庫,,可以在庫文件名后加上版本號(hào)為后綴,例如: libhello.so.1.0,由于程序連接默認(rèn)以.so為文件后綴名,。所以為了使用這些庫,,通常使用建立符號(hào)連接的方式。 ln -s libhello.so.1.0 libhello.so.1 ln -s libhello.so.1 libhello.so 網(wǎng)管網(wǎng)www.

  1,、使用庫

中國網(wǎng)管論壇bbs.bitsCN.com


  當(dāng)要使用靜態(tài)的程序庫時(shí),,連接器會(huì)找出程序所需的函數(shù),然后將它們拷貝到執(zhí)行文件,,由于這種拷貝是完整的,,所以一旦連接成功,靜態(tài)程序庫也就不再需要了,。然 而,,對(duì)動(dòng)態(tài)庫而言,就不是這樣,。動(dòng)態(tài)庫會(huì)在執(zhí)行程序內(nèi)留下一個(gè)標(biāo)記指明當(dāng)程序執(zhí)行時(shí),,首先必須載入這個(gè)庫。由于動(dòng)態(tài)庫節(jié)省空間,,linux下進(jìn)行連接的缺省操作是首先連接動(dòng)態(tài)庫,,也就是說,如果同時(shí)存在靜態(tài)和動(dòng)態(tài)庫,,不特別指定的話,,將與動(dòng)態(tài)庫相連接。 現(xiàn)在假設(shè)有一個(gè)叫hello的程序開發(fā)包,,它提供一個(gè)靜態(tài)庫libhello.a 一個(gè)動(dòng)態(tài)庫libhello.so,一個(gè)頭文件hello.h,頭文件中提供sayhello()這個(gè)函數(shù) /* hello.h */ void sayhello(); 另外還有一些說明文檔,。

網(wǎng)管論壇bbs_bitsCN_com


  這一個(gè)典型的程序開發(fā)包結(jié)構(gòu) 與動(dòng)態(tài)庫連接 linux默認(rèn)的就是與動(dòng)態(tài)庫連接,下面這段程序testlib.c使用hello庫中的sayhello()函數(shù) 網(wǎng)管網(wǎng)www.

  /*testlib.c*/ 網(wǎng)管下載dl.

  #include

網(wǎng)管聯(lián)盟bitsCN_com

  #include

網(wǎng)管u家u.bitscn@com


  int main() { sayhello(); return 0; } 中國網(wǎng)管論壇bbs.bitsCN.com

  使用如下命令進(jìn)行編譯 $gcc -c testlib.c -o testlib.o

網(wǎng)管網(wǎng)www.


  用如下命令連接: $gcc testlib.o -lhello -o testlib

中國網(wǎng)管聯(lián)盟bitsCN.com


  連接時(shí)要注意,,假設(shè)libhello.o 和libhello.a都在缺省的庫搜索路徑下/usr/lib下,,如果在其它位置要加上-L參數(shù) 與與靜態(tài)庫連接麻煩一些,主要是參數(shù)問題,。還是上面的例子: $gcc testlib.o -o testlib -WI,-Bstatic -lhello 注:這個(gè)特別的"-WI,,-Bstatic"參數(shù),實(shí)際上是傳給了連接器ld. 指示它與靜態(tài)庫連接,,如果系統(tǒng)中只有靜態(tài)庫當(dāng)然就不需要這個(gè)參數(shù)了,。 如果要和多個(gè)庫相連接,而每個(gè)庫的連接方式不一樣,,比如上面的程序既要和libhello進(jìn)行靜態(tài)連接,,又要和libbye進(jìn)行動(dòng)態(tài)連接,其命令應(yīng)為: $gcc testlib.o -o testlib -WI,-Bstatic -lhello -WI,-Bdynamic -lbye

中國網(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


  4,、生成庫 中國網(wǎng)管論壇bbs.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頂一下


TAGs:   分析   動(dòng)態(tài)   靜態(tài)   關(guān)于   連接   程序   文件   一個(gè)   使用   可以     

 上一篇:修改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方法
關(guān)于Linux靜態(tài)庫和動(dòng)態(tài)庫的分析 評(píng)論:
共0頁/0條記錄
評(píng)論:請(qǐng)自覺遵守互聯(lián)網(wǎng)相關(guān)政策法規(guī),,評(píng)論不得超過250字。
  
 驗(yàn)證碼:   注冊(cè)用戶
 收藏到網(wǎng)摘:              
本類熱門排行: 1.在Ubuntu系統(tǒng)播放rmvb等視頻格式文件
2.在Linux下查看端口的使用情況及啟動(dòng)
3.如何修改Linux系統(tǒng)的文件權(quán)限
4.技巧:修改Linux操作系統(tǒng)的文件屬性
5.Ubuntu下允許Root用戶直接登錄圖形界面
6.Ubuntu 8.04 LTS軟件源設(shè)置指南
7.增強(qiáng)體驗(yàn),!Ubuntu 8.04 beta 初探
8.如何解決Linux操作系統(tǒng)中putty亂碼問題
9.如何讓Fedora Linux系統(tǒng)能夠打開RAR文件
10.Linux終端中文軟件zhcon0.2.6的安裝使用

最新推薦文章: 1.Wubi卸載及Grub的優(yōu)化
2.很棒的Ubuntu藍(lán)色主題
3.新手學(xué)堂:Linux操作系統(tǒng)下硬盤掛載方法
4.在linux操作系統(tǒng)中的CPU頻率調(diào)整
5.實(shí)用技巧:X-Windows中關(guān)閉touchpad方法
6.Linux系統(tǒng)下統(tǒng)計(jì)目錄及其子目錄文件個(gè)數(shù)
7.Linux下值得使用的5 個(gè)屏幕錄像軟件
8.技巧:修改Linux操作系統(tǒng)的文件屬性
9.技巧:制作Linux操作系統(tǒng)閃存啟動(dòng)盤
10.如何解決Linux操作系統(tǒng)中putty亂碼問題

網(wǎng)管論壇交流: ·不瘋魔不成活
·令你大開眼界的真正標(biāo)準(zhǔn)化機(jī)房,,已整理重
·華為HCSE OSPF路由協(xié)議培訓(xùn)教材 V3.0
·為賑災(zāi),女孩舍身拍“裸照”
·Windows Server 2003服務(wù)器群集創(chuàng)建和配
·exchange2k3全套官方資料
·雙兒一周歲了,。,。。特殊的禮物來啦,。,。
·存儲(chǔ)備份技術(shù)版塊守則
·無盤技術(shù)交流區(qū)守則
·DOS命令基礎(chǔ)大全之命令詳解<作者吐血

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多