目标文件
1. 概述
编译器编译源代码后生成的文件叫做目标文件。目标文件就是源代码编译后但未进行链接的那些中间文件(Windows的.obj和Linux下的.o),它跟可执行文件的内容与结构很相似。
目标文件从结构上讲,是已经编译后的可执行文件格式,只是还没有经过链接的过程,其中可能有些符号或有些地址还没有被调整。它本身就是按照可执行文件格式存储的,只是跟真正的可执行文件在结构上稍有不同。
2. 目标文件格式
主要是Windows下的PE(Portable Executable)和Linux的ELF(Executable Linkable Format),它们都是COFF(Common file format)格式的变种。
不止可执行文件(Windows的.exe和Linux下的ELF可执行文件)按照可执行文件格式存储。动态链接库(DLL, Dynamic Linking Library)(Windows的.dll和Linux的.so)及静态链接库(Static Linking Library)(Windows的.lib和Linuxde的.a)文件都按照可执行文件格式存储。在Windows下都按照PE-COFF格式存储,Linux下按照ELF格式存储。
ELF文件分类:
ELF文件类型 | 说明 | 实例 |
---|---|---|
可重定位文件(Relocatable File) | 包含了代码和数据,可被用来链接成可执行文件或共享目标文件,静态库也可以归为这一类 | Linux的.o; Windows的.obj |
可执行文件(Executable File) | 包含了可以直接执行的程序,它的代表就是ELF可执行文件,它们一般都没有扩展名 | 比如/bin/bash文件;Windows的.exe |
共享目标文件(Shared Object File) | 包含了代码和数据。在两种情况下使用,一是链接器可以用这种文件跟其他的可重定位文件和共享目标文件链接产生新的目标文件;二是动态链接器可以将几个这种共享目标文件与可执行文件结合,作为进程映像的一部分来运行 | Linux的.so; Window的DLL |
核心转储文件(Core Dump File) | 当进程意外终止时,系统可以将该进程的地址空间的内容及终止时的一些其他信息转储到核心转储文件 | Linux下的core dump |
3.目标文件内容
目标文件中的内容有编译后的机器指令代码、数据,还包括链接时需要符号表、调试信息、字符串等。
目标文件将这些信息按不同的属性,以“节”(Section)的形式存储,有时也叫“段”(Segment)。
ELF结构:
ELF Header |
---|
.txt |
.data |
.bss |
other sections |
Section header table |
String Tables\Symbol Tables |
文件头描述了整个文件的属性,包括文件是否可执行、是静态链接还是动态链接及入口地址、目标硬件、目标操作系统等信息。
编译后执行语句的机器代码保存在.txt段。
已初始化的全局变量和局部静态变量都保存在.data段。
未初始化的全局变量和局部静态变量放在.bss段,.bss段只是为未初始化的全局变量和局部静态变量预留位置而已,它并没有内容,所以它在文件中也不占据空间。