gpt4 book ai didi

c++ - 在 C++ 中使用符号表按名称引用变量

转载 作者:搜寻专家 更新时间:2023-10-31 01:00:22 24 4
gpt4 key购买 nike

基本上就是标题所问的内容。

由于对 C++ 和更高级的概念(如符号表)有点陌生,我在网上进行了调查,但正在努力寻找实现我最终目标的任何方向。我见过的大多数教程都是针对 C 的,而我发现的最接近的问题 ( here ) 让我陷入困境,因为我尝试编译它但没有得到想要的结果,并且我还不太了解 extern "C" 的工作原理。

最后,我希望能够从符号表中访问一个变量,并更改该变量。我玩过 nmobjdump(并且来自硬件背景,看起来绝对很酷),我研究了 dlsymdlopen 等,但我不确定这对我有何帮助(特别是因为我看到它在 C 中的使用比其他任何东西都多)。

任何建议或小代码片段(这样我就可以编写自己的示例程序)都会很棒。补充一下,这是在带有某种过时版本的 G++ 的 Linux 系统上(我现在不在机器上,所以我没有该信息)并且我现在无权升级它。

最佳答案

下面是一个示例程序,展示了如何使用 dlsym 查找符号:

#include <dlfcn.h>
#include <iostream>

extern "C" int my_variable = 42;

int main()
{
if (int* p = (int*)dlsym(NULL, "my_variable"))
std::cout << "my_variable @" << p << ' ' << *p << '\n';
else
std::cout << "dlsym failed\n";
}

extern "C" 位防止 name mangling ,确保符号表条目只是传递给 dlsym()"my_variable" 文本.您不能使用 extern "C" 并提供一个损坏的名称,但那将是特定于编译器的。

要编译代码,请使用:

g++ x.cc -o x -ldl -rdynamic

-ldldlsym 的库,-rdynamic 要求不要丢弃看似未使用的变量的符号信息(参见 here ) :

-rdynamic Pass the flag -export-dynamic to the ELF linker, on targets that support it. This instructs the linker to add all symbols, not only used ones, to the dynamic symbol table. This option is needed for some uses of dlopen or to allow obtaining backtraces from within a program

我机器上的输出:

my_variable @0x401010 42

关于c++ - 在 C++ 中使用符号表按名称引用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31258965/

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