【发布时间】:2021-05-06 10:24:10
【问题描述】:
我正在尝试访问 C/C++ 程序中的外部链接数据段。
#include <iostream>
extern void *__foo;
int main(int argc, char **argv)
{
const char *foo = reinterpret_cast<const char *>(__foo);
std::cout << std::addressof(foo) << std::endl;
std::cout << foo[0] << std::endl;
return 0;
}
用objdump -t bar.o得到的符号表如下
0000000000000000 g O .rodata 0000000000004d05 __foo
并且编译后的可执行文件的符号表如下
000000000004a9c1 g O .rodata 0000000000004d05 __foo
编译并执行程序后,我收到以下结果
0x7ffe616dbb30
Segmentation fault (core dumped)
Valgrind 提供以下输出
0x1ffefffec0
==14359== Invalid read of size 1
==14359== at 0x11B5CF: main (main.cc:9)
==14359== Address 0x4cfd is not stack'd, malloc'd or (recently) free'd
==14359==
==14359==
valgrind 错误是有道理的,因为数据部分确实不是由程序分配的,但由于我只是试图读取数据,我相信我应该能够访问它。
如何阅读此数据部分?
【问题讨论】:
-
您还应该显示定义
__foo的代码及其值(换句话说:请minimal reproducible example)。 -
@dratenik 不幸的是我不能这样做,因为我无权访问该文件的源代码。
-
你有理由相信
__foo包含指向某物的指针吗?似乎它包含字节fd 4c 00 00 00... 如果被解释为指针,这些字节就会出错。 -
或者你想转储
__foo本身?在这种情况下,只需将其声明为extern char __foo[]并打印其内容。 -
@dratenik:是的,这行得通。我自己也发现了,但如果你想发布它,我会接受你的回答。