【问题标题】:How can I easily generate a list of symbols with static storage?如何使用静态存储轻松生成符号列表?
【发布时间】:2016-06-01 13:36:28
【问题描述】:
我们有一个使用 GCC 和 MSVC 构建的大型 C++ 项目,我们遇到了static initialization order fiasco。有没有办法生成参与静态初始化的符号列表,以便我可以制定解决问题的计划?
我已经从 GCC 和 MSVC 创建了一个映射文件。 MSVC 的输出看起来不是很有用。似乎可以使用 GCC 的地图文件 - 我提取了与 bss 部分相关的所有内容。但是,许多符号来自库,只会给信息添加噪音。
是否有技巧或其他方便的方法来获取我正在寻找的信息(缺少手动读取每个源文件)?
【问题讨论】:
标签:
c++
gcc
visual-c++
static
【解决方案1】:
对于 Visual C++:对 .map 文件的行进行排序。这将确保符号按地址排序。
搜索符号__xc_a 和__xc_z。 在这两个符号之间出现的符号都是具有静态存储持续时间的对象的动态初始化器。初始化程序将按照它们在列表中出现的顺序执行。
.map 文件中的每个条目都包含两者
- 全局变量的名称(例如,全局变量
fred 的初始化程序将是 fred$initializer$,加上所需的 C++ 名称修饰),并且
- 包含全局变量的目标文件(例如
fred.obj)。如果符号来自静态库,则会列出静态库(例如libfred:fred.obj)。
(我对 GCC 的了解还不够,无法回答如何使用他们的工具来做到这一点。)