基本上是标题所要求的。
由于对C++和符号表等更高级的概念有些不熟悉,我在网上查看了它,但我很难找到指向我最终目标的方向。我看到的大多数教程都迎合了C,而我发现的最接近的问题(这里)使我陷入了困境,因为我已经尝试过编译它,但我并没有得到想要的结果,而且我还不太确定extern "C"是如何工作的。
在此结束时,我希望能够访问符号表中的变量,并更改该变量。我玩过nm和objdump (来自硬件背景,看上去肯定很酷),我研究了dlsym、dlopen等等,但我不知道这对我有什么帮助(尤其是因为我在C中看到它比其他任何东西都多)。
任何建议或小的代码片段(这样我就可以编写我自己的示例程序)都是很棒的。补充一句,这是在一个G++的过时版本的Linux系统上(我现在不在机器上,所以我没有这些信息),而且我现在没有权限升级它。
发布于 2015-07-07 03:16:53
下面是一个示例程序,演示如何使用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"位防止名称残缺,确保符号表条目只是传递给dlsym()的"my_variable"文本。您不能使用extern "C"并提供一个损坏的名称,但这将是编译器特有的。
要编译代码,请使用:
g++ x.cc -o x -ldl -rdynamic-ldl是dlsym的库,-rdynamic要求不丢弃看似未使用的变量的符号信息(参见这里):
-rdynamic在支持-export-dynamic的目标上将标志-export-dynamic传递给ELF链接器。这将指示链接器向动态符号表中添加所有符号,而不仅仅是使用的符号。此选项用于dlopen的某些用途,或允许从程序中获取回溯。
我的机器上的输出:
my_variable @0x401010 42发布于 2015-07-07 03:22:58
@TonyD基本上是正确的答案。有关如何使用共享库的更详细讨论,请参见这是一个相当不错的教程。
https://stackoverflow.com/questions/31258965
复制相似问题