動態鏈結過程

2022-08-22 13:27:09 字數 700 閱讀 9418

最近學習了elf檔案的格式,重點關注了動態鏈結過程中的使用到的section

第一步程式在載入時,會把直譯器程式加入到.interp段。可以解決動態庫和可執行檔案的載入。

一般來講程式的載入方式是懶啟動,lazy;除非指定了ld_bind_now環境變數非0,那麼在程式啟動時就會把外部符號位址全部載入完成。

當遇到還未載入的符號時,比如printf,出在libc中。

呼叫malloc

0x080484d8 <+24>:    e8 63 fe ff ff  call   0x8048340

此處是跳轉到*0x804a004中的內容指定的位址,這個指標位址是處於.got.plt段的,如果是第一次呼叫,那麼.got.plt表中儲存的是0x8048346,就是plt段的下一句話,這時候會壓入乙個offset,這個8,這個8是這個符號在所對應的重定位表中的偏移量,找到重定位表中的這個符號,這個符號有乙個32位的標誌,裡面有符號表中的資訊,接著找到符號表中的符號。以上這些從重定位表開始的操作都應該是由ld這個庫裡面的函式裡完成的。

0x08048340 <+0>: jmp *0x804a004

0x08048346 <+6>: push $0x8

0x0804834b <+11>: jmp 0x8048320

實際上這個偏移量8對應的就是位址0x804a004,ld將會找到正確的位址賦給指標0x804a004。

編譯鏈結過程

在談編譯鏈結過程之前我們需要了解一下虛擬位址空間以及程式在編譯鏈結過程時經過了什麼步驟。虛擬位址空間之前在程序空間的部落格中詳細介紹過了,詳見 上圖就是32位系統中4g虛擬位址空間的分布情況 text 段 指令段,存放的是指令 在程式中,我們把區域性變數定義 區域性變數的 定義是指令而不是資料 還有...

linux下ELF的動態鏈結過程

先列出書中乙個例子的簡單 實現,以展示動態鏈結過程。lib.h ifndef lib h define lib h void foobar int i endif lib.c includevoid foobar int i program1.c include lib.h int main pro...

編譯鏈結過程(一)

什麼是編譯?什麼是鏈結?為什麼需要編譯和鏈結?在很久以前,計算機發展的初期,還在用機器語言編寫程式,量比較少時是不需要編譯和鏈結的。因為當時的程式設計師直接編寫機器碼讓計算機執行。每種cpu的指令是不相同的,所以每乙個程式要換一台不同cpu的機器上執行時,需要重新寫程式,而且機器語言 涉及很多計算機...