What_is_ELF
I always see ELF in some passages. And now it’s time to deeply see what it is.
ELF actually is Executable and Linkable Format. Yes, it’s a format for file (specifically for binary file such as Executable Program, Object Code and Shared Library Files)
ELF 文件的类型
可重定位文件
(Relocatable File): 由源文件编译而成尚未链接的目标文件,通常以.o
作为扩展名。用于与其它目标文件进行链接以构成可执行文件或动态链接库。可执行文件
(Executable File): 经过链接的、可执行的目标文件,就是我们通常在 Linux 中执行的程序。共享目标文件
(Shared Object File), 也叫共享库文件,包含代码和数据,这种文件是我们所称的库文件,一般以.so
结尾。一般情况下,它会有以下两种使用情景:- 链接器 (Link eDitor, ld) 可能会处理它和其它可重定位文件以及共享目标文件,生成另外一个目标文件。
- 动态链接器 (Dynamic Linker) 将它与可执行文件以及其它共享目标文件组合在一起生成进程镜像
ELF 文件的结构
结构概述
ELF 文件头表 (ELF header)
- 记录了 ELF 文件的组织结构
程序头表/段表 (Program header table)
- 告诉系统如何创建进程
- 生成进程的可执行文件必须拥有此结构
- 重定位文件不一定需要
节头表 (Section header table)
- 记录了 ELF 文件的节区信息
- 用于链接的目标文件必须拥有此结构
- 其它类型目标文件不一定需要
段 (segment) 与节 (section)
一个段中包含多个节,段视图用于进程的内存区域的rwx
权限划分,节视图用于 ELF 文件编译链接时与在磁盘上存储时的文件结构的组织
代码段 (Text segment) 包含了代码与只读数据
.text
section.rodata
section.hash
section.dynsym
section.plt
section.rel.got
section- ……
数据段 (Data segment) 包含了可读可写数据
.data
section.dynamic
section.got
section.got.plt
section.bss
section- ……
栈段 (Stack segment)
程序装载与虚拟内存
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 HaoIne!