目标文件

目标文件从结构上来看,已经是编译后的可执行文件格式,只是还没有经过链接过程,其中可能有些符号或者有些地址还没有被调整,其实本身就是按照可执行文件格式存储的,只是与真正的可执行文件在结构上稍有不同

现在流行的可执行文件格式(Executable)主要包括Windows下的PE(Portable Executable)和Linux下的ELF(Executable Linkable Format),都是COFF(Common File Format)格式的变种,目标文件就是源代码编译后但未进行链接的那些中间文件(.obj和.o),它跟可执行文件的内容和结构很类似,所以一般跟可执行文件格式一起采用一种格式存储,从广义角度来看,目标文件和可执行文件的格式几乎一样,所以可以将目标文件和可执行文件看成一种类型文件,在Windows下统称为PE-COFF文件格式,Linux下统称为ELF文件

除了可执行文件(.exe和ELF)按照可执行文件格式存储,动态链接库(Dynamic Linking Library)(.dll和.so)和静态链接库(Static Linking Library)(.lib和.a)文件都按照可执行文件格式存储,而静态链接库稍微不同,它把很多目标文件捆绑在一起形成了一个文件,再加上一些索引,可以简单地理解成一个包含有很多个目标文件的文件包

ELF文件类型:

(1)可重定位文件(Relocatable File)

这类文件包含了代码和数据,可以被用来链接称可执行文件或者共享目标文件,静态链接库就属于这一类

(2)可执行文件(Executable File)

这类文件包含了可以直接执行的程序,主要就是ELF可执行文件

(3)共享目标文件(Shared Object File)

这种文件包含了代码和数据,主要就动态库了,可以在两种情况下使用,一种是链接器可以用来跟其它可重定位文件和共享目标文件进行链接,产生新的目标文件,另一种是动态链接库可以将几个这种共享目标文件与可执行文件结合,作为进程映像的一部分来运行

(4)核心转储文件(Core Dump File)

当进程意外终止时,系统可以将该进行的地址空间的内容及终止时的一些其他信息转储到核心转储文件当中,也就是coredump文件

直接通过file命令就能得到文件格式,这里在cygwin上操作稍有差别:

lihui@2015 ~
$ file /bin/bash.exe
/bin/bash.exe: PE32+ executable (console) x86-64, for MS Windows

lihui@2015 ~
$ file /lib/libnssckbi.so
/lib/libnssckbi.so: symbolic link to `/usr/lib/pkcs11/p11-kit-trust.so’

发表回复