如何使用静态存储轻松生成符号列表?

时间:2016-06-01 13:36:29

标签: c++ gcc visual-c++ static

我们有一个大型C ++项目,我们用GCC和MSVC构建,我们遇到了static initialization order fiasco。有没有办法生成参与静态初始化的符号列表,以便生成解决问题的计划?

我已经从GCC和MSVC创建了一个地图文件。 MSVC的输出看起来并不是很有用。看来可以使用GCC的地图文件 - 我提取了与bss部分相关的所有内容。但是,许多符号来自库,只是为信息添加噪声。

是否有技巧或其他方便的方法来获取我正在寻找的信息(缺少手动阅读每个源文件)?

1 个答案:

答案 0 :(得分:1)

对于Visual C ++:对.map文件的行进行排序。这将确保符号按地址排序。

搜索符号__xc_a__xc_z 这两个符号之间的符号是具有静态存储持续时间的对象的所有动态初始值设定项。初始化程序将按它们在列表中出现的顺序执行。

.map文件中的每个条目都包含

  1. 全局变量的名称(例如,全局变量fred的初始值设定项将为fred$initializer$,加上所需的C ++名称修饰)和
  2. 包含全局变量的目标文件(例如fred.obj)。如果符号来自静态库,则将列出静态库(例如libfred:fred.obj)。
  3. (我对GCC没有足够的了解,可以用他们的工具来解答如何做到这一点。)