オブジェクトファイルのセクションを取り出す。

Posted on

オブジェクトファイルから任意のセクションを取り出す方法をメモ

どういうことか

以下のようにしてリソースをオブジェクトファイルに変換して使っているときに、オブジェクトファイルから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