posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          CSAPP - Linking - 動(dòng)態(tài)鏈接庫(kù)

          Posted on 2007-08-07 23:10 ZelluX 閱讀(678) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): C/C++System
          1. 靜態(tài)庫(kù)(static library)的主要缺陷:
          1) 靜態(tài)庫(kù)通常需要維護(hù)和定期更新,而這些庫(kù)的使用者就得注意這些變化,并且在庫(kù)修改后重新將自己的程序和庫(kù)鏈接起來(lái)
          2) 以printf和scanf這兩個(gè)函數(shù)為例,它們的代碼在每個(gè)運(yùn)行的進(jìn)程里都保留了一份,在一個(gè)典型的操作系統(tǒng)上運(yùn)行著50-100個(gè)進(jìn)程,這無(wú)疑是對(duì)系統(tǒng)資源的嚴(yán)重浪費(fèi)。(內(nèi)存的一個(gè)有趣的特性是,它永遠(yuǎn)是一個(gè)短缺的資源,無(wú)關(guān)一個(gè)系統(tǒng)里有多大的內(nèi)存)

          2. 共享庫(kù)(shared library)彌補(bǔ)了靜態(tài)庫(kù)的這些缺陷。所謂共享庫(kù),就是指在運(yùn)行時(shí)可以被讀入到任意的內(nèi)存地址,并與程序鏈接的模塊。這個(gè)過(guò)程也被稱(chēng)為動(dòng)態(tài)鏈接(dynamic linking),由動(dòng)態(tài)鏈接器(dynamic linker)完成。
          Unix系統(tǒng)中共享對(duì)象通常后綴為.so,微軟的操作系統(tǒng)中大量使用了共享庫(kù),通常被稱(chēng)為DLL(dynamic link libraries)

          3. 共享庫(kù)的“共享”表現(xiàn)在兩個(gè)方面:
          1) 在任何一個(gè)給定的文件系統(tǒng)中,對(duì)于某個(gè)特定的庫(kù),只有一個(gè).so文件
          2) 共享庫(kù)單獨(dú)的一份.text域可以由多個(gè)不同的運(yùn)行進(jìn)程共享。

          4. 編譯一個(gè)共享庫(kù):gcc -shared -fPIC -o libvector.so addvec.c multvec.c
          -fPIC開(kāi)關(guān)讓編譯器產(chǎn)生位置獨(dú)立的代碼(PIC, position independent code)
          -shared開(kāi)關(guān)使得編譯器產(chǎn)生共享對(duì)象的文件

          5. 動(dòng)態(tài)鏈接的幾個(gè)應(yīng)用:
          1) 軟件的分布式開(kāi)發(fā)
          2) 開(kāi)發(fā)高效的Web服務(wù)器
          早期的Web服務(wù)器通過(guò)fork和execve調(diào)用子進(jìn)程來(lái)產(chǎn)生動(dòng)態(tài)的內(nèi)容,被稱(chēng)為CGI,而現(xiàn)代的Web服務(wù)器則通過(guò)基于動(dòng)態(tài)鏈接庫(kù)的一種高效的方式。
          主要的方法是把生成動(dòng)態(tài)內(nèi)容的函數(shù)打包到一個(gè)共享庫(kù)中,當(dāng)服務(wù)器端接收到一個(gè)請(qǐng)求后,服務(wù)器動(dòng)態(tài)地讀入并且鏈接到相應(yīng)的函數(shù),并直接調(diào)用這個(gè)函數(shù),而 fork和execve則是在子進(jìn)程的環(huán)境中運(yùn)行的。函數(shù)調(diào)用后繼續(xù)存在,以后的類(lèi)似請(qǐng)求都只需要一個(gè)簡(jiǎn)單的調(diào)用就可以了。另外,方法也可以在不停止服務(wù) 器的情況下更新,也可以加入新的函數(shù)。

          6. Unix系統(tǒng)中讀入并鏈接共享庫(kù)的方法
          #include <dlfcn.h>
          void *dlopen(const char *filename, int flag);
          // returns: ptr to handle if OK, NULL on error
          需要通過(guò)-rdynamic編譯,具體見(jiàn)CSAPP P569

          獲得已經(jīng)打開(kāi)的庫(kù)的句柄(handle)
          #include <dlfcn.h>
          void #dlsym(void *handle, char *symbol);
          // returns: ptr to symbol if OK, NULL on error

          關(guān)閉共享庫(kù)
          #include <dlfcn.h>
          int dlclose(void *handle);
          // returns: 0 if OK, -1 on error

          獲得錯(cuò)誤信息
          #include <dlfcn.h>
          const char *dlerror(void);

          評(píng)論

          # re: Linking - 動(dòng)態(tài)鏈接庫(kù)  回復(fù)  更多評(píng)論   

          2007-08-08 00:55 by Lee.MaRS
          我說(shuō)看著這么眼熟,果然是CSAPP的說(shuō),hoho

          # re: Linking - 動(dòng)態(tài)鏈接庫(kù)  回復(fù)  更多評(píng)論   

          2007-08-08 14:55 by ZelluX
          @Lee.MaRS
          re
          好書(shū)啊
          主站蜘蛛池模板: 东乌珠穆沁旗| 方山县| 察隅县| 吕梁市| 塘沽区| 云南省| 灵丘县| 新乡市| 禹州市| 崇信县| 神农架林区| 子长县| 三亚市| 莎车县| 云安县| 吉林市| 五峰| 寿光市| 永吉县| 达孜县| 永清县| 西林县| 伊宁市| 九台市| 迁安市| 将乐县| 岑溪市| 米脂县| 晴隆县| 临洮县| 乳源| 盐池县| 沈阳市| 房产| 成安县| 牙克石市| 台州市| 阜平县| 无极县| 铜川市| 榕江县|