3.1 目标文件的格式
1、可执行文件格式:
(1)window下的PE
(2)Linux下的ELF
2、目标文件:源代码编译之后未进行链接的文件,例如window下的.obj文件,linux下的.o文件
3、目标文件、可执行文件、动态链接库(W:.dll;L:.so)、静态链接库(W:.lib;L:.a)存储格式一致。
4、静态链接库:很多目标文件捆绑子一起的一个文件。
5、ELF文件分类:
(1)可重定位文件
(2)可执行文件
(3)共享目标文件
(4)核心转储文件
6、linux下的查看文件的命令:file 文件
3.2 目标文件是什么样的
目标文件的存储方式:以节(段)方式存储。
1、目标文件的内容:
(1)机器指令代码
机器指令存储在代码段。.code或者.text
(2)数据
全局变量和静态局部变量存放在数据段。.data
(3)符号表
(4)调试信息
(5)字符串
下面为一个简单的程序与目标文件对应关系:
图3.1 程序与目标文件
在图3.1中是一个简单的C语言编译之后生层的中间文件。在左侧可以看到中间文件主要由以下4个部分组成:
(1)File Header:文件头。文件头描述了文件的文件属性,包括:可执行权限、链接方式(静态、动态)、入口地址、目标硬件、目标操作系统、段表(描述文件中各个段的数组)。
段表描述了各个在文件中的偏移地址及段的属性。
(2).text section 。保存的是编译之后的机器代码。
(3).data.section。保存已初始化的全局变量和局部静态变量。
(4).bss.section。保存未初始化的全局变量和局部静态变量。
可执行文件必须记录所有未初始化的全局变量和局部静态变量的大小总和,记为.bss段。bss段为未初始化的全局变量和局部静态变量预留位置。
程序编译之后分成数据和指令的好处:
(1)程序被装载之后,数据、指令分别映射在两个虚存区域。这样通过设置不同区域的访问权限可以防止程序被有意或者无意改写。
(2)有利于提高程序的局部性。现代CPU的缓存一般被设计成数据缓存和指令缓存分离。
(3)共享指令。共享指令可以节省很大的内存空间。