编译器编译源代码后生成的文件叫做目标文件.
目标文件从结构上讲,它是已经编译后的可执行文件格式,只是还没有经过链接的过程,其中可能有些符号或有些地址还没有被调整。其实它本身就是按照可执行文件格式存储的,只是跟真正的可执行文件在结构上稍有不同。
现在PC平台流行的可执行文件格式(Executable)主要是Windows下的PE ( PortableExecutable)和Linux的ELF (Executable Linkable Format),它们都是COFF(Common fileformat〉格式的变种。
目标文件就是源代码编译后但未进行链接的那些中间文件( Windows的.obj和 Linux 下的.o),它跟可执行文件的内容与结构很相似,所以一般跟可执行文件格式一起采用一种格式存储。从广义上看,目标文件与可执行文件的格式其实几乎是一样的,所以我们可以广义地将目标文件与可执行文件看成是一种类型的文件,在Windows下,我们可以统称它们为PE-COFF文件格式。在Linux 下,我们可以将它们统称为ELF文件。
不光是可执行文件(Windows的.exe 和 Linux下的ELF可执行文件)按照可执行文件格式存储。动态链接库(DLL,Dynamic Linking Library)( Windows的.dll和 Linux 的.so)及静态链接库(Static Linking Library)( Windows 的.lib和 Linux 的.a)文件都按照可执行文件格式存储。它们在 Windows下都按照 PE-COFF格式存储,Linux下按照ELF格式存储。静态链接库稍有不同,它是把很多目标文件捆绑在一起形成一个文件,再加上一些索引,你可以简单地把它理解为一个包含有很多目标文件的文件包。ELF文件标准里面把系统中采用ELF格式的文件归为如下表所列举的4类。
ELF文件类型 | 说明 | 实例 |
可重定位文件( Relocatable File ) | 这类文件包含了代码和数据,可以被用来链接成可执行文件或共享目标文件,静态链接库也可以归为这一类 | Linux的.o、Windows的.obj |
可执行文件( Executable File ) | 这类文件包含了可以直接执行的程序,它的代表就是ELF可执行文件,它们一般都没有扩展名 | 比如/bin/bash文件Windows 的.exe |
共享目标文件( Shared Object File ) | 这种文件包含了代码和数据,可以在以下两种情况下使用。一种是链接器可以使用这种文件跟其他的可重定位文件和共享目标文件链接,产生新的目标文件。第二种是动态链接器可以将几个这种共享目标文件与可执行文件结合,作为进程映像的一部分来运行 | Linux的.so ,如/liblglibc-2.5.so、Windows的DLL |
核心转储文件( Core Dump File ) | 当进程意外终止时,系统可以将该进程的地址空间的内容及终止时的一些其他信息转储到核心转储文件 | Linux下的core dump |
我们可以在 Linux下使用file命令来查看相应的文件格式,上面几种文件在file命令下会显示出相应的类型:
标签:可执行文件,文件,Windows,ELF,目标,Linux,格式 From: https://blog.51cto.com/u_16188116/7544504