天天看點

Linux靜态庫和共享庫【轉】

靜态庫類似windows中的靜态lib

特點:包含函數代碼聲明和實作,連結後所有代碼都嵌入到宿主程式中。

隻在編譯時使用,執行時不再需要該靜态庫。

2.靜态庫編寫

示例如下:

addvec.c

Linux靜态庫和共享庫【轉】
Linux靜态庫和共享庫【轉】
Linux靜态庫和共享庫【轉】
Linux靜态庫和共享庫【轉】

multvec.c 

Linux靜态庫和共享庫【轉】
Linux靜态庫和共享庫【轉】
Linux靜态庫和共享庫【轉】
Linux靜态庫和共享庫【轉】

使用AR工具建立靜态庫檔案:

Linux靜态庫和共享庫【轉】

3.靜态庫使用

test2.c

Linux靜态庫和共享庫【轉】
Linux靜态庫和共享庫【轉】
Linux靜态庫和共享庫【轉】
Linux靜态庫和共享庫【轉】

編譯-連結-運作程式

Linux靜态庫和共享庫【轉】

1)-static參數,表明是靜态連結,編譯出的是完整的可執行目标檔案。

2)當連結器進行連結時,會判斷main函數裡調用了addvec.o中的addvec函數,

沒有調用multvec.o中的任何函數,是以,連結器隻會拷貝addvec.o到可執行檔案。

4.什麼是共享庫

共享庫類似windows中的動态連結庫dll

特點:包含函數代碼聲明和實作。

隻在運作時使用,由動态連結器連結和加載。

根據連結和加載共享庫的時機可分為以下兩類:

1)自身加載型共享庫。

2)運作時加載型共享庫

5.自身加載型共享庫。

類似windows中的隐式連結

連結時,将共享庫的聲明資訊連結到可執行檔案,

應用程式加載時,動态連結庫解析聲明資訊,加載共享庫的實作到存儲器,重定位應用程式中聲明資訊到實際位址。

6.自身加載型共享庫使用示例

使用-shared參數,訓示編譯器建立一個共享庫。

如下所示,我們建立了一個共享庫,并通過自身加載型來使用該共享庫。

Linux靜态庫和共享庫【轉】

1)-fPIC參數,訓示編譯器生成代碼無關的代碼

2)在連結時,沒有拷貝共享庫libvec.so的實作,隻拷貝了一些重定位和符号表資訊

3)程式加載時,動态連結器會解析共享庫libvec.so中代碼和資料的引用,重定位完成連結任務。

重定位libvec.so的文本和資料到存儲器段

重定位p2中引用的libvec.so到以上存儲器段

最後連結器将控制傳遞給程式,此時,共享庫的位置就固定了。

7.運作時加載型共享庫

類似windows中的顯式連結

無需編譯時連結,可在運作過程中加載和解除安裝共享庫。

8.運作時加載型共享庫使用示例

Linux提供了一組運作過程中加載和解除安裝共享庫的API,如下所示:

#include<dlfcn.h>

Linux靜态庫和共享庫【轉】
Linux靜态庫和共享庫【轉】
Linux靜态庫和共享庫【轉】
Linux靜态庫和共享庫【轉】

根據以上API,我們可以友善地加載和解除安裝共享庫,如下所示:

Linux靜态庫和共享庫【轉】
Linux靜态庫和共享庫【轉】
Linux靜态庫和共享庫【轉】
Linux靜态庫和共享庫【轉】

運作程式:

Linux靜态庫和共享庫【轉】

其中,-ldl參數,表示程式運作時需要用到共享庫

參考:http://www.cnblogs.com/shijingjing07/p/5608104.html

本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/sky-heaven/p/7655109.html,如需轉載請自行聯系原作者

繼續閱讀