ELF文件格式
"Executable and Linkable Format" 的简称。当编译和链接一个 C 程序的时候,编译器将每个 C 源码文件 (.c) 转为一个对象文件 (.o) ,对象文件中存放的是机器能理解的二进制格式的汇编语言指令。然后,链接器 (linker) 将所有对象文件结合为一个二进制映像 (image) 文件,即ELF文件。
main.c用到了在 inc/elf.h 中定义的两个结构体
1 struct Elf { // ELF文件头 2 uint32_t e_magic; // must equal ELF_MAGIC 3 uint8_t e_elf[12]; 4 uint16_t e_type; 5 uint16_t e_machine; 6 uint32_t e_version; 7 uint32_t e_entry; 8 uint32_t e_phoff; // program header起始位置 9 uint32_t e_shoff; // section header起始位置 10 uint32_t e_flags; 11 uint16_t e_ehsize; // ELF文件头本身大小 12 uint16_t e_phentsize; 13 uint16_t e_phnum; // program header个数 14 uint16_t e_shentsize; 15 uint16_t e_shnum; 16 uint16_t e_shstrndx; 17 }; 18 19 struct Proghdr { // 程序头表 20 uint32_t p_type; 21 uint32_t p_offset; // 段相对于ELF文件开头的偏移 22 uint32_t p_va; 23 uint32_t p_pa; // 物理地址 24 uint32_t p_filesz; 25 uint32_t p_memsz; // 在内存中的大小 26 uint32_t p_flags; // 读,写,执行权限 27 uint32_t p_align; 28 };

左边是ELF的链接视图,可以理解为是目标代码文件的内容布局。右边是ELF的执行视图,可以理解为可执行文件的内容布局。
注意目标代码文件的内容是由section组成的,而可执行文件的内容是由segment组成的。
要注意区分段(segment)和节(section)的概念,这两个概念在后面会经常提到。
我们写汇编程序时,用.text,.bss,.data这些指示,都指的是section,比如.text,告诉汇编器后面的代码放入.text section中。
目标代码文件中的section和section header table中的条目是一一对应的。section的信息用于链接器对代码重定位。
而文件载入内存执行时,是以segment组织的,每个segment对应ELF文件中program header table中的一个条目,用来建立可执行文件的进程映像。
比如我们通常说的,代码段、数据段是segment,目标代码中的section会被链接器组织到可执行文件的各个segment中。
.text section的内容会组装到代码段中,.data, .bss等节的内容会包含在数据段中。
作者:找不到工作
链接:https://www.jianshu.com/p/5cd49bba50ad
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:JollyWing
链接:https://www.cnblogs.com/jiqingwu/p/elf_format_research_01.html
来源:博客园
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

浙公网安备 33010602011771号