• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            asm, c, c++ are my all
            -- Core In Computer
            posts - 139,  comments - 123,  trackbacks - 0

            [轉(zhuǎn)]Linux下使用和生成庫(kù)

            基本概念

            庫(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

            使用庫(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ù),也就是說(shuō),如果同時(shí)存在靜態(tài)和動(dòng)態(tài)庫(kù),不特別指定的話,將與動(dòng)態(tài)庫(kù)相連接。
            現(xiàn)在假設(shè)有一個(gè)叫hello的程序開(kāi)發(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();
            另外還有一些說(shuō)明文檔。這一個(gè)典型的程序開(kāi)發(fā)包結(jié)構(gòu)
            1.與動(dòng)態(tài)庫(kù)連接
            linux默認(rèn)的就是與動(dòng)態(tài)庫(kù)連接,下面這段程序testlib.c使用hello庫(kù)中的sayhello()函數(shù)

            /*testlib.c*/
            #include <hello.h>
            #include <stdio.h>

            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ù)問(wèn)題。還是上面的例子:
            $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
            3.動(dòng)態(tài)庫(kù)的路徑問(wèn)題
            為了讓執(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ù)文件都可見(jiàn)、
            4.查看庫(kù)中的符號(hào)
            有時(shí)候可能需要查看一個(gè)庫(kù)中到底有哪些函數(shù),nm命令可以打印出庫(kù)中的涉及到的所有符號(hào)。庫(kù)既可以是靜態(tài)的也可以是動(dòng)態(tài)的。nm列出的符號(hào)有很多,常見(jiàn)的有三種,一種是在庫(kù)中被調(diào)用,但并沒(méi)有在庫(kù)中定義(表明需要其他庫(kù)支持),用U表示;一種是庫(kù)中定義的函數(shù),用T表示,這是最常見(jiàn)的;另外一種是所謂的“弱態(tài)”符號(hào),它們雖然在庫(kù)中被定義,但是可能被其他庫(kù)中的同名符號(hào)覆蓋,用W表示。例如,假設(shè)開(kāi)發(fā)者希望知道上央提到的hello庫(kù)中是否定義了printf():
            $nm libhello.so |grep printf
            U printf
            U表示符號(hào)printf被引用,但是并沒(méi)有在函數(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


            生成庫(kù)

            第一步要把源代碼編繹成目標(biāo)代碼。以下面的代碼為例,生成上面用到的hello庫(kù):
            /* hello.c */
            #include <stdio.h>
            void sayhello()
            {
            printf("hello,world\n");
            }
            用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來(lái)完成,由于可能存在多個(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ù)的文件名,換句話說(shuō),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)

            posted on 2006-07-25 00:33 Jerry Cat 閱讀(534) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理



            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(7)

            隨筆檔案

            最新隨筆

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            人妻精品久久无码专区精东影业| 久久久久久亚洲精品成人| 精品无码久久久久久尤物| 久久婷婷五月综合97色直播| 亚洲精品WWW久久久久久 | 久久久久久午夜成人影院 | 久久99这里只有精品国产| 久久久WWW免费人成精品| 久久天天躁狠狠躁夜夜av浪潮 | 久久久综合九色合综国产| 97久久精品人妻人人搡人人玩| 久久av无码专区亚洲av桃花岛| 三上悠亚久久精品| 久久ww精品w免费人成| 久久精品国产亚洲av麻豆色欲| 国内精品久久久久久久97牛牛| 久久精品国产亚洲AV电影| 久久久国产精品福利免费 | 久久综合给合久久狠狠狠97色69| 久久久久久久久无码精品亚洲日韩| 亚洲色大成网站www久久九| 国产精品女同久久久久电影院| 国产精品久久久天天影视| 国产精品亚洲综合专区片高清久久久| 国产激情久久久久影院小草| 亚洲午夜无码久久久久小说| 无码人妻久久一区二区三区| 欧美激情精品久久久久| 一本色道久久综合狠狠躁篇| 久久久女人与动物群交毛片| 色综合合久久天天综合绕视看| 一本久道久久综合狠狠躁AV| AAA级久久久精品无码片| 久久久久成人精品无码| 日日噜噜夜夜狠狠久久丁香五月 | 久久这里只精品国产99热| 亚洲性久久久影院| 办公室久久精品| 人妻精品久久久久中文字幕69| 91亚洲国产成人久久精品| 亚洲级αV无码毛片久久精品|