天天看點

so檔案格式詳解

可執行連結格式 ( Executable and Linking Format)最初是由 UNIX 系統實驗室 ( UNIXSystem Laboratories, USL)開發并釋出, 作為應用程式二進制接口 ( Application BinaryInterface, ABI)的一部分,它是一種常用的目标檔案格式,主要包含以下三種類型

1、可重定位檔案:可與其它目标檔案一起建立可執行檔案和共享目标檔案

2、可執行檔案:可執行的一個程式,此檔案規定了exec() 如何建立一個程式的程序映像。

3、共享目标檔案:連結器可将它與其它可重定位檔案和共享目标檔案連接配接成其它的目标檔案,動态連接配接器又可将它與可執行檔案和其它共享目标檔案結合起來建立一個程序映像。

ELF常用資料格式

so檔案格式詳解

所有資料結構都遵從“自然”大小和對齊規則。

目标檔案格式

so檔案格式詳解

目标檔案既要參與程式連結,又要參與程式執行,是以提供兩種并行視圖,分别反應不同活動需求。

ELF頭部:描述整個檔案組織。

程式頭部:告訴系統如何建立程序映像。

節區頭部:每個節區在表中都有一項,每一項給出節區名稱、大小等資訊。用于連結的目标檔案必含節區頭部表。

ELF Header

#define EI_NIDENT 16
typedef struct{
unsigned char e_ident[EI_NIDENT];//ElF辨別資訊,16個位元組
Elf32_Half e_type;//目标檔案類型,2個位元組
Elf32_Half e_machine;//目标體系結構類型,2個位元組
Elf32_Word e_version;//目标檔案版本,4個位元組
Elf32_Addr e_entry;//程式入口的虛拟位址,如果沒有則為0,4個位元組
Elf32_Off e_phoff;//程式頭部表偏移,4個位元組
Elf32_Off e_shoff;//節區頭部表偏移,4個位元組
Elf32_Word e_flags;//與檔案相關,特定于處理器标志,4個位元組
Elf32_Half e_ehsize;//elf頭部大小,2個位元組
Elf32_Half e_phentsize;//程式頭部表格的表項大小,2個位元組
Elf32_Half e_phnum;//程式頭部表格表項數目,2個位元組
Elf32_Half e_shentsize;//節區頭部表格的表項大小,2個位元組
Elf32_Half e_shnum;//節區頭部表格的表項數目,2個位元組
Elf32_Half e_shstrndx;//節區頭部表格中與節區名稱字元串表相關的表項索引,2個位元組
}Elf32_Ehdr;
           

Program Header

typedef struct {
Elf32_Word p_type;//描述段的類型,4個位元組
Elf32_Off p_offset;//段偏移,4個位元組
Elf32_Addr p_vaddr;//段虛拟位址,4個位元組
Elf32_Addr p_paddr;//實體位址,4個位元組
Elf32_Word p_filesz;//段的檔案映像大小,4個位元組
Elf32_Word p_memsz;//段的記憶體映像大小,4個位元組
Elf32_Word p_flags;//段相關辨別,4個位元組
Elf32_Word p_align;//對齊取值,4個位元組
} Elf32_phdr;
           

Section Header

typedef struct{
Elf32_Word sh_name;//節區名稱,是字元串表節區索引,4個位元組
Elf32_Word sh_type;//節區類型,4個位元組
Elf32_Word sh_flags;//節區标志,4個位元組
Elf32_Addr sh_addr;//節區記憶體位址,4個位元組
Elf32_Off sh_offset;//節區偏移,4個位元組
Elf32_Word sh_size;//節區長度,4個位元組
Elf32_Word sh_link;//節區頭部表索引連結,4個位元組
Elf32_Word sh_info;//附加資訊,4個位元組
Elf32_Word sh_addralign;//對齊限制,4個位元組
Elf32_Word sh_entsize;//節區表項大小,4個位元組
}Elf32_Shdr;
           

Symbol Table

typedef struct {
Elf32_Word st_name;//符号表項名稱,是字元串表索引,4個位元組
Elf32_Addr st_value;//符号值,4個位元組
Elf32_Word st_size;//符号大小,4個位元組
unsigned char st_info;//類型和綁定資訊,1個位元組
unsigned char st_other;//無定義,1個位元組,目前值為0
Elf32_Half st_shndx;//節區頭部索引,2個位元組
} Elf32_sym;
           

節區

節區包含目标檔案中所有資訊。除了ELF頭部、程式頭部表格、節區頭部表格。節區滿足以下條件: 1、每個節區都有對應的節區頭部描述,而有節區頭部卻不一定有節區。 2、每個節區占用連續位元組區域,可能為0 3、目标檔案中可能包含非活動空間,這些區域不屬于任何頭部和節區,其内容未指定。