• <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>
            posts - 25,  comments - 0,  trackbacks - 0
             創(chuàng)建和使用靜態(tài)庫 
            創(chuàng)建一個(gè)靜態(tài)庫是相當(dāng)簡(jiǎn)單的。通常使用 ar 程序把一些目標(biāo)文件(.o)組合在一起,
            成為一個(gè)單獨(dú)的庫,然后運(yùn)行 ranlib,以給庫加入一些索引信息。 
            2  創(chuàng)建和使用共享庫
            特殊的編譯和連接選項(xiàng)
            -D_REENTRANT         使得預(yù)處理器符號(hào) _REENTRANT 被定義,這個(gè)符號(hào)激活一些宏特性。
            -fPIC                選項(xiàng)產(chǎn)生位置獨(dú)立的代碼。由于庫是在運(yùn)行的時(shí)候被調(diào)入,因此這個(gè)
                                 選項(xiàng)是必需的,因?yàn)樵诰幾g的時(shí)候,裝入內(nèi)存的地址還不知道。如果
                                 不使用這個(gè)選項(xiàng),庫文件可能不會(huì)正確運(yùn)行。
            -shared              選項(xiàng)告訴編譯器產(chǎn)生共享庫代碼。
            -Wl,-soname          -Wl 告訴編譯器將后面的參數(shù)傳遞到連接器。而 -soname 指定了
                                 共享庫的 soname。 

                # 可以把庫文件拷貝到 /etc/ld.so.conf 中列舉出的任何目錄中,并以
            root 身份運(yùn)行 ldconfig;或者
                # 運(yùn)行 export LD_LIBRARY_PATH='pwd',它把當(dāng)前路徑加到庫搜索路徑中去。 

            3  使用高級(jí)共享庫特性
            1> ldd 工具
            ldd 用來顯示執(zhí)行文件需要哪些共享庫, 共享庫裝載管理器在哪里找到了需要的共享庫. 
            2> soname 
            共享庫的一個(gè)非常重要的,也是非常難的概念是 soname--簡(jiǎn)寫共享目標(biāo)名(short for shared object name)。這是一個(gè)為共享庫(.so)文件而內(nèi)嵌在控制數(shù)據(jù)中的名字。如前面提到的,每一個(gè)程序都有一個(gè)需要使用的庫的清單。這個(gè)清單的內(nèi)容是一系列庫的 soname,如同 ldd 顯示的那樣,共享庫裝載器必須找到這個(gè)清單。 
            soname 的關(guān)鍵功能是它提供了兼容性的標(biāo)準(zhǔn)。當(dāng)要升級(jí)系統(tǒng)中的一個(gè)庫時(shí),并且新庫的 soname 和老的庫的 soname 一樣,用舊庫連接生成的程序,使用新的庫依然能正常運(yùn)行。這個(gè)特性使得在 Linux 下,升級(jí)使用共享庫的程序和定位錯(cuò)誤變得十分容易。 
            在 Linux 中,應(yīng)用程序通過使用 soname,來指定所希望庫的版本。庫作者也可以通過保留或者改變 soname 來聲明,哪些版本是相互兼容的,這使得程序員擺脫了共享庫版本沖突問題的困擾。 
            查看/usr/local/lib 目錄,分析 MiniGUI 的共享庫文件之間的關(guān)系 
            3> 共享庫裝載器 
            當(dāng)程序被調(diào)用的時(shí)候,Linux 共享庫裝載器(也被稱為動(dòng)態(tài)連接器)也自動(dòng)被調(diào)用。它的作用是保證程序所需要的所有適當(dāng)版本的庫都被調(diào)入內(nèi)存。共享庫裝載器名字是 ld.so 或者是 ld-linux.so,這取決于 Linux libc 的版本,它必須使用一點(diǎn)外部交互,才能完成自己的工作。然而它接受在環(huán)境變量和配置文件中的配置信息。 
            文件 /etc/ld.so.conf 定義了標(biāo)準(zhǔn)系統(tǒng)庫的路徑。共享庫裝載器把它作為搜索路徑。為了改變這個(gè)設(shè)置,必須以 root 身份運(yùn)行 ldconfig 工具。這將更新 /etc/ls.so.cache 文件,這個(gè)文件其實(shí)是裝載器內(nèi)部使用的文件之一。 
            可以使用許多環(huán)境變量控制共享庫裝載器的操作(表1-4+)。 
                                    表 1-4+ 共享庫裝載器環(huán)境變量
            變量                       含義
            LD_AOUT_LIBRARY_PATH       除了不使用 a.out 二進(jìn)制格式外,與 LD_LIBRARY_PATH 相同。
            LD_AOUT_PRELOAD            除了不使用 a.out 二進(jìn)制格式外,與 LD_PRELOAD 相同。
            LD_KEEPDIR                 只適用于 a.out 庫;忽略由它們指定的目錄。
            LD_LIBRARY_PATH            將其他目錄加入庫搜索路徑。它的內(nèi)容應(yīng)該是由冒號(hào)
                                       分隔的目錄列表,與可執(zhí)行文件的 PATH 變量具有相同的格式。
                                       如果調(diào)用設(shè)置用戶 ID 或者進(jìn)程 ID 的程序,該變量被忽略。
            LD_NOWARN                  只適用于 a.out 庫;當(dāng)改變版本號(hào)是,發(fā)出警告信息。
            LD_PRELOAD                 首先裝入用戶定義的庫,使得它們有機(jī)會(huì)覆蓋或者重新定義標(biāo)準(zhǔn)庫。
                                       使用空格分開多個(gè)入口。對(duì)于設(shè)置用戶 ID 或者進(jìn)程 ID 的程序,
                                       只有被標(biāo)記過的庫才被首先裝入。在 /etc/ld.so.perload 中指定
                                       了全局版本號(hào),該文件不遵守這個(gè)限制。 

            4> 使用 dlopen 
                另外一個(gè)強(qiáng)大的庫函數(shù)是 dlopen()。該函數(shù)將打開一個(gè)新庫,并把它裝入內(nèi)存。該函數(shù)主要用來加載庫中的符號(hào),這些符號(hào)在編譯的時(shí)候是不知道的。比如 Apache Web 服務(wù)器利用這個(gè)函數(shù)在運(yùn)行過程中加載模塊,這為它提供了額外的能力。一個(gè)配置文件控制了加載模塊的過程。這種機(jī)制使得在系統(tǒng)中添加或者刪除一個(gè)模塊時(shí),都不需要重新編譯了。 
                可以在自己的程序中使用 dlopen()。dlopen() 在 dlfcn.h 中定義,并在 dl 庫中實(shí)現(xiàn)。它需要兩個(gè)參數(shù):一個(gè)文件名和一個(gè)標(biāo)志。文件名可以是我們學(xué)習(xí)過的庫中的 soname。標(biāo)志指明是否立刻計(jì)算庫的依賴性。如果設(shè)置為 RTLD_NOW 的話,則立刻計(jì)算;如果設(shè)置的是 RTLD_LAZY,則在需要的時(shí)候才計(jì)算。另外,可以指定 RTLD_GLOBAL,它使得那些在以后才加載的庫可以獲得其中的符號(hào)。 
                當(dāng)庫被裝入后,可以把 dlopen() 返回的句柄作為給 dlsym() 的第一個(gè)參數(shù),以獲得符號(hào)在庫中的地址。使用這個(gè)地址,就可以獲得庫中特定函數(shù)的指針,并且調(diào)用裝載庫中的相應(yīng)函數(shù)。 作者:perfectpdl 發(fā)表于2011-12-25 21:40:34 原文鏈接 
            posted on 2012-07-06 16:57 nk_ysg 閱讀(441) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Linux
            <2012年7月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            亚洲国产成人久久综合碰| 国产69精品久久久久9999| 久久一区二区三区99| 色噜噜狠狠先锋影音久久| 久久久女人与动物群交毛片| 久久精品一区二区三区AV| 热99RE久久精品这里都是精品免费 | 无码任你躁久久久久久老妇App| 久久91这里精品国产2020| 久久av免费天堂小草播放| 久久伊人影视| 伊人久久大香线蕉亚洲五月天| 亚洲另类欧美综合久久图片区| 久久午夜免费视频| 久久综合给合久久国产免费| 精品国际久久久久999波多野 | 亚洲AV无一区二区三区久久| 亚洲AV日韩AV天堂久久| 日本人妻丰满熟妇久久久久久 | 久久亚洲综合色一区二区三区| 久久九九亚洲精品| 久久夜色撩人精品国产| 人妻少妇久久中文字幕一区二区 | 久久99精品国产自在现线小黄鸭| 午夜天堂av天堂久久久| 久久精品9988| 久久综合久久综合亚洲| 久久水蜜桃亚洲av无码精品麻豆 | 一本久道久久综合狠狠爱| 久久人人妻人人爽人人爽| 国产呻吟久久久久久久92| 久久久久久国产a免费观看黄色大片| 18岁日韩内射颜射午夜久久成人 | 久久99精品久久久久久动态图| 国产L精品国产亚洲区久久| 久久福利资源国产精品999| 国产精品久久久久国产A级| 亚洲午夜精品久久久久久浪潮 | 久久久国产精华液| 国产国产成人久久精品| 精品蜜臀久久久久99网站|