SSブログ

リンカスクリプト、ELFフォーマット、objdumpで遊ぶ

「12ステップで作る組み込みOS自作入門」で、リンカスクリプト、ELFフォーマットの勉強になった。
で、バイナリファイルの中身を知るのもなかなか楽しい。
objdumpも使って遊んでみる。
プログラムを動かす訳ではなく、どんな風なバイナリに生成されるのかだけ確認。


■test.c
int a = 10;

int main()
{
  return 0;
}

■ld.scr
OUTPUT_FORMAT("elf32-h8300")
OUTPUT_ARCH(h8300h)
ENTRY("_start")

SECTIONS
{
. = 0x0;

.text : {
*(.text)
}

.rodata : {
*(.strings)
*(.rodata)
*(.rodata.*)
}

.data : {
*(.data)
}

.bss : {
*(.bss)
*(COMMON)
}
}


h8のクロスコンパイル環境でビルドしてelfファイルを生成。
int a がどういう風に格納されているか見てみたい。

$ h8300-elf-readelf -a test.elf
・・・ 
 Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS     00000000 000074 00000e 00  AX  0   0  2
  [ 2] .data             PROGBITS     0000000e 000082 000002 00  WA  0   0  2
  [ 3] .comment           PROGBITS     00000000 000084 000011 01  MS  0   0  1
  [ 4] .shstrtab     STRTAB        00000000 000095 000030 00      0   0  1
  [ 5] .symtab           SYMTAB     00000000 0001e0 000080 10      6   5  4
  [ 6] .strtab           STRTAB        00000000 000260 000018 00      0   0  1
・・・
Symbol table '.symtab' contains 8 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 00000000     0 SECTION LOCAL  DEFAULT    1 
     2: 0000000e     0 SECTION LOCAL  DEFAULT    2 
     3: 00000000     0 SECTION LOCAL  DEFAULT    3 
     4: 00000000     0 FILE    LOCAL  DEFAULT  ABS test.c
     5: 0000000e     2 OBJECT  GLOBAL DEFAULT    2 _a
     6: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND _start
     7: 00000000    14 NOTYPE  GLOBAL DEFAULT    1 _main


_a がメモリマップ的に、0000000e に入り、セクションは .data 、ですねと。
で、初期値がちゃんと入ってるかというと。

$h8300-elf-objdump -s -j .data test.elf 

test.elf:     file format elf32-h8300

Contents of section .data:
 000e 000a        

000aで10が格納されてますねと。
というか、普通にディスアセンブルしてみる。

$h8300-elf-objdump -s -d test.elf 

test.elf:     file format elf32-h8300

Contents of section .text:
 0000 01006df6 0ff61900 01006d76 5470      ..m.......mvTp  
Contents of section .data:
 000e 000a                                 ..              
Contents of section .comment:
 0000 4743433a 2028474e 55292034 2e352e32  GCC: (GNU) 4.5.2
 0010 00                                   .               

Disassembly of section .text:

00000000 <_main>:
   0: 01 00 6d f6 mov.l er6,@-er7
   4: 0f f6       mov.l er7,er6
   6: 19 00       sub.w r0,r0
   8: 01 00 6d 76 mov.l @er7+,er6
   c: 54 70       rts


なるほどなるほど。
Contents of section .data:
ですね。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。