web-dev-qa-db-ja.com

ELFセクションの生のコンテンツのみを抽出する方法は?

私は次のことを試しましたが、結果のファイルはまだELFであり、純粋にセクションコンテンツではありません。

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

セクションのコンテンツが欲しいだけです。これを行うことができるユーティリティはありますか?何か案は?

26
mepcotterell

むしろ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は16進数をサポートしていないため、ddを作成してシェル用のddコマンドを生成しました。そして、コマンドをシェルに送りました。

以前は、ほとんど必要ないため、スクリプトを作成せずにすべてを手動で行いました。

19
Dummy00001

-O binary出力形式を使用します。

objcopy -O binary --only-section=.text foobar.elf foobar.text

avr-objcopyとAVR ELFイメージの.textセクションで検証されました。

Timが以下で指摘するように、セクションにALLOCフラグがない場合は、抽出するために--set-section-flags .text=allocを追加する必要がある場合があります。

47
ndim

objcopy --dump-section

Binutils 2.25で導入され、-O binary --only-sectionと同様の効果を達成します。

使用法:

objcopy --dump-section .text=output.bin input.o

https://sourceware.org/binutils/docs-2.25/binutils/objcopy.html 次のようにドキュメント化します:

--dump-section sectionname = filename

Sectionnameという名前のセクションの内容をファイルfilenameに配置し、以前存在していた可能性のある内容を上書きします。このオプションは--add-sectionの逆です。このオプションは、フォーマット済みファイルを作成せず、再配置を適用せずにコンテンツを未加工のバイナリデータとしてダンプすることを除いて、-only-sectionオプションに似ています。オプションは複数回指定できます。

最小限の実行可能な例

main.S

.data
    .byte 0x12, 0x34, 0x56, 0x78
.text
    .byte 0x9A, 0xBC, 0xDE, 0xF0

組み立てる:

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

Ubuntu 18.04 AMD64、Binutils 2.30でテスト済み。

すべてのセクションを別々のファイルにダンプします。

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
0
Zibri