《深入理解計算機系統》 鏈結

2021-09-29 10:29:34 字數 2695 閱讀 3619

一.原始檔到目標檔案的轉化過程

(1)過程

預處理—編譯—彙編—鏈結

(2)圖示及解析

預處理階段:預處理器(cpp)根據以字元#開頭的命令,修改原始的c程式。結果就得到另外乙個c程式,通常是以.i作為副檔名。即.c檔案轉化為.i檔案的過程。

編譯階段:編譯器(ccl)將文字檔案.i翻譯成文字檔案.s,它包含乙個組合語言程式。即.i檔案轉化為.s檔案的過程。

彙編階段:彙編器(as)將.s翻譯成機器語言指令,把這些指令打包成一種叫做可重定位目標程式 的格式,並將結果儲存在目標檔案.o中,.o檔案是乙個二進位制檔案。即.s檔案轉化為.o檔案的過程。

鏈結階段:鏈結器(ld)將.o檔案及一些必要的系統目標檔案組合起來,建立乙個可執行目標檔案 ,可以被載入到記憶體中,由系統執行。

二.目標檔案

1.目標檔案的三種形式

2.可重定位目標檔案

三.鏈結器的主要任務

1.符號解析

(1)符號和符號表

由模組m定義並能被其他模組引用的全域性符號。全域性鏈結器符號對應於非靜態c函式 和全域性變數。

由其他模組定義並被模組m引用的全域性符號。其稱為外部符號,對應於其他模組中定義的非靜態c函式和全域性變數。

只被模組m定義和引用的區域性符號。對應於帶static屬性的c函式和全域性變數,這些符號在模組m中的任何位置都可見,但不能被其他模組引用。

(2)全域性符號的強弱性

強符號:函式名和已初始化的全域性變數名。

弱符號:未初始化的全域性變數名。

(3)鏈結器對符號解析的規則

rule1:不允許有多個同名的強符號

rule2:如果有乙個強符號和多個弱符號同名,那麼選擇強符號。

rule3:如果有多個弱符號同名,那麼從這些弱符號中任意選擇乙個。

(4)多重定義全域性符號的問題

2.重定位

重定位的過程

四.例題解析

解析:選b。xp是符號的定義,x是符號的引用。該題主要是考查符號的定義和引用。

解析:選a。該題中變數x在m1.c中為強符號,在m2.c中為弱符號。在呼叫p1函式後,x處原來存放的100被替換,-1.0的double型別表示為1 0111 1111 111 00…0,十六進製制表示為bff0 0000 0000 0000。因為x、y和z都是初始化變數,同在.data節中,鏈結後空間被分配在一起,x佔4b,隨後y和z各佔2b。因為ia-32為小端方式,所以,x的機器數為全0,y的機器數也為全0,z的機器數為bff0h。執行printf函式後x=0, z=-(214+24)=-16400。

解析:選d。重定位最後一步是對引用處的位址進行重定位,重定位的方式有多種,只有絕對位址方式才是將引用處的位址修改為與之關聯(繫結)的定義處的首位址,而對於其他重定位方式,就不一定是這樣,例如,對於pc相對位址方式,引用處填寫的是乙個相對位址。

解析:選d。a、因為「int *bufp1 = &buf[1];」是乙個宣告,也即是對變數bufp1的資料型別的定義和初始化,因此這個需要重定位的初始化值將被儲存在.date節中,因而重定位條目在.rel.data節中,並且是繫結buf的乙個引用,即引用buf的乙個重定位條目。 b、因為buf有2個陣列元素,每個元素佔4b,因此bufp1的位址為0x8048930+8=0x8048938,重定位時與引用繫結的符號是buf,即繫結的是&buf[0],而真正賦給bufp1的是&buf[1],引用的位址和繫結的位址相差4,所以重定位前的內容為十六進製制數04 00 00 00。 c、可執行檔案已經進行了重定位,所以,bufp1所在的位址0x8048938處,應該是重定位後的值,顯然應該是buf[1]的位址。重定位時通過初始值加上buf的值得到,即4+0x8048930=0x8048934,小端方式下,4個位元組分別為34h、89h、04h、08h。 d、在重定位條目中只有對buf的引用,沒有對bufp1的引用,這裡bufp1是乙個定義。

注:此文章參考書目《深入理解計算機系統》和南京大學袁春風老師的網課而寫,和習題均來自袁老師的網課ppt和課後練習。此文主要為了整合《深入理解計算機系統》第7章鏈結的知識點,為方便自己日後較系統地複習知識點,也希望能對需要的人有幫助。如有出入的地方,還請大家多指教!

深入理解計算機系統 鏈結

鏈結 1.1 符號解析 將每個符號引用剛好和乙個符號定義聯絡起來。主要是解析外部符號,在編譯時,編譯器向彙編器輸出每個全域性符號,或者是強或者是弱,函式和已經初始化的全域性變數時強符號,未初始化的全域性變數時弱符號,如果出現多重的全域性符號,聯結器會採取相應的策略,具體為 不允許出現多個強符號 有乙...

深入理解計算機系統

關鍵路徑是在迴圈的反覆執行中形成的資料相關鏈。迴圈展開是一種程式變換,通過增加每次迭代計算的元素的數量,減少迴圈的迭代次數。重新結合變換能夠減少計算中關鍵路徑上操作的數量,通過更好地利用功能單元的流水線能力得到更好的效能。浮點運算不保證是可結合的,通常迴圈展開和並行地累積在多個值中,是提高程式效能的...

《深入理解計算機系統》

知乎 深入理解計算機系統 這本書需要什麼水平能看懂?15 213 18 218 15 513 introduction to computer systems schedule fall 2016 鏈結失效則 cmu15 213的課程主頁,有ppt,還有錄影,主講人就是這本書的作者。備註 備註 詳細...