参考:
《程序员自我修养》
https://blog.csdn.net/Vince_/article/details/89076338 http://www.skyfree.org/linux/references/ELF_Format.pdf
0. 简述
ElF (Executable Linkable Format 可执行可连接格式),属于 COFF (Common file format) 通用文件格式 的变种。
因为目标文件( .o) 与可执行文件内容结构相似,所以一般与可执行文件格式采取同一种存储格式。我们将其统称为ELF文件。
file filename
可以使用 file 命令查看文件类型。
常见ELF文件类型
两种不同理解ELF文件的视角 (本文选择链接视角进行解析,即第一种视角)
1. ELF中重要的section
readelf -S xxx.o
查看文件中的各个段
objdump -s -d xxx.o
查看各个段的内容
ELF 文件中需要关注的一般就下图的几个段,下面对每个段进行简单解析。
ELF Header ELF文件头
readelf -h xxx.o
.text 代码段
存放程序的指令。
.data 和 .rodata
.data 存放已初始化的全局变量和局部静态变量。
.rodata 存放只读数据和字符串常量。(有时字符串常量在.data区,不同编译器选择不同)
.bss
存放未初始化的全局变量和局部静态变量。
.strtab 和 .shstrtab
.strtab 保存普通的字符串,比如符号名称。注意这块存放的是ELF文件中的字符串,而不是代码中的字符串。
.shstrtab 常用于保存段名。
Section Header Table 段表
保存各个段的信息包括 段名,段长,文件中的偏移,读写权限等等。
编译器,连接器和装载器都是依靠段表访问各个段的。
.symtab 符号表
记录ELF文件中用到的所有符号,每个符号有符号值对变量和函数来说,符号值就是它们的地址。关于符号的更多信息: https://blog.csdn.net/baidu_41667019/article/details/84789564
. rel.text 重定位表