国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關(guān)注微信公眾號(hào)

關(guān)于Linux靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的分析
2007-07-20   中國(guó)IT實(shí)驗(yàn)室

基本概念

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

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

  1、使用庫(kù)

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

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

  /*testlib.c*/

  #include

  #include

  int main() { sayhello(); return 0; }

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

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

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

  2、動(dòng)態(tài)庫(kù)的路徑問題 為了讓執(zhí)行程序順利找到動(dòng)態(tài)庫(kù),有三種方法:

  (1)把庫(kù)拷貝到/usr/lib和/lib目錄下。

  (2)在LD_LIBRARY_PATH環(huán)境變量中加上庫(kù)所在路徑。例如動(dòng)態(tài)庫(kù)libhello.so在/home/ting/lib目錄下,以bash為例,使用命令: $export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ting/lib

  (3) 修改/etc/ld.so.conf文件,把庫(kù)所在的路徑加到文件末尾,并執(zhí)行l(wèi)dconfig刷新。這樣,加入的目錄下的所有庫(kù)文件都可見。

  3、查看庫(kù)中的符號(hào)

  有時(shí)候可能需要查看一個(gè)庫(kù)中到底有哪些函數(shù),nm命令可以打印出庫(kù)中的涉及到的所有符號(hào)。庫(kù)既可以是靜態(tài)的也可以是動(dòng)態(tài)的。nm列出的符號(hào)有很多,常見的有 三種,一種是在庫(kù)中被調(diào)用,但并沒有在庫(kù)中定義(表明需要其他庫(kù)支持),用U表示;一種是庫(kù)中定義的函數(shù),用T表示,這是最常見的;另外一種是所謂的“弱 態(tài)”符號(hào),它們雖然在庫(kù)中被定義,但是可能被其他庫(kù)中的同名符號(hào)覆蓋,用W表示。例如,假設(shè)開發(fā)者希望知道上文提到的hello庫(kù)中是否定義了 printf():

  $nm libhello.so |grep printf U

  其中printf U表示符號(hào)printf被引用,但是并沒有在函數(shù)內(nèi)定義,由此可以推斷,要正常使用hello庫(kù),必須有其它庫(kù)支持,再使用ldd命令查看hello依賴于哪些庫(kù):

  $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

  4、生成庫(kù)

  第一步要把源代碼編繹成目標(biāo)代碼。以下面的代碼為例,生成上面用到的hello庫(kù): /* hello.c */ #include void sayhello() { printf("hello,world "); } 用gcc編繹該文件,在編繹時(shí)可以使用任何全法的編繹參數(shù),例如-g加入調(diào)試代碼等: gcc -c hello.c -o hello.o 1.連接成靜態(tài)庫(kù) 連接成靜態(tài)庫(kù)使用ar命令,其實(shí)ar是archive的意思 $ar cqs libhello.a hello.o 2.連接成動(dòng)態(tài)庫(kù) 生成動(dòng)態(tài)庫(kù)用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)連接庫(kù)就生成了。最重要的是傳gcc -shared 參數(shù)使其生成是動(dòng)態(tài)庫(kù)而不是普通執(zhí)行程序。 -Wl 表示后面的參數(shù)也就是-soname,libhello.so.1直接傳給連接器ld進(jìn)行處理。實(shí)際上,每一個(gè)庫(kù)都有一個(gè)soname,當(dāng)連接器發(fā)現(xiàn)它正 在查找的程序庫(kù)中有這樣一個(gè)名稱,連接器便會(huì)將soname嵌入連結(jié)中的二進(jìn)制文件內(nèi),而不是它正在運(yùn)行的實(shí)際文件名,在程序執(zhí)行期間,程序會(huì)查找擁有 soname名字的文件,而不是庫(kù)的文件名,換句話說,soname是庫(kù)的區(qū)分標(biāo)志。 這樣做的目的主要是允許系統(tǒng)中多個(gè)版本的庫(kù)文件共存,習(xí)慣上在命名庫(kù)文件的時(shí)候通常與soname相同 libxxxx.so.major.minor 其中,xxxx是庫(kù)的名字,major是主版本號(hào),minor 是次版本號(hào)

  總結(jié)

  通過對(duì)LINUX庫(kù)工作的分析,我們已經(jīng)可以理解程序運(yùn)行時(shí)如何去別的地方尋找“庫(kù)”,在下一篇文章中我繼續(xù)研究可執(zhí)行程序的執(zhí)行過程,這兩天在寫一個(gè)服務(wù)器上的腳本,快成功了。花在Linux上的時(shí)間明顯少了點(diǎn),等過兩天把這個(gè)小程序開發(fā)完畢以后馬上轉(zhuǎn)回正行。

熱詞搜索:

上一篇:Linux操作系統(tǒng)下VMware的端口映射
下一篇:修改VMware虛擬機(jī)網(wǎng)卡MAC地址的方法總結(jié)1

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
欧美精品在线免费观看| 亚洲欧美日韩网| 欧美日韩亚洲一区二区三区在线观看 | 国模叶桐国产精品一区| 欧美日韩国产高清| 激情欧美丁香| 久久精品九九| 在线精品亚洲一区二区| 久久久久久网| 亚洲第一天堂无码专区| 久久五月婷婷丁香社区| 国产一区二区三区成人欧美日韩在线观看| 亚洲欧美在线aaa| 国产精品乱码人人做人人爱| 午夜视频在线观看一区二区三区 | 亚洲国产成人av好男人在线观看| 亚洲国产精品热久久| 国产精品h在线观看| 亚洲视频www| 麻豆国产精品va在线观看不卡| 久久亚洲风情| 欧美体内she精视频| 国产精品99久久久久久www| 国产精品亚洲精品| 精品不卡在线| 91久久精品一区二区三区| 亚洲私人影院| 欧美—级a级欧美特级ar全黄| 国模精品一区二区三区| 亚洲综合色丁香婷婷六月图片| 欧美精品18+| 亚洲成人在线免费| 欧美午夜不卡在线观看免费 | 欧美日韩国产色站一区二区三区| 亚洲欧洲日韩综合二区| 欧美精品三级日韩久久| 99在线|亚洲一区二区| 欧美日韩免费在线观看| 欧美国产亚洲另类动漫| 噜噜噜在线观看免费视频日韩| 久久精品国产清高在天天线| 欧美午夜激情小视频| 日韩午夜电影av| 老牛影视一区二区三区| 国产综合色产| 久久久久综合一区二区三区| 国产亚洲精品aa| 性欧美xxxx视频在线观看| 国产精品国产三级国产aⅴ无密码| 亚洲日本免费| 欧美日韩国产丝袜另类| 日韩亚洲国产精品| 欧美日韩一区国产| 亚洲午夜高清视频| 国产精品美女久久| 亚洲欧美日韩天堂| 国产欧美精品日韩| 久久精品国产96久久久香蕉| 久久男人资源视频| 欧美成人官网二区| 国产欧美三级| 极品尤物一区二区三区| 国产一区二区无遮挡| 国产精品日韩在线| 国产精品素人视频| 国产日韩精品在线| 亚洲二区精品| 在线视频日本亚洲性| 欧美一级黄色网| 国产精品99久久99久久久二8| 欧美激情国产日韩精品一区18| 亚洲福利视频一区| 欧美精品综合| 亚洲欧美日韩久久精品| 欧美精品一区二| 国产精品成人v| 国产欧美日韩亚洲精品| 精品99一区二区| 欧美在线观看视频在线| 久久人人看视频| 国产精品老牛| 中文av一区特黄| 久久久亚洲国产美女国产盗摄| 欧美激情一区二区三区 | 国产精品国产三级国产| 欧美日韩一视频区二区| 国内精品99| 亚洲人成毛片在线播放| 艳女tv在线观看国产一区| 欧美一区91| 欧美成人精品一区二区三区| 中国成人在线视频| 亚洲免费影视第一页| 久久久www成人免费精品| 欧美午夜精品久久久久久孕妇| 久久男女视频| 欧美日韩在线一区二区| 亚洲高清av在线| 欧美日韩国产一区二区| 欧美在线免费看| 亚洲乱码国产乱码精品精98午夜| 国产精品青草久久久久福利99| 久久久精品国产一区二区三区| 亚洲国产一区在线观看| 国内外成人免费激情在线视频网站| 最近看过的日韩成人| 久久精品日韩一区二区三区| 国产精品一区二区a| 在线观看中文字幕不卡| 久久精品视频播放| 欧美日韩国产一区| 亚洲精品久久久久久下一站| 欧美精品一区三区在线观看| 久久成人精品无人区| 欧美激情亚洲视频| 欧美视频在线观看一区二区| 亚洲欧美日韩国产综合在线 | 香蕉久久久久久久av网站 | 欧美一区二区成人6969| 亚洲精品中文字| 黄色国产精品| 国产偷国产偷亚洲高清97cao| 欧美精品在线免费观看| 免费观看成人| 久久人人看视频| 久久成年人视频| 亚洲一级免费视频| 一区二区三区|亚洲午夜| 亚洲国产天堂久久国产91| 中文在线不卡| 国产精品久久久久永久免费观看| 欧美在线视频导航| 亚洲精品少妇30p| 国产一区二区三区成人欧美日韩在线观看 | 欧美午夜大胆人体| 亚洲综合色自拍一区| 狠狠入ady亚洲精品| 欧美色视频在线| 毛片基地黄久久久久久天堂| 欧美一区二区三区电影在线观看| 亚洲国产精品精华液2区45| 国产精品欧美激情| 欧美不卡激情三级在线观看| 亚洲一级电影| 亚洲美女精品成人在线视频| 狠狠噜噜久久| 国产曰批免费观看久久久| 欧美视频在线一区| 欧美日韩国产专区| 欧美大胆a视频| 久久精品夜色噜噜亚洲a∨| 久久久久久久综合| 亚洲欧美另类久久久精品2019| 国产精品久久久久久亚洲调教| 一区二区三区产品免费精品久久75| 国产精品一香蕉国产线看观看| 久久一二三区| 老司机67194精品线观看| 国产日韩欧美视频| 国产精品久久激情| 欧美成人在线影院| 欧美激情精品久久久六区热门 | 欧美激情亚洲激情| 欧美激情按摩在线| 欧美日韩1区| 欧美视频在线观看免费| 国产精品私拍pans大尺度在线| 国产欧美日韩一区二区三区在线观看 | 亚洲欧美久久| 一本色道久久综合亚洲精品不卡 | 亚洲国产一区二区视频 | 亚洲电影免费观看高清| 国产精品伊人日日| 在线观看精品| 在线视频日韩| 久久久久久高潮国产精品视| 欧美国产亚洲精品久久久8v| 欧美偷拍一区二区| 国内精品免费在线观看| 美日韩精品视频| 国产女人精品视频| 亚洲精品九九| 久久久久久久久久久久久久一区| 久久综合九色99| 国产精品一区二区欧美| 亚洲日本va午夜在线电影| 午夜在线视频一区二区区别| 久久久久综合| 国产精品a久久久久久| 国产在线欧美日韩| 久久九九全国免费精品观看| 欧美人与禽猛交乱配| 国产精品一区二区久激情瑜伽| 欧美成人免费小视频| 亚洲国产成人午夜在线一区| 国内精品久久久久久久果冻传媒| 国产精品久久国产三级国电话系列| 久久国产一区二区| 亚洲欧美色婷婷| 黄色av日韩|