目标文件详细解读(一)—— 格式与内容

我们都知道,编译器编译源代码后生成的文件是目标文件,那么,目标文件与可执行文件之间有什么区别呢?其最本质的内容是什么呢?

目标文件的格式

  实际上,目标文件是源代码编译但未链接的中间文件(windows的.obj文件和linux的.o文件).它与可执行文件的内容与结构十分相似,从广义上二者的格式几乎一样。windows下,我们统称为PE-COFF文件格式,Linux下统称为ELF文件,其实,它们都是COFF(Common file format)的变种。

   从结构上,目标文件是编译后的可执行文件格式, 但未经过链接过程,缺少启动代码和库例程(http://www.cnblogs.com/getyoulove/p/3674791.html)。而可执行文件涵盖了编译、链接、装载和执行的各个方面。

目标文件内容

  目标文件中包含了编译后的机器指令代码数据、以及链接时所需的信息,如符号表调试信息字符串等。通常这些信息会根据属性,以“节”(“段”)的形式存储。通常,机器指令放在代码段,全局变量或局部静态变量放在数据段。代码段常见名字有“.code”或“.text”,数据段一般命名“.data”。


Q&A

  Q:总体来说,程序源代码被编译后主要分为两种段:程序指令和程序数据。那么为什么要把指令和数据分开呢?

  A:

  • 当程序被装载后,相对进程来说,数据是可读写的,而指令一般是只读的。因此将两者分段,可以将其分别映射到两个虚拟区域,设置不同的权限,防止程序的指令被有意或无意改写。
  • 现代CPU的缓存一般被设计成数据缓存和指令缓存分离。两者分离有利于提高程序局部性,提高CPU的缓存命中率。
  • 最为重要的是,实现指令恭喜,尤其是在动态链接的系统中,可以节省大量内存。

  

 

 

 

 

 

posted @ 2017-08-08 14:42  JohnsonC  阅读(2370)  评论(1编辑  收藏  举报