从编译文件(linux)获取所有全局变量。如何将static与const分开?

时间:2012-12-02 17:37:48

标签: linux global-variables nm

所以,我在这里有一些非常奇怪的事情。

例如,我有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;

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

1 个答案:

答案 0 :(得分:1)

简短回答 :实际上没有办法在每种情况下都这样做

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

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

const int willBeInRoData = 42;

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

注意:问题来自Try to find global variables from compiled files. The program can't distinguish constants from global variables.,因为问题完全相同。