ELF檔案動態鏈結時 GOT,PLT 的變化過程

2021-06-08 20:54:26 字數 1190 閱讀 5311

intel平台下linux中elf檔案動態鏈結的載入、解析及例項分析(一): 載入

intel平台下linux中elf檔案動態鏈結的載入、解析及例項分析(二): 函式解析與解除安裝

最後我們討論elf檔案的動態連線機制。每乙個外部定義的符號在全域性偏移表 (global offset table got)中有相應的條目,如果符號是函式則在過程連線表(procedure linkage table plt)中也有相應的條目,且乙個plt條目對應乙個got條目。對外部定義函式解析可能是整個elf檔案規範中最複雜的,下面是函式符號解析過程的乙個 描述。

1:**中呼叫外部函式func,語句形式為call 0xaabbccdd,位址0xaabbccdd實際上就是符號func在plt表中對應的條目位址(假設位址為標號.plt2)。

2:plt表的形式如下

.plt0: pushl   4(%ebx)    /* got表的位址儲存在暫存器ebx中 */

jmp     *8(%ebx)

nop; nop

nop; nop

.plt1: jmp     *name1@got(%ebx)

pushl   $offset

jmp     .plt0@pc

.plt2: jmp     *func@got(%ebx)

pushl   $offset

jmp     .plt0@pc

3:檢視標號.plt2的語句,實際上是跳轉到符號func在got表中對應的條目。

4:在符號沒有重定位前,got表中此符號對應的位址為標號.plt2的下一條語句,即是pushl $offset,其中$offset是符號func的重定位偏移量。注意到這是乙個二次跳轉。

5:在符號func的重定位偏移量壓棧後,控制跳到plt表的第一條目(.plt0),把got[1]的內容

(放置了用來標識特定庫的**)

壓棧,並跳轉到got[2]對應的位址。

6:got[2]對應的實際上是動態符號解析函式的**,在對符號func的位址解析後,會把func在記憶體中的位址設定到got表中此符號對應的條目中。

動態連線是比較複雜的,但為了獲得靈活性的代價通常就是複雜性。其最終目的是把got表中條目的值修改為符號的真實位址,這也可解釋節.got包含在可讀可寫段中。

ELF動態鏈結

在現代的linux 系統中,假設乙個普通的程式會使用到 c語言靜態庫至少 1mb以上,那麼,如果我們的機器執行 100個這樣的程式,就用浪費近 100mb 的記憶體 如果磁碟有 2000 個這樣的程式,就要浪費 2gb的記憶體。靜態鏈結對程式的更新 發布等也會帶來問題。比如程式program1 使用...

ELF檔案的鏈結和裝載

elf的全稱是可執行可鏈結的格式 符號表的symtab,對應的字串可以在strtab找到 重要的頭有3個elf頭 首部的固定位元組長度 程式表頭 program table header 一般緊鄰elf頭後面,節表頭 section header table 一般對於可執行檔案僅僅借助程式表頭就能想...

IDA 動態除錯 ELF 檔案

01 ida 遠端除錯配置 配置方法和 windows 相同 bin bash cd home ubuntu ida dbgsrv linux server cd home ubuntu re tools ida idaq 執行 demo 02 ida 動態除錯 單步步入 f7 遇到函式,將進入函式...