深入理解電腦系統結構——連結

來源:互聯網
上載者:User

標籤:

連結是將各種各樣代碼和資料部門收集起來並組合成為一個單一檔案的過程,這個檔案可被載入(或被拷貝)到儲存空間並執行。連結可以執行於編譯時間,也就是在原始碼被翻譯成機器代碼時;也可執行於載入時,也就是在程式被載入器載入的儲存空間並執行時;甚至執行於運行時,由應用程式來執行。

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 靜態連結

 

深入理解電腦系統結構——連結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.