Why 學習鏈接器和加載器?
- 構建大型程序
- 避免危險的程序錯誤
- 瞭解如何實現作用域
- 全面瞭解計算機系統
- 學會利用共享庫
1 鏈接和鏈接器 基礎知識
程序時間消耗 = 編譯 + 鏈接 + 加載 + 運行
鏈接器比彙編器、編譯器更早被髮明、使用,即更古老
鏈接器的功能
鏈接包含的過程:
- Symbol Resolution 符號解析
- Combination 聚合
- Relocation 重定位
什麼時候鏈接?
靜態鏈接(編譯後)
動態鏈接(轉載、運行時)
2 Object file format 對象文件格式
簡介
爲什麼我們把代碼和數據分成不同的部分?
- 保護代碼
- 提高捕獲命中率
- 共享內存
Name | Full Name | OS | e.g. | View Too |
---|---|---|---|---|
ELF | Executable And Linkable | Linux | .o / .so | objdump/readelf |
PE | Portable Executable | Windows | .exe/.dll/.ocx/.sys/.com | PETool |
COFF | Common file format | .obj | objdump/dumpbin |
Type | Mean | Linux | Windows |
---|---|---|---|
可重定位文件 Relocatable File | 包含適合於與其他目標文件鏈接來創建可執行文件或者共享目標文件的代碼和數據 | .o | .obj |
可執行文件 Executable File | 包含適合於執行的一個程序,此文件規定了exec()如何創建一個程序的進程映像 | /bin/bash文件 | .exe |
共享目標文件 Shared Object File | 包含可在兩種上下文中鏈接的代碼和數據。首先鏈接編輯器可以將它和其它可重定位文件和共享目標文件一起處理,生成另外一個目標文件。其次,動態鏈接器(Dynamic Linker)可能將它與某個可執行文件以及其它共享目標一起組合,創建進程映像。 | .so | .dll |
作者:jdzhangxin
鏈接:https://www.jianshu.com/p/9884c8823712
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
具體格式
部分 | 存儲內容 | example |
---|---|---|
Header | 文件屬性 文件格式?段數?是否可執行?靜態鏈接還是動態鏈接?起始地址?操作系統(可選_對齊方式,,如段對齊、文件對齊_) |
|
Section塊 | 內容 .text | .data | .bss .strtab | .shstrtab Line, Debug .symtab | Relocation (Rel.text & Rel.data) |
|
Section header table | 塊表 塊名稱、長度、文件偏移量、只讀 /讀寫 |
3 符號解析和重新定位
0. 複習
0.1 鏈接包含的過程:
- Symbol Resolution 符號解析
- Combination 聚合
- Relocation 重定位
0.2 Definition V.S. Declare V.S. Reference ?
類型 | 例子 |
---|---|
數據 | |
代碼 |
?0.3 static keyword: storage and linkage (存儲域和作用域)
符號解析(符號表)
目的:根據符號表 symtab 將每個符號引用與其定義關聯
三類符號:
- 全局符號 Global symbol
- 強符號Strong symbol(函數名稱、初始化全局變量)
- 弱符號Weak symbol(未初始化的全局變量)
- 規則:
- 強符號之間不能重名
- 當強符號與弱符號重名,選強符號
- 弱符號重名,任意選
- 外部符號 External symbol
- 局部符號 Local symbol
符號重定位(重定位表)
用於:修改引用對應的內存位置。
4 加載和加載器簡介
功能
怎麼使用加載器?
windows:Cmd、CreateProcess()
Linux :Shell、execve()