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。並且重新發佈給使用者。
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言