オブジェクトファイルから任意のセクションを取り出す方法をメモ
どういうことか
以下のようにしてリソースをオブジェクトファイルに変換して使っているときに、オブジェクトファイルからlogo.png
を取り出してみる。
$ objcopy -I binary -O elf32-i386 -B i386 logo.png logo.png.o
ちなみに生成されているlogo.png.o
の内容は以下。
$ objdump -x logo.png.o logo.png.o: file format elf32-i386 logo.png.o architecture: i386, flags 0x00000010: HAS_SYMS start address 0x00000000 Sections: Idx Name Size VMA LMA File off Algn 0 .data 00000f03 00000000 00000000 00000034 2**0 CONTENTS, ALLOC, LOAD, DATA SYMBOL TABLE: 00000000 l d .data 00000000 .data 00000000 g .data 00000000 _binary_logo_png_start 00000f03 g .data 00000000 _binary_logo_png_end 00000f03 g *ABS* 00000000 _binary_logo_png_size
ファイルの内容を確認して切り出す
ヘッダからバイナリの大きさとオフセットを確認する。Size
が大きさ、File off
がオフセットとなる。
$ gobjdump -h logo.png.o logo.png.o: ファイル形式 elf32-i386 セクション: 索引名 サイズ VMA LMA File off Algn 0 .data 00000f03 00000000 00000000 00000034 2**0 CONTENTS, ALLOC, LOAD, DATA
切り出しに必要なパラメータが分かったのでdd
で切り出す。
- 切り出す大きさ: 0xf03 Bytes
- 切り出す領域の開始地点: ファイル先頭から0x35 Bytes(0x34 Bytes読み飛ばす)
$ dd if=logo.png.o of=logo.png.extract bs=1 count=0xf03 skip=0x34 3843+0 records in 3843+0 records out 3843 bytes transferred in 0.016074 secs (239079 bytes/sec) $ ls logo.png logo.png.extract logo.png.o $ diff logo.png logo.png.extract; echo $? 0
objcopyで良いやん
$ objcopy -O binary --only-section .data logo.png.o logo.png.extract