目标文件的格式
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;
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;