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

时间:2015-07-07 02:53:50

标签: c++ dlsym symbol-table

基本上标题是什么。

稍微不熟悉C++,以及更高级的概念,例如符号表,我已经在线查看了它,但我正在努力寻找任何指向我最终目标的方向。我见过的大部分教程都迎合了C,而我发现的最接近的问题(here)让我陷入困境,因为我已经尝试编译它,但是我没有得到预期的结果,我对extern "C"的工作原理并不太了解。

到此结束时,我希望能够从符号表中访问变量,并更改变量。我玩过nmobjdump(来自硬件背景,看起来很酷),我调查了dlsymdlopen等。但是我不确定这对我有什么帮助(特别是因为我已经看到它在C中使用它比其他任何东西都多)。

任何建议或小段代码(因此我可以编写自己的示例程序)都会很棒。只是补充说,这是在Linux系统上有一些过时的G ++版本(我现在不在机器上,所以我没有这些信息),我现在无法升级它。

2 个答案:

答案 0 :(得分:3)

以下是一个示例程序,演示如何使用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,确保符号表条目只是传递给"my_variable"的{​​{1}}文本。您无法使用dlsym()并提供受损的名称,但这将是特定于编译器的。

要编译代码,请使用:

extern "C"

g++ x.cc -o x -ldl -rdynamic -ldl的库,dlsym要求不丢弃看似未使用的变量的符号信息(请参阅here):

  

-rdynamic将标志-rdynamic传递给支持它的目标上的ELF链接器。这指示链接器将所有符号(不仅是已使用的符号)添加到动态符号表中。 -export-dynamic的某些用途需要此选项,或允许从程序中获取回溯

我机器上的输出:

dlopen

答案 1 :(得分:1)

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