Linux下的ELF檔案格式簡介

2021-06-08 09:15:52 字數 2614 閱讀 2892

1. 概述

executable and linking format(elf)檔案是x86 linux系統下的一種常用目標檔案(object file)格式,有三種主要型別:

(1)適於連線的可重定位檔案(relocatable file),可與其它目標檔案一起建立可執行檔案和共享目標檔案。

(2)適於執行的可執行檔案(executable file),用於提供程式的程序映像,載入的記憶體執行。

(3)共享目標檔案(shared object file),聯結器可將它與其它可重定位檔案和共享目標檔案連線成其它的目標檔案,動態聯結器又可將它與可執行檔案和其它共享目標檔案結合起來建立乙個程序映像。

2. 檔案格式

為了方便和高效,elf檔案內容有兩個平行的視角:乙個是程式連線角度,另乙個是程式執行角度,如圖1所示。

elf header在檔案開始處描述了整個檔案的組織,section提供了目標檔案的各項資訊(如指令、資料、符號表、重定位資訊等),program header table指出怎樣建立程序映像,含有每個program header的入口,section header table包含每乙個section的入口,給出名字、大小等資訊。

圖1 3. 資料表示

elf資料編碼順序與機器相關,資料型別有六種,見表1。

4. elf檔案頭

象bmp、exe等檔案一樣,elf的檔案頭包含整個檔案的控制結構。它的定義如下:

#define ei_nident 16

typedef structelf32_ehdr;

其中e_ident的16個位元組標明是個elf檔案(7f+'e'+'l'+'f'+class +data+version+pad)。e_type表示檔案型別,2表示可執行檔案。e_machine說明機器類別,3表示386機器,8表示mips機器。e_entry給出程序開始的虛位址,即系統將控制轉移的位置。e_phoff指出program header table的檔案偏移,e_phentsize表示乙個program header表中的入口的長度(位元組數表示),e_phnum給出program header表中的入口數目。類似的,e_shoff,e_shentsize,e_shnum 分別表示section header表的檔案偏移,表中每個入口的的位元組數和入口數目。e_flags給出與處理器相關的標誌,e_ehsize給出elf檔案頭的長度(位元組數表示)。e_shstrndx表示section名錶的位置,指出在section header表中的索引。

下面有個elf檔案頭的例子,可以對照理解,見圖2。

圖2 5. section header

目標檔案的section header table可以定位所有的section,它是乙個elf32_shdr結構的陣列,section頭表的索引是這個陣列的下標。有些索引號是保留的,目標檔案不能使用這些特殊的索引。

section包含目標檔案除了elf檔案頭、程式頭表、section頭表的所有資訊,而且目標檔案section滿足幾個條件:

(1)目標檔案中的每個section都只有乙個section頭項描述,可以存在不指示任何section的section頭項。

(2)每個section在檔案中佔據一塊連續的空間。

(3)section之間不可重疊。

(4)目標檔案可以有非活動空間,各種headers和sections沒有覆蓋目標檔案的每乙個位元組,這些非活動空間是沒有定義的。

section header結構定義如下:

typedef structelf32_shdr;

其中sh_name指出section的名字,它的值是後面將會講到的section header string table中的索引,指出乙個以null結尾的字串。sh_type是類別,sh_flags指示該section在程序執行時的特性。sh_addr指出若此section在程序的記憶體映像中出現,則給出開始的虛位址。sh_offset給出此section在檔案中的偏移。其它欄位的意義不太常用,在此不細述。

檔案的section含有程式和控制資訊,系統使用一些特定的section,並有其固定的型別和屬性(由sh_type和sh_info指出)。下面介紹幾個常用到的section:「.bss」段含有佔據程式記憶體映像的未初始化資料,當程式開始執行時系統對這段資料初始為零,但這個section並不佔檔案空間。「.data.」和「data1」段包含佔據記憶體映像的初始化資料。「.rodata」和「.rodata1」段含程式映像中的唯讀資料。「.shstrtab」段含有每個section的名字,由section入口結構中的sh_name索引。「.strtab」段含有表示符號表(symbol table)名字的字串。「.symtab」段含有檔案的符號表,在後文專門介紹。「.text」段包含程式的可執行指令。

6. symbol table

目標檔案的符號表包含定位或重定位程式符號定義和引用時所需要的資訊。符號表入口結構定義如下:

typedef structelf32_sym;

其中st_name包含指向符號表字串表(strtab)中的索引,從而可以獲得符號名。st_value指出符號的值,可能是乙個絕對值、位址等。st_size指出符號相關的記憶體大小,比如乙個資料結構包含的位元組數等。st_info規定了符號的型別和繫結屬性,指出這個符號是乙個資料名、函式名、section名還是源檔名;並且指出該符號的繫結屬性是local、global還是weak。

Linux下的ELF檔案格式簡介

1 概述 executable and linking format elf 檔案是x86 linux系統下的一種常用目標檔案 object file 格式,elf檔案格式比較複雜,本文只是簡要介紹它的結構。有三種主要型別 1 適於連線的可重定位檔案 relocatable file 可與其它目標檔...

Linux下的ELF檔案格式簡介

1.概述 executable and linking format elf 檔案是x86 linux系統下的一種常用目標檔案 object file 格式,有三種主要型別 1 適於連線的可重定位檔案 relocatable file 可與其它目標檔案一起建立可執行檔案和共享目標檔案。2 適於執行的...

Linux下的ELF檔案格式簡介

1.概述 executable and linking format elf 檔案是x86 linux系統下的一種常用目標檔案 object file 格式,有三種主要型別 1 適於連線的可重定位檔案 relocatable file 可與其它目標檔案一起建立可執行檔案和共享目標檔案。2 適於執行的...