SLP(Chapter 13):鏈接和鏈接器

Why 學習鏈接器和加載器?

  • 構建大型程序
  • 避免危險的程序錯誤
  • 瞭解如何實現作用域
  • 全面瞭解計算機系統
  • 學會利用共享庫

1 鏈接和鏈接器 基礎知識

程序時間消耗 = 編譯 + 鏈接 + 加載 + 運行
在這裏插入圖片描述
鏈接器比彙編器、編譯器更早被髮明、使用,即更古老

鏈接器的功能

鏈接器
可重定位的對象文件,包括引用的函數庫
可執行的目標文件

在這裏插入圖片描述
鏈接包含的過程:

  1. Symbol Resolution 符號解析
  2. Combination 聚合
  3. 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
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

具體格式

coff

部分 存儲內容 example
Header 文件屬性
文件格式?段數?是否可執行?靜態鏈接還是動態鏈接?起始地址?操作系統(可選_對齊方式,,如段對齊、文件對齊_)
headeroption
Section塊 內容
.text | .data | .bss
.strtab | .shstrtab
Line, Debug
.symtab | Relocation (Rel.text & Rel.data)
在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述
Section header table 塊表
塊名稱、長度、文件偏移量、只讀 /讀寫
section table

3 符號解析和重新定位

0. 複習

0.1 鏈接包含的過程:

  1. Symbol Resolution 符號解析
  2. Combination 聚合
  3. Relocation 重定位

0.2 Definition V.S. Declare V.S. Reference ?

類型 例子
數據 在這裏插入圖片描述
代碼 在這裏插入圖片描述

?0.3 static keyword: storage and linkage (存儲域和作用域)

static

符號解析(符號表)

目的:根據符號表 symtab 將每個符號引用與其定義關聯
在這裏插入圖片描述
三類符號:

  • 全局符號 Global symbol
    • 強符號Strong symbol(函數名稱、初始化全局變量)
    • 弱符號Weak symbol(未初始化的全局變量)
    • global
    • 規則:
      1. 強符號之間不能重名
      2. 當強符號與弱符號重名,選強符號
      3. 弱符號重名,任意選
  • 外部符號 External symbol
  • 局部符號 Local symbol

符號重定位(重定位表)

用於:修改引用對應的內存位置。
在這裏插入圖片描述
在這裏插入圖片描述

4 加載和加載器簡介

功能

在這裏插入圖片描述
在這裏插入圖片描述

怎麼使用加載器?
windows:Cmd、CreateProcess()
Linux :Shell、execve()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章