動態庫和靜態庫

2021-07-11 09:08:04 字數 1244 閱讀 9021

簡單的說,使用動態庫就是在鏈結的時候,不會將動態庫的**鏈結到可執行檔案中,而是採用symbol的方式。

使用靜態庫,生成可執行檔案的時候,會將靜態庫的**鏈結到可執行檔案中。這樣,動態庫體積會很小,並且可以,依賴於更新的動態庫,但是,缺點是不穩定。靜態庫會更加穩定,但是體積會很大。

靜態庫 : 就是多個目標檔案的合併;

動態庫:  生成和run time load 會比較複雜:

1、 load time relocation   (gcc 預設)

2、 position independent code  (-fpic)

動態庫與可執行檔案不同的地方時,(由於虛擬記憶體的存在)

可執行檔案連線之後,會有確定的load address ,所以程式中的指令的位址都確定(虛擬位址,實體地址當然不確定)。

1、 load time relocation:

在可執行檔案中,有乙個.relocation 段中,存放的是各使用的變數的資訊,(變數出現位置, 變數儲存的偏移位址, 變數名)

$ readelf -r libmlreloc.so

relocation section '.rel.dyn' at offset 0x2fc contains 7 entries:

offset info type sym.value sym. name

00002008 00000008 r_386_relative

00000470 00000401 r_386_32 0000200c myglob

00000478 00000401 r_386_32 0000200c myglob

0000047d 00000401 r_386_32 0000200c myglob

[...] skipping stuff

在load time的時候,dynamic linker 會查這個表,將每乙個出現的變數,都換為實際的虛擬位址。這樣,任務就完成了。

問題:   如果多個程序共享同乙個.so時,由於**上已經是實際執行的虛擬位址,所以,就不能同時供多個程序共享。

2、  position independent code

將**中需要用到的位址寫為乙個表的位址,這個表存放的是實際變數,或者函式的位址(函式和變數的實際方法不一樣),而這個表存放在資料段。

所以,如果多個程序共享同乙個.so也沒有問題,因為,他們的**是一樣的,只是資料段不同而已。

動態庫和靜態庫

本文主要解決以下幾個問題 1 為什麼要使用庫?2 庫的分類 3 建立自己的庫 或許大家對自己初學linux時的情形仍記憶尤新吧。如果沒有乙個能較好的解決依賴關係的包管理器,在linux下安裝軟體將是一件及其痛苦的工作。你裝a包時,可能會提示你要先裝b包,當你費盡心力找到b包時,可能又會提示你要先安裝...

動態庫和靜態庫

先抄一段 windows下的動態庫和靜態庫區別解釋,其實linux下意義一樣的,不過字尾名有些區別 靜態庫 在編譯的時候載入生成目標檔案,在執行時不用載入庫,在執行時對庫沒有依賴性。動態庫 在目標檔案執行時載入,手動載入,且對庫有依賴性。兩者區別 一,靜態庫的使用需要 1 包含乙個對應的標頭檔案告知...

動態庫和靜態庫

靜態庫和動態庫 二進位制級別的 復用 封裝函式或類,供程式呼叫,是二進位制檔案,最多只能被反編譯成彙編 動態庫 dynamic link library,動態鏈結庫或共享庫 shared object 只是把要鏈結的動態庫的相關資訊 名字,符號表等 嵌入到可執行檔案中去,在執行時呼叫相應的動態庫。動...