2011年10月26日 星期三

Static Linking(靜態連結)


Linking : Linker把多個Obj檔加工合併成一個Output檔

方法有下列兩種

1. 依序累加: 把Input的Obj檔依照次序合併起來
             Output檔依序為ObjA的.text .data .bss section
             接下來放ObjB的.text .data .bss section,以此類推

   缺點: 浪費空間,以x86來說最小的page為4096bytes
             有可能ObjA和ObjB的.text section加起來小於一個page
             但是使用此方法卻必須放在兩個不同的page

2. 相似區段合併:
                 把所有Obj檔的.text合併到輸出檔的.text section
                 依序合併.data、.bss這些section
                 目前static linking採用此方法

目前gcc Linker使用一種叫Two-pass Linking的方法,整個Linking過程分兩步驟


1. 分配空間和位置: 先掃描一遍所有的Obj檔,計算出各個section所需要
                   配置的空間大小以及虛擬位置(VMA)

2. 符號解析和重定(relocation) : 對所有使用到的Symbol做調整以及relocation

一般來說,如果我們使用到一些外部變數或是函式。在編譯的時候Compiler由於
還不知道這些變數和函數的位置,因此會先填一個假的位置到產生出來的指令中
當Linker做Linking的時候,就會去對這些假位置做調整並且換成正確的位置
這個動作叫做Relocation


重定表: 紀錄哪些指令需要被調整的一張table,可以重定的ELF檔中都會有一份table


Static Linking有下列缺點

1. 空間浪費: 每個程式內部都會有printf()、scanf()這些函式
2. 更新困難: 假如要更新某個lib檔,必須要對所有使用到這個lib檔
             的程式重新Link。並且重新發佈給使用者。

沒有留言:

張貼留言