1

我编译了一个 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

如何解决?

4

1 回答 1

2

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

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

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

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

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

于 2014-08-09T07:57:07.927 回答