首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用符号表按名称引用C++中的变量

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

Stack Overflow用户
提问于 2015-07-07 02:53:50
回答 2查看 1.2K关注 0票数 3

基本上是标题所要求的。

由于对C++和符号表等更高级的概念有些不熟悉,我在网上查看了它,但我很难找到指向我最终目标的方向。我看到的大多数教程都迎合了C,而我发现的最接近的问题(这里)使我陷入了困境,因为我已经尝试过编译它,但我并没有得到想要的结果,而且我还不太确定extern "C"是如何工作的。

在此结束时,我希望能够访问符号表中的变量,并更改该变量。我玩过nmobjdump (来自硬件背景,看上去肯定很酷),我研究了dlsymdlopen等等,但我不知道这对我有什么帮助(尤其是因为我在C中看到它比其他任何东西都多)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-07 03:16:53

下面是一个示例程序,演示如何使用dlsym查找符号:

代码语言:javascript
运行
复制
#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"并提供一个损坏的名称,但这将是编译器特有的。

要编译代码,请使用:

代码语言:javascript
运行
复制
g++ x.cc -o x -ldl -rdynamic

-ldldlsym的库,-rdynamic要求不丢弃看似未使用的变量的符号信息(参见这里):

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

我的机器上的输出:

代码语言:javascript
运行
复制
my_variable @0x401010 42
票数 4
EN

Stack Overflow用户

发布于 2015-07-07 03:22:58

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31258965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档