编译器编译源代码后生成的文件叫做目标文件。
从文件结构上来讲,目标文件已经是二进制文件。
编译是针对单个源文件的,有几个源文件就会生成几个目标文件,并且在生成过程中不受其他源文件的影响。也就是说,不管当前工程中有多少个源文件,编译器每次只编译一个源文件、生成一个目标文件。
动态链接库(DLL,Dynamic Linking Library)(Windows 下的.dll
和 Linux 下的.so
)和静态链接库(Static Linking Library)(Windows 下的.lib
和 Linux 下的.a
)也是按照可执行文件的格式存储的。
静态链接库稍有不同,它是把多个目标文件捆绑在一起形成一个文件,再加上一些索引,你可以简单地把它理解为一个包含了很多目标文件的包。
在 Linux 下,相信很多读者都遇到过一种叫做Segment fault(段错误)
的错误,这种错误发生在程序执行期间,在编译和链接时无法检测,一般都是代码的权限不足导致的。
可执行文件不再关注具体的文件结构,而是关注程序的加载和执行过程。
由于可执行文件在加载时实际上是被映射的虚拟地址空间,所以可执行文件很多时候又被叫做映像文件(Image)。
在链接过程中,链接器会将多个目标文件中的代码段、数据段、调试信息等合并成可执行文件中的一个段。段的合并仅仅是一个简单的叠加过程。