我尝试了以下内容,但生成的文件仍然是ELF,而不仅仅是部分内容。
$ objcopy --only-section=<name> <infile> <outfile>
我只想要该部分的内容。有没有可以做到这一点的实用程序?有什么想法吗?
答案 0 :(得分:47)
使用-O binary
输出格式:
objcopy -O binary --only-section=.text foobar.elf foobar.text
刚刚使用avr-objcopy
和AVR ELF图片的.text
部分进行了验证。
请注意,如果Tim指出,您的部分没有ALLOC标记,则可能需要添加--set-section-flags .text=alloc
才能将其解压缩。
答案 1 :(得分:19)
围绕objdump
和dd
而非优雅的黑客攻击:
IN_F=/bin/echo
OUT_F=./tmp1.bin
SECTION=.text
objdump -h $IN_F |
grep $SECTION |
awk '{print "dd if='$IN_F' of='$OUT_F' bs=1 count=$[0x" $3 "] skip=$[0x" $6 "]"}' |
bash
objdump -h
生成可预测的输出,其中包含elf文件中的节偏移量。我让awk
为shell生成dd
命令,因为dd
不支持十六进制数字。并将命令提供给shell。
过去我手动完成了所有操作,没有制作任何脚本,因为很少需要它。
答案 2 :(得分:14)
<强> -O binary --only-section
强>
在Binutils 2.25中引入,并实现与objcopy --dump-section .text=output.bin input.o
类似的效果。
用法:
.data
.byte 0x12, 0x34, 0x56, 0x78
.text
.byte 0x9A, 0xBC, 0xDE, 0xF0
https://sourceware.org/binutils/docs-2.25/binutils/objcopy.html将其记录为:
- dump-section sectionname = filename
将名为sectionname的部分的内容放入文件filename中,覆盖之前可能存在的任何内容。此选项与--add-section相反。此选项类似于--only-section选项,除了它不创建格式化文件,它只是将内容转储为原始二进制数据,而不应用任何重定位。该选项可以多次指定。
最小可运行示例
main.S
as -o main.o main.S
组装:
objcopy --dump-section .data=data.bin main.o
hd data.bin
提取数据:
00000000 12 34 56 78 |.4Vx|
00000004
输出:
objcopy --dump-section .text=text.bin main.o
hd text.bin
提取文字:
00000000 9a bc de f0 |....|
00000004
输出:
Toast.makeText(MainActivity.this, "Network isn't available", Toast.LENGTH_LONG).show();
在Ubuntu 18.04 amd64,Binutils 2.30。
中测试答案 3 :(得分:0)
将所有部分转储到单独的文件中。
readelf -a filename|grep "NULL\|LOAD"| (x=0;while read a;do echo "$x $a"|awk '{print "dd if=143 of=filename.section."$1" bs=1 skip=$((" $3")) count=$(("$6"))"}';let x=x+1;done)|bash