窥探目标文件
文章目录
- 源文件如何变成可执行文件
-
- 编译
- 链接
- 目标文件格式
-
- ELF文件格式
-
- 节表
- 重定位表(.rela)
- 符号表(.symtab)
-
- 符号(链接的接口)
-
- 强符号与弱符号
- 强引用与弱引用
- 符号表表项
-
- 符号类型和绑定信息
- 符号所在段
- 其他节
源文件如何变成可执行文件
CPU只能执行二进制指令,无法执行用户直接编写的源代码,因此在IDE中简单地一键运行背后一定隐藏了一套复杂的转换过程。这个过程分为2步,编译+链接
编译
编译负责将各个编译单元转换成目标文件
这里的编译是一个笼统的说法,编译具体可以划分为预处理+编译+汇编三个步骤,这个过程需要编译器和汇编器的介入,预处理后的.i文件仍然是一个源文件,编译后的.s为汇编文件,汇编后的.o是一个二进制文件(即目标文件),目标文件非常重要,它是参与后续链接的基本单元
链接
链接负责将各个目标文件合并成一个可执行文件
链接过程中会进行对全局变量,全局函数的地址修正(重定位),每一个需要被重定位的地方称为重定位入口,只有经过重定位后才正确地执行程序
目标文件格式
若想了解链接就必须了解目标文件,Linux下的目标文件遵循Executable Linkable Format(ELF)文件格式,除此之外,可执行文件、核心转储文件、共享对象文件也遵循ELF文件格式
ELF文件格式
ELF文件格式最大的特点就是按节(section)编排,粗略得看ELF文件自底向上分别是文件头、代码节(.text)、已初始化数据节(.data)、未初始化数据节(.bss),当然除此之外还有很多辅助节存在
/*test.c*/
int a; //.bss
int b=1; //.data
int main(){
//.text
return 0;