2

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

例如,我有 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 等完全可以)来自动分离这种情况?

4

1 回答 1

1

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

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

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

const int willBeInRoData = 42;

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

注意:受骗尝试从编译文件中查找全局变量。程序无法区分常量和全局变量。因为问题完全一样。

于 2012-12-03T17:39:52.997 回答