所以,我这里有一些非常奇怪的东西。
例如,我有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-type,这意味着未初始化的局部作用域符号)。是否有任何方法可以仅使用linux实用程序(grep、regexp等完全可以)自动分离这些情况?
简短回答 :实际上没有办法在所有情况下都这样做
Long answer :使用"objdump-x file.o"查看SYMBOL TABLE。您可以看到,所有全局变量,包括静态变量和常量变量,都被分配到一个名为.bss的部分中。还存在一个称为.rodata的部分,它通常用于存储常量数据。不幸的是,在您的案例中,您声明了两个conststd::string对象。在运行"main"函数之前,通过调用它们的构造函数来初始化这些对象。尽管如此,它们的字段的初始化是在运行时进行的,因此它们只是"逻辑"常量,而不是真正的常量。
编译器别无选择,只能将它们与所有其他全局变量一起分配到.bss部分。如果添加以下行
const int willBeInRoData = 42;
你会发现它的符号将在.rodata部分,因此它将与其他全局整数区分开来。
注意:从"尝试从已编译的文件中查找全局变量"中被欺骗。该程序可以';t区分常量和全局变量。因为问题完全一样。