3

基本上是标题所要求的。

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

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

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

4

2 回答 2

4

这是一个示例程序,展示了如何使用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"位防止名称修改,确保符号表条目只是"my_variable"传递给的文本dlsym()。您不能使用extern "C"和提供一个错位的名称,但这将是特定于编译器的。

要编译代码,请使用:

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

是的-ldldlsym,并-rdynamic要求不要丢弃看似未使用的变量的符号信息(请参见此处):

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

我机器上的输出:

my_variable @0x401010 42
于 2015-07-07T03:16:53.343 回答
1

@TonyD 基本上有正确的答案。有关如何使用共享库的更详细讨论,这是一个相当不错的教程

于 2015-07-07T03:22:58.853 回答