C程序的编译过程结束后,会为每个c文件生成一个对应的目标文件。
目标文件由一系列的section组成,最常见的section包括:
- .text:存放代码
- .data:存放初始化过的数据
- .bss:存放未初始化的数据
- 其他一些更特殊的section,例如存放调试信息的section
- 等等
在链接过程,会将各个目标文件的.text都拼在一起,.data都拼在一起,.bss都拼在一起… 最终生成一个可执行文件,该可执行文件也包含.text, .data, .bss等section。
目标文件中每个section和指令的地址都是相对与0的偏移,因为具体放到内存中何处在编译时并不知道,是链接阶段才能确定的。
我们知道一个程序在运行时的内存包括堆和栈,这两者完全是在运行时期决定的,而不受目标文件的影响。
目标文件的格式是平台相关的,例如Linux平台上目标文件的格式主要是ELF,而Windows上则是PE/COFF。