エルフを読む


『ソードアート・オンライン』
映画もやるようですね。近い将来SAOのようなゲームシステムができたら、私は完全に引きこもりになるかもしれません。今はちゃんと会社行ってますが、平日は自宅との往復のみ、土日は自分を自宅に幽閉してるので半引きこもりです。ゲームの中で仕事ができる時代が来るのが本当に待ち遠しいです。そうですねえ、職業はアーチャー(弓矢使い)が良いでしょう。バーチャルな世界の中なので、安全ではあるのですが、さらにその中でも、より安全なアーチャーがいいです。こちらは相手を攻撃できるけども、相手はこちらを攻撃できません。容姿も変えられるので、美しいエルフとかになってみたいです。
ゲームといえども仕事になると、大変かもしれません。ああ、いろいろ考えたら、ゲームの中でもストレスはついてきそうです。敵は攻撃してこないけども、上司は怒ってくるに違いありません。でも、怒られそうになったら、ログアウトで避難すればいいので、心配要りませんね。

readelfっでELFファイルを読んでみましょう。まずは、-hでヘッダから。

takk@deb83:~$ readelf -h a.out
ELF ヘッダ:
  マジック:  7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  クラス:                            ELF32
  データ:                            2 の補数、リトルエンディアン
  バージョン:                        1 (current)
  OS/ABI:                            UNIX - System V
  ABI バージョン:                    0
  型:                                EXEC (実行可能ファイル)
  マシン:                            Intel 80386
  バージョン:                        0x1
  エントリポイントアドレス:          0x8048300
  プログラムの開始ヘッダ:            52 (バイト)
  セクションヘッダ始点:              10128 (バイト)
  フラグ:                            0x0
  このヘッダのサイズ:                52 (バイト)
  プログラムヘッダサイズ:            32 (バイト)
  プログラムヘッダ数:                8
  セクションヘッダ:                  40 (バイト)
  セクションヘッダサイズ:            35
  セクションヘッダ文字列表索引:      32
takk@deb83:~$ 

-sでシンボルが表示されます。

takk@deb83:~$ readelf -s a.out

シンボルテーブル '.dynsym' は 5 個のエントリから構成されています:
  番号:      値 サイズ タイプ  Bind   Vis      索引名
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 00000000     0 FUNC    GLOBAL DEFAULT  UND printf@GLIBC_2.0 (2)
     2: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
     3: 00000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.0 (2)
     4: 080493ac     4 OBJECT  GLOBAL DEFAULT   15 _IO_stdin_used

シンボルテーブル '.symtab' は 84 個のエントリから構成されています:
  番号:      値 サイズ タイプ  Bind   Vis      索引名
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 08048134     0 SECTION LOCAL  DEFAULT    1 
     2: 08048148     0 SECTION LOCAL  DEFAULT    2 
     3: 08048168     0 SECTION LOCAL  DEFAULT    3 
     4: 0804818c     0 SECTION LOCAL  DEFAULT    4 
     5: 080481ac     0 SECTION LOCAL  DEFAULT    5 
     6: 080481fc     0 SECTION LOCAL  DEFAULT    6 
     7: 08048248     0 SECTION LOCAL  DEFAULT    7 
     8: 08048254     0 SECTION LOCAL  DEFAULT    8 
     9: 08048274     0 SECTION LOCAL  DEFAULT    9 
    10: 0804827c     0 SECTION LOCAL  DEFAULT   10 
    11: 08048294     0 SECTION LOCAL  DEFAULT   11 
    12: 080482c0     0 SECTION LOCAL  DEFAULT   12 
    13: 08048300     0 SECTION LOCAL  DEFAULT   13 
    14: 08049394     0 SECTION LOCAL  DEFAULT   14 
    15: 080493a8     0 SECTION LOCAL  DEFAULT   15 
    16: 080493c0     0 SECTION LOCAL  DEFAULT   16 
    17: 0804943c     0 SECTION LOCAL  DEFAULT   17 
    18: 0804a634     0 SECTION LOCAL  DEFAULT   18 
    19: 0804a638     0 SECTION LOCAL  DEFAULT   19 
    20: 0804a63c     0 SECTION LOCAL  DEFAULT   20 
    21: 0804a640     0 SECTION LOCAL  DEFAULT   21 
    22: 0804a728     0 SECTION LOCAL  DEFAULT   22 
    23: 0804a72c     0 SECTION LOCAL  DEFAULT   23 
    24: 0804a744     0 SECTION LOCAL  DEFAULT   24 
    25: 0804a74c     0 SECTION LOCAL  DEFAULT   25 
    26: 00000000     0 SECTION LOCAL  DEFAULT   26 
    27: 00000000     0 SECTION LOCAL  DEFAULT   27 
    28: 00000000     0 SECTION LOCAL  DEFAULT   28 
    29: 00000000     0 SECTION LOCAL  DEFAULT   29 
    30: 00000000     0 SECTION LOCAL  DEFAULT   30 
    31: 00000000     0 SECTION LOCAL  DEFAULT   31 
    32: 00000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    33: 0804a63c     0 OBJECT  LOCAL  DEFAULT   20 __JCR_LIST__
    34: 08048340     0 FUNC    LOCAL  DEFAULT   13 deregister_tm_clones
    35: 08048370     0 FUNC    LOCAL  DEFAULT   13 register_tm_clones
    36: 080483b0     0 FUNC    LOCAL  DEFAULT   13 __do_global_dtors_aux
    37: 0804a74c     1 OBJECT  LOCAL  DEFAULT   25 completed.6279
    38: 0804a638     0 OBJECT  LOCAL  DEFAULT   19 __do_global_dtors_aux_fin
    39: 080483d0     0 FUNC    LOCAL  DEFAULT   13 frame_dummy
    40: 0804a634     0 OBJECT  LOCAL  DEFAULT   18 __frame_dummy_init_array_
    41: 00000000     0 FILE    LOCAL  DEFAULT  ABS hello.c
    42: 00000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    43: 08049630     0 OBJECT  LOCAL  DEFAULT   17 __FRAME_END__
    44: 0804a63c     0 OBJECT  LOCAL  DEFAULT   20 __JCR_END__
    45: 00000000     0 FILE    LOCAL  DEFAULT  ABS 
    46: 0804a638     0 NOTYPE  LOCAL  DEFAULT   18 __init_array_end
    47: 0804a640     0 OBJECT  LOCAL  DEFAULT   21 _DYNAMIC
    48: 0804a634     0 NOTYPE  LOCAL  DEFAULT   18 __init_array_start
    49: 0804a72c     0 OBJECT  LOCAL  DEFAULT   23 _GLOBAL_OFFSET_TABLE_
    50: 08049390     2 FUNC    GLOBAL DEFAULT   13 __libc_csu_fini
    51: 0804907c    47 FUNC    GLOBAL DEFAULT   13 clcd_print
    52: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTab
    53: 08048330     4 FUNC    GLOBAL HIDDEN    13 __x86.get_pc_thunk.bx
    54: 0804a744     0 NOTYPE  WEAK   DEFAULT   24 data_start
    55: 00000000     0 FUNC    GLOBAL DEFAULT  UND printf@@GLIBC_2.0
    56: 0804a74c     0 NOTYPE  GLOBAL DEFAULT   24 _edata
    57: 0804912c    80 FUNC    GLOBAL DEFAULT   13 get_clock_string
    58: 08049394     0 FUNC    GLOBAL DEFAULT   14 _fini
    59: 08048881  2043 FUNC    GLOBAL DEFAULT   13 clcd_init
    60: 0804a744     0 NOTYPE  GLOBAL DEFAULT   24 __data_start
    61: 0804878b   246 FUNC    GLOBAL DEFAULT   13 write_data
    62: 080490ab   129 FUNC    GLOBAL DEFAULT   13 to_string
    63: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
    64: 0804a748     0 OBJECT  GLOBAL HIDDEN    24 __dso_handle
    65: 08048416    27 FUNC    GLOBAL DEFAULT   13 _delay_ms
    66: 080493ac     4 OBJECT  GLOBAL DEFAULT   15 _IO_stdin_used
    67: 08048552   268 FUNC    GLOBAL DEFAULT   13 display_clear
    68: 080483fb    27 FUNC    GLOBAL DEFAULT   13 _delay_us
    69: 08048431   289 FUNC    GLOBAL DEFAULT   13 display_onoff
    70: 00000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@@GLIBC_
    71: 0804865e   301 FUNC    GLOBAL DEFAULT   13 entry_mode_set
    72: 0804a74d     1 OBJECT  GLOBAL DEFAULT   25 PORTB
    73: 08049320    97 FUNC    GLOBAL DEFAULT   13 __libc_csu_init
    74: 0804a750     0 NOTYPE  GLOBAL DEFAULT   25 _end
    75: 08048300     0 FUNC    GLOBAL DEFAULT   13 _start
    76: 080493a8     4 OBJECT  GLOBAL DEFAULT   15 _fp_hw
    77: 0804a74e     1 OBJECT  GLOBAL DEFAULT   25 DDRB
    78: 0804a74c     0 NOTYPE  GLOBAL DEFAULT   25 __bss_start
    79: 0804917c   410 FUNC    GLOBAL DEFAULT   13 main
    80: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
    81: 0804a74c     0 OBJECT  GLOBAL HIDDEN    24 __TMC_END__
    82: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable
    83: 08048294     0 FUNC    GLOBAL DEFAULT   11 _init
takk@deb83:~$ 

関数一覧を抽出するには、FUNCでフィルタリングすれば良いです。

takk@deb83:~$ readelf -s a.out | awk '/FUNC/{print $8}'
printf@GLIBC_2.0
__libc_start_main@GLIBC_2.0
deregister_tm_clones
register_tm_clones
__do_global_dtors_aux
frame_dummy
__libc_csu_fini
clcd_print
__x86.get_pc_thunk.bx
printf@@GLIBC_2.0
get_clock_string
_fini
clcd_init
write_data
to_string
_delay_ms
display_clear
_delay_us
display_onoff
__libc_start_main@@GLIBC_
entry_mode_set
__libc_csu_init
_start
main
_init
takk@deb83:~$ 

コメント

タイトルとURLをコピーしました