無料Wikiサービス | デモページ
Linuxなどのメモ書き

ELFファイルフォーマット


ELFファイルのフォーマットに関するメモ

+--------------------------+
| ELFヘッダ                |
| e_type                   | ET_REL,ET_EXEC,ET_DYN,ET_CORE
|                          | 
| e_phoff                  |プログラムヘッダテーブルのファイルオフセット
| e_shoff                  |セクションヘッダテーブルのファイルオフセット
|                          |
| e_shstrndx               |セクション名文字列テーブルに関連付けられたエントリ
|                          |のセクションヘッダテーブルインデックスを保持する。
+--------------------------+
+--------------------------+
| プログラムヘッダテーブル | セグメントを表す
|                          | セグメント には 1 つ以上の セクション が含まれる
|                          |
| p_vaddr                  | セグメント開始の仮想アドレス
|                          |
|                          |
+--------------------------+
|                          |
             :

+--------------------------+
| セクションヘッダテーブル | ファイル内の各セクションの情報を保存
|                          |
| sh_name                  | セクション名(セクションヘッダ文字列テーブル
|                          | セクションのインデクス)
| sh_type                  | SHT_SYMTAB, SHT_REL, SHT_STRTA...
+--------------------------+
|                          |
             :

+--------------------------+
| シンボルテーブル         | シンボル情報が列挙される
|                          |
|                          | 00000000 l    df *ABS*  00000000 ifload.c
|                          | 00000000 l    d  .text  00000000
|                          | 00000000 l    d  .data  00000000
|                          | 00000000 l    d  .bss   00000000
|                          | 00000000 l    d  .rodata.str1.4 00000000
|                          | 00000348 l     F .text  00000197 get_iflist
|                          | 000004e0 l     F .text  00000134 update_stats
|                          | 00000000         *UND*  00000000 stderr
|                          | 00000000         *UND*  00000000 fwrite
|                          |            :
+--------------------------+ *UND*が未解決シンボル

+--------------------------+
| 文字列テーブル           |

+--------------------------+
| 再配置テーブル           | 再配置必要な箇所が列挙される
|                          |
|                          | OFFSET   TYPE              VALUE
|                          | 00000008 R_386_32          stderr
|                          | 00000011 R_386_32          .rodata.str1.1
|                          | 00000016 R_386_PC32        fwrite
|                          | 0000001c R_386_32          stderr
|                          |            :
+--------------------------+

OFFSET 再配置動作が適用される位置(解決後のアドレスが書き込まれる場所)
       <--逆アセンブルしてみるとここのアドレスにはダミーのアドレス値
          が入っている。以下参照
TYPE   R_386_32,R_386_PC32
VALUE  参照先シンボル(実際にはシンボルテーブル内でのインデックス値)


00000000 <usage>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 08                sub    $0x8,%esp
   6:   ff 35 00 00 00 00       pushl  0x0             #0x08 stderr
   c:   6a 07                   push   $0x7
   e:   6a 01                   push   $0x1
  10:   68 00 00 00 00          push   $0x0            #0x11 .rodata.str1.1
  15:   e8 fc ff ff ff          call   16 <usage+0x16> #0x16 fwrite
  1a:   ff 35 00 00 00 00       pushl  0x0             #0x1c stderr
  20:   6a 0e                   push   $0xe
  22:   6a 01                   push   $0x1

最終更新 2006/06/23 22:22:17 - kztomita
(2006/06/23 22:22:17 作成)