我编译了一个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
如何解决?
答案 0 :(得分:2)
首先,您提到您只需要.text
部分 - 出于运行时执行的目的?这是不正确的:如果那个hello函数的内部字符串是硬编码的,那么所有这些字符串都将位于.rodata
部分内,那么你是否会忽略这一部分?
.eh_frame
适用于调试器,我认为不需要.comment
,但也需要.data
。
另一个问题是重定位表 - 如果要将动态加载到某个任意内存区域,那么函数中的许多区域可能需要修补.....请检查ELF的objdump -r
找出是否有任何重定位条目。如果没有,你是安全的。
此外,函数内的任何内容都声明为" const"也将进入.rodata
部分 - 当然是全球数据。函数本地的变量或常量在堆栈上。并且所有全局数据都位于.data
部分内。
但回到原始错误,原因是因为原始网址中的示例3没有交叉引用(.interp
部分),因此objdump -s
不会出错。您的案例.text
确实与.rodata
部分有交叉引用,但在您仅提取.text
部分后无法使用。