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