objcopy:无法复制特定部分(`.rodata'必需但不存在[...])

时间:2014-06-15 20:50:48

标签: c objcopy

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

如何解决?

1 个答案:

答案 0 :(得分:2)

首先,您提到您只需要.text部分 - 出于运行时执行的目的?这是不正确的:如果那个hello函数的内部字符串是硬编码的,那么所有这些字符串都将位于.rodata部分内,那么你是否会忽略这一部分?

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

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

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

但回到原始错误,原因是因为原始网址中的示例3没有交叉引用(.interp部分),因此objdump -s不会出错。您的案例.text确实与.rodata部分有交叉引用,但在您仅提取.text部分后无法使用。