オブジェクトファイルから任意のセクションを取り出す方法をメモ
どういうことか
以下のようにしてリソースをオブジェクトファイルに変換して使っているときに、オブジェクトファイルからlogo.png
を取り出してみる。
1
|
$ objcopy -I binary -O elf32-i386 -B i386 logo.png logo.png.o
|
ちなみに生成されているlogo.png.o
の内容は以下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
$ 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
がオフセットとなる。
1
2
3
4
5
6
7
8
|
$ 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読み飛ばす)
1
2
3
4
5
6
7
8
|
$ 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で良いやん
1
|
$ objcopy -O binary --only-section .data logo.png.o logo.png.extract
|