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 };

 

image

左边是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
来源:博客园
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted @ 2021-11-11 10:45  Pril  阅读(32)  评论(0)    收藏  举报