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