我们有一个大型C项目,我们正在使用GCC和MSVC构建,我们遇到了
static initialization order fiasco.有没有办法生成参与静态初始化的符号列表,所以我可以生成一个计划来解决问题?
我已经从GCC和MSVC创建了一个地图文件. MSVC的输出看起来不太有用.似乎可以使用GCC的地图文件 – 我提取了与bss部分相关的所有内容.但是,许多符号来自库,只是为信息添加噪声.
是否有技巧或其他方便的方法来获取我正在寻找的信息(手动读取每个源文件)?
最佳答案 对于Visual C:对.map文件的行进行排序.这将确保符号按地址排序.
搜索符号__xc_a和__xc_z.这两个符号之间出现的符号是具有静态存储持续时间的对象的所有动态初始化器.初始化程序将按它们在列表中出现的顺序执行.
.map文件中的每个条目都包含两者
>全局变量的名称(例如,全局变量fred的初始化程序将为fred $initializer $,加上所需的C名称修饰),以及
>包含全局变量的目标文件(例如fred.obj).如果符号来自静态库,则将列出静态库(例如libfred:fred.obj).
(我不太了解GCC如何用他们的工具来解决这个问题.)