基本上标题是什么。
稍微不熟悉C++
,以及更高级的概念,例如符号表,我已经在线查看了它,但我正在努力寻找任何指向我最终目标的方向。我见过的大部分教程都迎合了C,而我发现的最接近的问题(here)让我陷入困境,因为我已经尝试编译它,但是我没有得到预期的结果,我对extern "C"
的工作原理并不太了解。
到此结束时,我希望能够从符号表中访问变量,并更改变量。我玩过nm
和objdump
(来自硬件背景,看起来很酷),我调查了dlsym
,dlopen
等。但是我不确定这对我有什么帮助(特别是因为我已经看到它在C中使用它比其他任何东西都多)。
任何建议或小段代码(因此我可以编写自己的示例程序)都会很棒。只是补充说,这是在Linux系统上有一些过时的G ++版本(我现在不在机器上,所以我没有这些信息),我现在无法升级它。
答案 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