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
にしました dd
を生成する dd
以降のシェルのコマンド 16 進数をサポートしていません。コマンドをシェルに送りました。
以前は、ほとんど必要ないため、スクリプトを作成せずにすべて手動で行っていました。
-O binary
を使用 出力形式:
objcopy -O binary --only-section=.text foobar.elf foobar.text
avr-objcopy
で検証済み および AVR ELF イメージの .text
Tim が以下で指摘しているように、セクションに ALLOC フラグがない場合は、--set-section-flags .text=alloc
を追加する必要があるかもしれないことに注意してください。
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=ファイル名
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 でテスト済み。