程序员的自我修养: 目标文件的本质

来源:互联网 发布:小店记账软件 编辑:程序博客网 时间:2024/06/05 17:37

目标文件的格式

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;

 

 

原创粉丝点击