オブジェクトファイルから任意のセクションを取り出す方法をメモ
どういうことか
以下のようにしてリソースをオブジェクトファイルに変換して使っているときに、オブジェクトファイルから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
  |