gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:35:07 26 4
gpt4 key购买 nike

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

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

最佳答案

简答:实际上没有办法在所有情况下都做到这一点

长答案:使用“objdump -x file.o”查看符号表。您可以看到所有全局变量,包括 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. 中复制因为问题完全一样。

关于linux - 从编译文件 (linux) 获取所有全局变量。如何将静态与常量分开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13671864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com