我希望在大型代码库中确定静态存储持续时间的所有对象的位置;这样我就可以查看静态初始化顺序是否存在任何潜在问题。
有没有好办法呢?
仅仅搜索关键字static
还不够好,因为它会遗漏在命名空间范围内声明的任何对象。
链接器的地图文件确实指出了bss
和data
区域有多大,但是它的所有名称都被删除了非extern
的符号。
目前我正在筛选每个目标文件的转储,寻找DATA和BSS,但这很痛苦,并且有很多垃圾,例如类vtable和编译器生成的静态数据。
答案 0 :(得分:1)
免责声明:这是一个相当本地化和不完整的答案。我把它留在这里,希望有人可以从中受益(也许建立在它上面)。
使用gcc工具链,在启动时__main
调用__do_global_ctors
,执行向后遍历__CTOR_LIST__
。例如,在nm
库上使用.so
,我得到:
00000000004e2040 d __CTOR_END__
00000000004e2000 d __CTOR_LIST__
00000000004e2050 d __DTOR_END__
00000000004e2048 d __DTOR_LIST__
从那时起,我想你可以从那些地址到正在执行的有效功能;但是,正如您所注意到的,映射回源名称可能很尴尬(特别是在匿名名称空间中)。您可以从调试信息中恢复它们(源位置),但到目前为止我还没有进展。