【问题标题】:objcopy: fails to copy a particular section (`.rodata' required but not present [...])objcopy:无法复制特定部分(`.rodata' 需要但不存在 [...])
【发布时间】:2014-06-15 20:50:48
【问题描述】:

我编译了一个 Hello World C 文件,只需要它的一个部分(只有 hello world 函数)。

编译后的文件格式为elf32-i386,包含4个部分:.rodata.text.hello.comment.eh_frame

我尝试使用 objcopy 仅提取 .text.hello 部分:http://www.thegeekstuff.com/2013/01/objcopy-examples/ 示例 3。

失败,报告:

BFD: hello_new: symbol `.rodata' required but not present
objcopy:hello_new: No symbols

如何解决?

【问题讨论】:

    标签: c objcopy


    【解决方案1】:

    首先,您提到您只需要 .text 部分 - 用于运行时执行?这是不对的:如果那个 hello 函数里面有硬编码的字符串,那么所有这些字符串都将位于 .rodata 部分内,所以你要忽略这个部分吗?

    .eh_frame 用于调试器,.comment 我认为不需要,但.data 也是需要的。

    另一件事是重定位表 - 如果函数要动态加载到某个任意内存区域,那么函数内部的很多区域可能需要修补.....检查您的 ELF 的objdump -r 以找到如果有任何重定位条目,则退出。如果没有,你是安全的。

    此外,函数内声明为“const”的任何内容也将进入.rodata 部分 - 当然是全局数据。函数本地的变量或常量在堆栈上。所有全局数据都位于.data 部分内。

    但是回到原来的错误,原因是因为原始URL中的示例3没有交叉引用(.interp部分),因此objdump -s不会有错误。您的情况,.text 确实有对 .rodata 部分的交叉引用,但在您仅提取 .text 部分后不可用。

    【讨论】:

      猜你喜欢
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 2018-05-14
      相关资源
      最近更新 更多