在 C++ 中使用符号 Table 按名称引用变量

Reference a variable by name in C++ by using Symbol Table

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

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

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

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

下面是一个示例程序,展示了如何使用 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,确保符号 table 条目只是传递给 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

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