【问题标题】:How to read .rodata from linked object files?如何从链接的目标文件中读取 .rodata?
【发布时间】: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:是的,这行得通。我自己也发现了,但如果你想发布它,我会接受你的回答。

标签: c++ linker g++


【解决方案1】:

看起来无论__foo 包含什么,它都不是一个有效的指针。如果您对 __foo 本身的内容感兴趣,请将其声明为 extern char __foo[] 并转储。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-24
    • 2014-10-24
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    相关资源
    最近更新 更多