如何使用静态存储轻松生成符号列表?
Posted
技术标签:
【中文标题】如何使用静态存储轻松生成符号列表?【英文标题】: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
部分相关的所有内容。但是,许多符号来自库,只会给信息添加噪音。
是否有技巧或其他方便的方法来获取我正在寻找的信息(缺少手动读取每个源文件)?
【问题讨论】:
【参考方案1】:对于 Visual C++:对 .map 文件的行进行排序。这将确保符号按地址排序。
搜索符号__xc_a
和__xc_z
。 在这两个符号之间出现的符号都是具有静态存储持续时间的对象的动态初始化器。初始化程序将按照它们在列表中出现的顺序执行。
.map 文件中的每个条目都包含两者
-
全局变量的名称(例如,全局变量
fred
的初始化程序将是 fred$initializer$
,加上所需的 C++ 名称修饰),并且
包含全局变量的目标文件(例如fred.obj
)。如果符号来自静态库,则会列出静态库(例如libfred:fred.obj
)。
(我对 GCC 的了解还不够,无法回答如何使用他们的工具来做到这一点。)
【讨论】:
GCC 很复杂,因为它起源于“替代 C 编译器”——既不是真正的 C++ 编译器,也不是完整的 C 编译器。特别是,它解释了很多不同的标准库实现(GNU C 库),这些实现通常随操作系统一起提供,而不是 GCC 本身。结果,GCC 以不同的方式实现main
,这也影响了ctor 的运行方式。另见***.com/questions/28564078/…以上是关于如何使用静态存储轻松生成符号列表?的主要内容,如果未能解决你的问题,请参考以下文章