从编译的文件(linux)获取所有全局variables。 如何从静态分离const?

所以,我在这里有一些奇怪的东西。

例如,我有2个.cpp文件,其中一个包含

const std::string DICTIONARY_DEFAULT = "blah"; const std::string ADDTODICTIONARY_DEFAULT = "blah"; const std::string BUTTONS = "blah"; 

和第二个一起

 static int x1; static int NewY1, NewY2, NewX1, NewX2; 

这两个片段都在全局variables部分。 我需要打印全局静态variables(例如),但忽略常量。 在nm输出中,它们看起来完全相同(每种情况都是b型,这意味着未初始化的本地范围符号)。 有没有办法自动分开这些情况下使用只有Linux实用程序(grep,正则expression式等是完全没关系)?

简短的回答 :实际上在任何情况下都没有办法做到这一点

长答案 :使用'objdump -x file.o'来查看SYMBOL TABLE。 您可以看到,所有全局变量(static和const)都被分配到一个名为.bss的部分。 一个名为.rodata的部分也存在,一般来说,它被用来存储const数据。 不幸的是,在你的情况下,你正在声明两个const std :: string对象。 这些对象是通过在main函数运行之前调用它们的构造函数来初始化的。 不过,它们的字段的初始化在运行时发生,所以它们只是“逻辑上”的const,而不是真正的const。

编译器别无选择,只能将它们与所有其他全局变量一起分配到.bss节中。 如果你添加下面一行

 const int willBeInRoData = 42; 

你会发现它的符号将在.rodata节中,所以它将与其他全局整数区分开来。

注意: 尝试从编译的文件中查找全局变量。 程序不能区分全局变量的常量。 因为问题是完全一样的。