標籤:
連結是將各種各樣代碼和資料部門收集起來並組合成為一個單一檔案的過程,這個檔案可被載入(或被拷貝)到儲存空間並執行。連結可以執行於編譯時間,也就是在原始碼被翻譯成機器代碼時;也可執行於載入時,也就是在程式被載入器載入的儲存空間並執行時;甚至執行於運行時,由應用程式來執行。
1 編譯器驅動程式
考慮如下的兩個源檔案:main.c和swap.c。
main.c
void swap();int buf[2]={1,2};int main(){ swap(); return 0;}
swap.c
extern int buf[];int *bufp0=buf;int *bufp1;void swap(){ int temp; bufp1=&buf[1]; temp=*bufp0; *bufp0=*bufp1; *bufp1=temp;}
大多數編譯系統提供編譯驅動程式,它代表使用者在需要時調用語言前置處理器、編譯器、彙編器和連結器。
例如:
gcc -02 -g --o p main.c swap.c
驅動程式首先調用C前置處理器(cpp),它將C來源程式main.c翻譯成一個中間檔案main.i:
cpp [other arguments] main.c /tmp/main.i
接下來,驅動程式運行C編譯器(cc1),它將main.i翻譯成一個組合語言檔案main.s
cc1 /tmp/main.i main.c -02 [other arguments] -o /tmp/main.s
然後,驅動程式彙編器(as),它將main.s翻譯成一個可重定位目標檔案main.o:
as [other arguments] -o /tmp/main.o /tmp/main.s
驅動程式經過相同的過程產生swap.o。最後,它運行連結器程式ld,將main.o和swap.o以及一些必要的系統目標檔案組合起來,建立一個可執行目標檔案p:
ld -o p [system object files and args] /tmp/main.o /tmp/swap.o
要運行可執行檔p,我們只需要輸入 ./p
外殼叫用作業系統中一個叫做載入器的函數,它拷貝可執行檔p中的代碼和資料到儲存空間,然後將控制轉移到這個程式的開頭。
2 靜態連結
深入理解電腦系統結構——連結