目標檔案的格式
Windows下為PE(Portable Executalbe),Linux為ELF(Executable Linkable Format), 他們都是COFF的變種. 下面都是以ELF格式檔案為例.
ELF檔案類型分為:
可重定位檔案(Relocatable File) Linux的.o, windows的.obj
可執行檔(Executable File) Linux的/bin/bash, windows的.exe
共用目標檔案(Shared Object File Linux的.so, windows的DLL
核心轉儲檔案(Core Dump File) Linux的core dump
ELF檔案分為:
程式碼片段
資料區段和唯讀資料區段
BSS段:存放未初始化的全域變數和局部靜態變數. .bss段只是為未初始化的全域變數和局部靜態變數預留位置而已,它並沒有內容, 所以它在檔案中也不佔據空間.
其他段
ELF檔案結構
1. ELF標頭檔
typedef struct{
unsigned char e_ident[16];
Elf32_Half e_type; //ELF檔案類型
Elf32_Half e_machine; //ELf檔案的CPU平台屬性
Elf32_Word e_version;
Ellf32_Addr e_entry; //入口地址, 規定ELF程式的入口虛地址
Elf32_Off e_ohoff;
Elf32_Off e_shoff; //段表在在這個檔案中的位移
Elf32_Word e_flags;
Elf32_Half e_ehsize; //ELF檔案頭本身的大小
Elf32_Half e_phentsize;
Elf32_half e_phnum;
Elf32_Half e_shentsize; //段表描述符的大小
Elf32_Half e_shnum; //段表描述符數量
Elf32_Half e_shstrndx; //段表字串表所在的段在段表中的下標
}Elf32_Ehdr;
2. 段表
typedef struct{
Elf_Word sh_name; //段名(是段名字串在.shstrtab中的位移)
Elf_Word sh_type; //段的類型
Elf_Word sh_flags; //段的標誌位
Elf_Addr sh_addr; //段虛擬位址
Elf_Off sh_offset; //段位移
Elf_Word sh_size; //段的長度
Elf_Word sh_link;
Elf_Word sh_info;
Elf_Word sh_addralign; //段地址對齊
Elf_Word sh_entsize; //項的長度
}Elf32_Shdr;
__________<br />ELF Header<br />e_shoff = 0x118<br />__________<br />.text<br />__________<br />.data<br />__________<br />.rodata<br />__________<br />.comment<br />__________<br />.strtab<br />__________<br />.shstrtab<br />__________<br />Section Table(段表)<br />__________<br />.symtab<br />__________ 0x00000426(因對齊的間隔)<br />__________ 0x00000428<br />.rel.text<br />__________<br />
3. 重定位表 Relocation Table
如printf. 段的類型為: SHT_REL
4. 字串表
.strtab .shstrtab 分別為字串表(儲存一般字元串)和段表字串表(儲存段表中用到的字串)
5. 符號表
typedef struct{
Elf32_Word st_name; //符號名(符號名在字串表中的下標)
Elf32_Addr st_value; //符號對應的值
Elf32_Word st_size; //符號大小
unsigned st_info;
unsigned st_other;
Elf32_Half st_shndx; //符號所在的段
}Elf32_Sym;
__________<br />ELF Header<br />__________<br />.text(程式碼片段)<br />__________<br />.data(資料區段)<br />__________<br />.rodata(唯讀資料區段)<br />__________<br />.comment<br />__________<br />.strtab(字串表)<br />__________<br />.shstrtab(段表字串表)<br />__________<br />Section Table(段表)<br />__________<br />.symtab(符號表)<br />__________<br />__________<br />.rel.text<br />__________<br />