如何从链接的目标文件中读取 .rodata?

How to read .rodata from linked object files?

我正在尝试访问 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得到的符号table有如下

0000000000000000 g O .rodata 0000000000004d05 __foo

而编译后executable的符号table有如下

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 包含的任何内容都不是有效指针。如果您对 __foo 本身的内容感兴趣,请将其声明为 extern char __foo[] 并转储它。