次のことを試しましたが、結果のファイルはまだELFであり、純粋にセクションのコンテンツではありません。
$ objcopy --only-section=<name> <infile> <outfile>
セクションの内容が欲しいだけです。これを行うことができるユーティリティはありますか?何か案は?
-O binary
出力形式を使用します。
objcopy -O binary --only-section=.text foobar.elf foobar.text
avr-objcopy
とAVRELF画像の.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 = 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、Binutils2.30でテスト済み。
むしろエレガントでないハック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ファイルのセクションオフセットを含む予測可能な出力を生成します。16進数をサポートしていないため、シェルのコマンドawk
を生成するように作成しました。そして、コマンドをシェルに送りました。dd
dd
以前は、スクリプトが必要になることはめったにないため、スクリプトを作成せずにすべてを手動で実行していました。
すべてのセクションを別々のファイルにダンプします。
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