(接上文)
第四种补充情况,所有段都加载吗?
继续回到可执行文件中,除了上述实实在在需要参与运行的辅助段外,可执行文件中还存在一些non-Allocable的段,它们只是被链接器、调试器或者其他类似工具所使用,而并非参与进程的实际运行。比如字符串表.strtab,符号表 .symtab等等。当运行最后的可执行程序时,加载器会加载那些Allocable的部分,而non-Allocable的部分则会被继续留在可执行文件内。所以,实际上,这些 non-Allocable 的段都可以被我们用strip工具从最后的可执行文件中删除掉。删除掉这些段的可执行文件照样能够运行,只不过不方便调试罢了。
以上,就是动态库实现的细节。
经过一段繁杂冗长的旅程后,终于,高级语言代码,变成了可执行文件。到此,也是时候将上述内容综合一下,整体展示一个可执行文件的格式了,如下图:
初步看,还是比较复杂的。不过,从前述内容中,我们也可以看出,虽然可执行文件有这么多段,但是各个数据段的存在都是有道理的,是为了解决具体问题而存在的。总之,不论可执行文件格式如何复杂,它都是为程序加载执行服务的。
二 具体的例子
具体到Linux和Windows,分别展示一个实际的可执行文件格式并加以说明。待补充。
三 进一步理解编译
了解了可执行文件的内容后,抛开它,从逻辑的角度再来深入理解编译。可能有人同我有同样的困惑。
这部分内容单独提了出来,参见:
https://blog.csdn.net/wwwyue1985/article/details/119510675
至此,我们的规则就构建完成了,也算是完成了程序的静态视图。如此构造的可执行文件,运行时又是什么样子的呢,会不会和文件格式一样呢?这就是程序动态视图的问题。我们在下一部分专门来介绍。
这是一个从静态到动态的转变。