動態鏈結共享庫

2021-09-29 20:03:40 字數 1632 閱讀 9618

靜態庫有一些明顯的缺陷,它與所有的軟體一樣,需要定期維護和更新。如果應用程式設計師想要使用乙個庫的最新版本,他們必須以某種方式了解到該庫的更新情況,然後顯示的將他們的程式與更新了的庫重新鏈結。

其次,幾乎每乙個c程式都使用了標準i/o函式,執行時這些函式的**會被複製到每個執行程序的文字段中,在執行上百個程序時將是對記憶體的極大浪費。

而共享庫(dynamic object共享目標)就能很好的解決這個問題,共享庫這個目標模組在執行或載入時,可以載入到任意的記憶體位址,並和乙個在記憶體中的程式鏈結起來。這個過程被稱為動態鏈結

特點:所有引用該庫的可執行檔案共享這個.so檔案中的**和資料。

在記憶體中乙個共享庫的.text節的乙個副本可以被不同的正在執行的程序共享。

/* addvec.c */

/* $begin addvec */

int addcnt = 0;

void addvec(int *x, int *y,

int *z, int n)

/* $end addvec */

/* multvec.c */

/* $begin multvec */

int multcnt = 0;

void multvec(int *x, int *y,

int *z, int n)

/* $end multvec */

/* main2.c */

/* $begin main2 */

#include

#include "vector.h"

int x[2]=;

int y[2]=;

int z[2]

;int main(

)/* $end main2 */

/*vector.h*/

/* prototypes for libvector */

void addvec(int *x, int *y, int *z, int n)

;void multvec(int *x, int *y, int *z, int n)

;int getcount(

);

建立這個向量例程的共享庫libvector.so:gcc -shared -fpic -o libvector.so addvec.c multvec.c建立可執行檔案prog2l時只是建立部分鏈結的可執行檔案,鏈結器複製了一些重定位和符號表資訊

(./prog2l:載入器將可執行檔案的**和資料從磁碟複製到記憶體並執行,這個過程叫載入。)

prog2l檔案在執行時可以和libvector.so鏈結,在程式載入時,動態完成鏈結過程。此時,沒有任何libvector.so的**和資料節真的被複製到可執行檔案prog2l中,而是執行時會解析對libvector.so中**和資料的引用。

鏈結 靜態庫 共享庫

編譯器生成可重定位目標檔案 o 鏈結器,將不同的可重定位檔案,進行符號解析,重定位等操作。鏈結到一起。生成最終的可執行檔案。編譯器生成的目標檔案,從位址0開始。重定位操作,將不同的模組中的位址,與最終記憶體位址對應。將庫檔案拷貝,嵌入可執行檔案中。鏈結發生在編譯期間,程式執行之前。生成的最終程式中,...

鏈結詳解 共享庫

組成共享庫的目標檔案和一般目標檔案有所不同,在編譯時要加 fpic選項 生成與位置無關 position independent code gcc c fpic stack stack.c stack push.c stack pop.c stack is empty.c 製作共享庫 gcc sha...

共享庫 動態庫

動態庫的命名規則 lib 庫的名字 so libmyname.so 動態庫的建立和使用 共享庫 步驟一 生成對應的.o檔案 c o gcc fpic c c i include 生成與位置無關的.o檔案 fpic 與位置無關 步驟二 將生成的.o檔案打包成動態庫.so檔案 gcc shared o ...