以下內容為《找出所有引用的外部模組並鏈結起來,這些外部模組或函式庫一般來自於開發者,作業系統和c執行庫。
鏈結程式取出這些函式庫,修訂指標位置(重定位),並交叉引用模組中的符號解析,最終產生乙個可執行模組。符號可以是全域性的也可以是區域性的。全域性符號可以在模組內部定義,或由另一模組外部引用。
靜態庫是在鏈結時被找到並複製的,而動態庫和共享庫是在執行時才裝載的,並讓所有的程序共享。linux提供的系統呼叫dlopen(),dlsym(),dlclose(),用於載入/開啟共享庫,查詢庫中的符號,然後關閉共享庫
可執行elf目標檔案包括:elf頭,程式頭表(用於載入的節),第1節,第2節。。。。節頭表(可選)
typedef struct elf32_hdr elf32_ehdr;
typedef struct elf32_shdr elf32_shdr;
bss 為初始化的資料
.data 已初始化的資料
.hash 符號雜湊表
.init 初始化**
.symtab 符號表
.text 可執行的指令
.plt 過程鏈結表
.rodata 唯讀資料
.dynamic 動態鏈結資訊
等等
typedef struct elf64_phdr elf64_phdr;
1. 將可執行檔案的段加入記憶體
2. 載入所有需要的共享庫
3. 需要時重定向可執行檔案及其共享物件
4. 將控制權交給程式
二進位制詳解
在計算機的世界裡,只有0和1,也就是二進位制。那如何把乙個十進位制的數轉成二進位制或者其他進製,請下圖 十進位制轉二進位制 十進位制的123轉成二進位制就是1111011,轉成幾進製都是乙個道理。一 二進位制 1.1 二進位制是計算機採用的表示數字的方式,每個數字上只有0和1 1.2 任何整數一定可...
Linux系統ELF檔案二進位制格式分析 二
本文接著 linux系統elf檔案二進位制格式分析 一 繼續分析elf檔案格式 二 程式頭表 程式頭表由幾個項組成,結構類似於陣列,項數記錄在elf檔案頭的e phnum欄位,各項有統一的結構,每個項都描述了乙個段的資訊。1.資料結構 typedef struct elf32 phdrelf32 p...
Linux系統ELF檔案二進位制格式分析 四
六 重定位項 重定位是將elf檔案中未定義的符號關聯到有效位置的過程,特別是目標檔案中這一項尤為重要。本例中引用了c語言庫函式printf和exit,鏈結時必須替換為該程序的虛擬位址空間中機器 所在位置。每個elf中,都有專門的型別為rel的節包含重定位項,標識了需要進行重定位的位置。每一項都是用相...