深入理解計算機系統 鏈結

2022-08-21 17:09:10 字數 1328 閱讀 6294

鏈結

1.1、符號解析:將每個符號引用剛好和乙個符號定義聯絡起來。 

主要是解析外部符號,在編譯時,編譯器向彙編器輸出每個全域性符號,或者是強或者是弱,函式和已經初始化的全域性變數時強符號,未初始化的全域性變數時弱符號,如果出現多重的全域性符號,聯結器會採取相應的策略,具體為:不允許出現多個強符號;有乙個強多個弱,選強;多個弱,任意選擇。

解析過程:在連線時,聯結器維持乙個可重定位目標檔案集合、乙個為解析符號集合和乙個已定義符號集合,初始時全為空,然後依次解析命令列上的輸入檔案,將內容填入上述三個表,在對靜態庫進行解析時,聯結器只拷貝被程式引用的目標模組,全部解析完之後,如果還有為解析的符號則報錯。但是這種解析時有順序的,定義一定要在引用之後,負責,定義在前,引用還是無法解析,最好報錯。

在完成符號解析之後,進行重定位,包括兩部:重定位節和符號定義(主要是將不同模組的相同節合併到乙個節,重定位需要重定位的**或資料),重定位節中的引用。

2、目標檔案:可重定位目標檔案、可執行目標檔案、共享目標檔案。

2.1、可重定位目標檔案:比如

.o,每個可重定位目標檔案都有乙個頭部,記錄該目標檔案的資訊,包括**、唯讀資料、已初始化的全域性變數、未初始化的全域性變數、符號表(函式和全域性變數,不包含對應於本地非靜態程式變數的任何符號)、可重定位的**、可重定位的已初始化資料、除錯表、原始檔行號與**的對映表。

符號和符號表:自己定義被其他模組引用、外部符號和本地符號。

2.2、可執行檔案:可執行檔案是乙個二進位制檔案,而且包括引導程式到儲存器並執行它所需的所有資訊。可執行檔案的頭部與重定向目標檔案的頭部類似,少了需要重定位的**和資料,多了入口點。執行可執行檔案時,載入器將該可執行檔案拷貝到記憶體中,並分配一塊程序區間,從上往下依次為使用者棧(

push

位址降低)、共享庫的儲存器對映區域、堆(

new位址增大)、讀寫段(資料段)、唯讀段(**段),位址時有高到底的。

2.3、共享庫:採用靜態庫,需要將庫中的內容拷貝到新生成的可執行檔案,增大可執行檔案的大小,採用共享庫只需將一些定位和符號資訊拷貝到可執行檔案,在實際執行時,動態呼叫符號定義,因此執行時必須指定共享庫的位置。

3、處理目標檔案的工具:

ar:建立靜態庫,插入、刪除、列出和提取成員。

strings:

列出乙個目標檔案中所有可列印的字串。

strip:

從目標檔案中刪除符號表資訊。

nm:列出乙個目標檔案中符號表定義的符號。

size:

列出目標檔案中節的名字和大小。

readelf:

能夠顯示乙個目標檔案的所有資訊。

objdump:

反彙編ldd

:列出乙個可執行檔案執行時需要的共享庫。

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

一.原始檔到目標檔案的轉化過程 1 過程 預處理 編譯 彙編 鏈結 2 圖示及解析 預處理階段 預處理器 cpp 根據以字元 開頭的命令,修改原始的c程式。結果就得到另外乙個c程式,通常是以.i作為副檔名。即.c檔案轉化為.i檔案的過程。編譯階段 編譯器 ccl 將文字檔案.i翻譯成文字檔案.s,它...

深入理解計算機系統

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

《深入理解計算機系統》

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