場合:函數
編譯時:即源代碼被翻譯成機器代碼 加載時:程序被加載器加載到存儲器並執行 運行時
做用:翻譯
使得分離編譯成爲可能(將大型應用程序分解爲若干個小模塊)
編譯驅動程序表明用戶調用語言預處理器、編譯器、彙編器和連接器 1. 預處理器將.c文件翻譯成ASCII碼中間文件.i 2. 編譯器將.i文件翻譯成ASCII碼彙編語言文件.s 3. 彙編器將.s文件翻譯成可重定位目標文件.o 4. 連接器程序將.o文件以及一些必要的文件組合起來建立一個可執行目標文件 5. 加載器拷貝可執行文件代碼和數據到存儲器而後將控制轉移到程序頭3d
目標文件的三種格式:code
可重定位目標文件blog
2.可執行目標文件編譯器
- ELF頭部:描述整體格式,包括程序的入口點也就是程序運行的時候要執行的第一條指令 - 段頭部表:描述可執行文件連續片和存儲器段的映射關係 - 其餘
3.共享目標文件(特殊的可重定位目標文件)博客
連接器的兩個主要任務編譯
-符號解析:將每一個符號引用恰好和一個符號定義聯繫起來 - 重定位:連接器經過把每一個符號定義與一個存儲器位置聯繫起來
對於全局符號的解析變量
對於多重定義的全局符號:打包
函數和已經初始化的全局變量是強符號,未初始化的全局變量是弱符號 規則: 不容許有多個強符號 若是有一個強符號和多個弱符號,那麼選擇強符號 若是有多個弱符號,那麼從其中任選一個
重定位由兩個步驟組成
優勢:
這一章是上學期學過的連接,仍是比較熟悉的,可是由於某些緣由,書已經不在身邊了,因此借鑑的劉蔚然學霸的博客。雖然借鑑的有點多,但我至少複習透了。