【问题标题】:Reference a variable by name in C++ by using Symbol Table使用符号表在 C++ 中按名称引用变量
【发布时间】:2015-09-24 08:58:49
【问题描述】:

基本上是标题所要求的。

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

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

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

【问题讨论】:

标签: c++ dlsym symbol-table


【解决方案1】:

这是一个示例程序,展示了如何使用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 将标志 -export-dynamic 传递给支持它的目标上的 ELF 链接器。这指示链接器将所有符号(不仅是使用的符号)添加到动态符号表中。 dlopen 的某些用途需要此选项,或者允许从程序中获取回溯

我的机器上的输出:

my_variable @0x401010 42

【讨论】:

  • 谢谢@TonyD,这正是我开始工作所需要的。
【解决方案2】:

@TonyD 基本上有正确的答案。有关如何使用共享库的更详细讨论,this is a pretty decent tutorial

【讨论】:

  • 感谢这个链接,@ricecake,肯定有助于更深入地了解函数和名称修改
猜你喜欢
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
相关资源
最近更新 更多