鏈結 裝載與庫 目標檔案(3)

2021-07-31 05:28:29 字數 1846 閱讀 7605

*總結的速度,追不上看書的速度了。。。*

elf檔案的基本結構是什麼樣子?

elf目標檔案的最前部是elf檔案頭(elf header),其包含描述整個檔案的基本屬性,如elf檔案版本、目標機器型號、程式入口位址等。接著是各段。之後為段表(section header table),該錶描述了elf檔案包含的所有段的資訊,如短的段名、段的長度、在檔案中的偏移、讀寫許可權及段的其他屬性。

elf檔案頭中定義了elf魔數檔案機器位元組長度資料儲存方式、版本、執行平台、abi版本、elf重定位型別、硬體平台、硬體平台版本、入口位址程式頭入口和長度段表的位置和長度及段的數量。elf檔案頭結構及相關常數被定義在「/usr/include/elf.h」。

//32位檔案結構頭

typedef

struct

elf32_ehdr;

段表(section header table)儲存著段的基本屬性的結構,它描述了各段的資訊,如段的段名、段的長度、在檔案中的偏、讀寫許可權及段的其他屬性。段結構由段表決定,編譯器、聯結器依靠段表定位和訪問各段的屬性。段表的位置由檔案頭的」e_shoff「決定。

//段描述符結構

typedef

struct

elf32_shdr;

更複雜的elf檔案結構:

重定位表(relocation table),型別(sh_type)為」sht_rel「。鏈結器在處理目標檔案時,須要對目標檔案中的某些部位進行重定位,即**段和資料段中對絕對位址引用的位置。重定位資訊都記錄在重定位表中,每個須要重定位的段都會有乙個相應的重定位表。乙個重定位表同時也是elf的乙個段。

因為字串的長度是不固定的,所以常見的表示方法是把字串集中起來存放到乙個表,然後使用字串在表中的偏移來引用字串。在elf檔案中引用字串只須給出乙個數字下標即可,不用考慮字串長度的問題

一般字串表在elf檔案中以段的形式儲存,常見段字串表(string table)」.strtab「段表字串表(section header string table)」.shstrtab「。字串表儲存普通的字串,如符號的名字;段表字串表儲存段表中用到的字串,如段名(sh_name)

分析elf檔案頭,得到段表和段表字串表的位置,繼而解析整個elf檔案

*下次就是靜態鏈結了。。。link!*

鏈結 裝載與庫 目標檔案(1)

一直被催更。pc平台流行的可執行檔案格式 executable 主要為windows下的pe portableexecutable 和linux下的elf executable linkableformat 都是coff common file format 格式的變種。編譯器編譯源 後生成的目標檔...

裝載 鏈結與庫

第五部分 windows動態鏈結 1 dll函式和變數必須在檔案顯示是匯入還是匯出,declspec dllexport 匯出,declspec dllimport 匯入.建立dll檔案的時候.c檔案生成.dll,lib,exp檔案,然後用.lib檔案和exe中的.c檔案生成的目標檔案鏈結在一起,生...

鏈結 裝載與庫

鏈結 裝載與庫 在linux下,當我們使用 gcc來編譯 helloword 程式時,只需要 gcc hello.c a.out hello world 其中實際包括4步驟 預處理 prepressinng 編譯 compliation 彙編 assembly 鏈結 linking 1.預編譯 gc...