建立自定義的靜態庫:
使用如下命令建立所需庫檔案libvector.a:
$gcc -c addvec.c multvec.c
$ar rcs libvector.a addvec.o multvec.o
可以用如下命令檢視庫檔案內容:
用main2.c呼叫靜態庫中的函式,其中vector.h是函式宣告。
$gcc -c main2.c
$gcc -static -o p2 main2.o ./libvector.a
1 /* main2.c */
2 #include
3 #include "vector.h"
45int x[2] = ;
6int y[2] = ;
7 int z[2];
89 int main()10
符號表:
通過objdump的-r選項可以顯示出main2.o含有哪些需重定位的部分:
objdump -d p2顯示重定位後的內容(可結合前述符號表檢視重定位是否前後一致):
重定位型別主要有兩種,即結構體elf32_rel中成員變數r_info取值有兩個:r_386_32和r_386_pc32
(1)r_386_32: 絕對位址
(2)r_386_pc32: 相對位址(相對於pc)
重定位演算法如下:
動態鏈結 靜態鏈結
在linux系統中,ld鏈結器將彙編器編譯出來的目標檔案和靜態庫里的.a檔案鏈結生成可執行檔案。靜態庫中的.a檔案的 會在靜態鏈結過程中新增到可執行檔案中,可執行檔案會變得很大。與靜態鏈結不同,linux系統的ld鏈結器會將動態庫.so檔案進行符號重定位生成可執行檔案,動態庫.so檔案並不新增到可執...
靜態鏈結 動態鏈結
如果函式庫的乙份拷貝是可執行檔案的物理組成部分,那麼我們稱之為靜態鏈結。如果可執行檔案只是包含了檔名,讓載入器在執行時能夠尋找程式所需的函式庫,那麼稱為動態鏈結。即根據函式庫是不是可執行檔案的組成部分區分靜態鏈結和動態鏈結。1 可執行檔案的體積小。2 雖然執行速度稍慢,但是能更加有效的利用磁碟空間,...
靜態鏈結 動態鏈結
所謂靜態 動態是指鏈結。回顧一下,將乙個程式編譯成可執行程式的步驟 圖 編譯過程 靜態庫之所以成為 靜態庫 是因為在鏈結階段,會將彙編生成的目標檔案.o與引用到的庫一起鏈結打包到可執行檔案中。因此對應的鏈結方式稱為靜態鏈結。試想一下,靜態庫與彙編生成的目標檔案一起鏈結為可執行檔案,那麼靜態庫必定跟....