目标文件是源码编译后未链接的中间文件,目标文件里面存放的是什么?怎么存储的?实际上目标文件、可执行文件、动态链接库、静态链接库的存储都几乎是一样的。静态链接库是多个目标文件的文件包,加上一些索引。
目标文件的格式
可执行文件格式:windows下PE(portable executable),linux下是ELF(executable linkable format),这两种都是COFF(commin file format)的变种。
ELF文件分四类:
Linux下可以用file 文件名
来查看文件类型
目标文件什么样
文件头、代码段、数据段、bss段
文件头
描述文件信息的,是否可执行、是静态链接还是动态链接等等,还有一个段表,描述各个段在文件中的偏移位置。
代码段
机器代码
数据段
已经初始化的全局变量和局部静态变量
bss段
未初始化的全局变量和局部静态变量,但是并不给该段的数据分配空间,只是记录数据所需空间的大小。
因为他们默认值都是0,存放数据0是没有必要的
为什么要分成指令和数据两种段
- 便于虚存权限的管理,数据可读写,指令只读
- 局部性原理,提高对指令和数据的缓存命中率
- 系统中运行多个该程序的副本,可以实现共享,如指令,图标,文本,特别是有动态链接后,可以大大节省内存。