程式設計師的自我修養 3 目標檔案有什麼》

2021-06-19 03:50:17 字數 1302 閱讀 3169

目標檔案的型別:可重定位檔案,可執行檔案,共享目標檔案,核心轉儲檔案。

.test:儲存的就是程式的**部分,除了資料段,.bss段,堆疊段等一般是存放在**段中。

.data:儲存的是那些已經初始化了的全域性靜態變數和區域性靜態變數。

.rodata段存放的是唯讀資料,一般是程式裡面的唯讀變數(如const修飾的變數)和字串常量。

.bss:存放的是未初始化的全域性變數和區域性靜態變數。

elf檔案組成:elf header + 各種段+section header table +string tables + symbol tables;

elf header:包含了整個檔案的基本屬性,入版本,機器型號,程式入口位址。

typedef struct elf32_ehdr;

section header table(段表):儲存了elf檔案中所有段的資訊,如段名,段長,在檔案中的偏移,讀寫許可權,以及段的其他屬性。

string tables:elf檔案中用到了字串《這裡的字串是變數名字或者段名字》,因為字串的長度是不定的。常見做法是放到乙個表中,然後用偏移量來引用字串。

symbol tables:在鏈結中,我們將函式和變數統稱為符號,函式名或者變數名稱為符號名。每個檔案都有相應的符號表,這個表記錄了目標檔案中所用到的全部符號。而這個用到指的是全域性符號(外部函式和變數)。

對於我們來說,最值得關注的就是全域性符號。因為鏈結過程只關注全域性符號的相互「粘合」,而區域性符號、段名、行號等都是次要的。

總結下elf檔案到底含有什麼:

1.elf檔案的頭,包含的機器的各種資訊;

2.各個段的頭部,包含的是各個段的大致的描述資訊;

3.各個段的資訊,即編譯後的源**;編譯器、鏈結器、裝載器都是依靠段表來定位和訪問各個段的屬性的。使用readelf工具來檢視elf檔案段的結構

4.全域性變數或者外部函式的符號表,而這個是連線的介面。這裡也是用乙個段來存放的。

5.字串表:elf檔案中用到了很多字串,如段名、變數名等,由於字串的長度往往不定,因此常把字串集中起來存放到乙個表,然後使用字串在表中的偏移來引用字串。一般字串在elf檔案中也以段的形式儲存,常見的段名如.strtab和.shstrtab。字串表(.strtab)儲存普通的字串,段表字串表(.shstrtab)儲存段表中用到的字串,最常見的就是段名。

6.重定位表:鏈結器在處理目標檔案時,需要對目標檔案中的某些部位進行重定位,即**段和資料段中的那些對絕對位置的引用的位置,如.rel.text就是針對.text段的重定位表,因為.text段中至少有乙個絕對位址的引用,那就是printf函式的呼叫。

程式設計師的自我修養 目標檔案

1.檔案頭 描述整個檔案的檔案的檔案屬性,包括檔案是否可執 行 是靜態鏈結還是動態鏈結及入口位址 可執行檔案 目標硬體 目標作業系統等資訊,檔案頭還包括乙個段表。段表其實就是乙個描述檔案中各個段的陣列,描述段在檔案中的偏移位置及段的屬性等。2.text段 編譯後執行語句都編譯成機器 儲存在該段。3....

程式設計師的自我修養 目標檔案裡有什麼

這一章主要講述目標檔案有哪幾個部分組成以及介紹組成部分。elf格式檔案有檔案頭和各個段組成。2.段 section sections 是在elf檔案裡頭,用以裝載內容資料的最小容器。在elf檔案裡面,每乙個 sections 內都裝載了性質屬性都一樣的內容。例如 1 text section 裡裝載...

學習程式設計師的自我修養之目標檔案

目標檔案中包含了編譯後的機器指令 資料和連線時所需的資訊,如符號表 除錯資訊 字串等。一般情況下,目標檔案都將這些資訊按不同的屬性,以節 section 或段 segment 的形式進行儲存。程式源 編譯後的機器指令經常被放在 段 code section 中,段的常見名有.code或.text。定...