如何仅提取ELF部分的原始内容?

时间:2010-10-13 15:00:48

标签: linux shell elf binutils

我尝试了以下内容,但生成的文件仍然是ELF,而不仅仅是部分内容。

$ objcopy --only-section=<name> <infile> <outfile>

我只想要该部分的内容。有没有可以做到这一点的实用程序?有什么想法吗?

4 个答案:

答案 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)

围绕objdumpdd而非优雅的黑客攻击:

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