缘起
我在上一篇文章——《调试实战 —— dll 加载失败之全局变量初始化篇》中,跟大家分享了一个由于全局变量初始化顺序导致的 dll 加载失败的例子。感兴趣的小伙伴儿可以点击阅读。
虽然我们知道了是由于全局变量初始化顺序导致的问题,也给出了解决方案。但是有一点却没有刨根问底——为什么改变文件在工程文件中的顺序就可以改变全局变量初始化顺序?是怎么影响的呢?本篇文章力求解决这个问题。
了解 Build
我们可以简单的把整个构建过程分成三个步骤(当然实际还有其它步骤,我们一般不关心):预编译,编译,链接。
预编译: 处理宏,#include 展开等。
编译: 以编译单元为单位生成对应的 .obj 文件。
链接: 把生成的.obj 文件和必要的文件链接成最后的应用程序。
猜想
因为编译是把符号放到对应的 .obj 中,链接的时候才把对应的 .obj 文件链接成最后的应用程序。链接的时候应该是按照 .obj 文件出现的先后顺序依次把 .obj 中的符号放到对应的位置。

本文探讨了全局变量初始化顺序如何受Build过程和链接顺序影响。通过分析编译和链接过程,作者发现源码文件在项目中的顺序决定了相应OBJ文件在链接参数文件中的位置,从而影响全局变量的初始化顺序。实验中,通过中断link.exe并对比不同顺序下的链接参数,验证了这一结论。
最低0.47元/天 解锁文章
5541

被折叠的 条评论
为什么被折叠?



