アーキテクチャ不明のELFバイナリ調査 ではreadelfを使う


概要

  • クロスコンパイル環境のバイナリファイルでARM用か、x86用か混乱する場合がある。
  • クロスコンパイル環境のバイナリファイルのダイナミックリンクを調査したいがlddは使えない。
  • ELF形式であれば、アーキテクチャ問わずreadelfで調査できる。

readelf

  • ubuntuではbintutilsに含まれる。
$ apt-file search /usr/bin/readelf 
binutils: /usr/bin/readelf

ファイルヘッダの確認

ARMプロセッサ用バイナリ

$ readelf -h paho_cs_sub
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 (実行可能ファイル)
  マシン:                            ARM
  バージョン:                        0x1
  エントリポイントアドレス:               0x111a4
  プログラムの開始ヘッダ:          52 (バイト)
  セクションヘッダ始点:          25904 (バイト)
  フラグ:                            0x5000200, Version5 EABI, soft-float ABI
  このヘッダのサイズ:                52 (バイト)
  プログラムヘッダサイズ:            32 (バイト)
  プログラムヘッダ数:                9
  セクションヘッダ:                  40 (バイト)
  セクションヘッダサイズ:            30
  セクションヘッダ文字列表索引:      29

x86-64バイナリ

ELF ヘッダ:
  マジック:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  クラス:                            ELF64
  データ:                            2 の補数、リトルエンディアン
  バージョン:                        1 (current)
  OS/ABI:                            UNIX - System V
  ABI バージョン:                    0
  型:                                DYN (共有オブジェクトファイル)
  マシン:                            Advanced Micro Devices X86-64
  バージョン:                        0x1
  エントリポイントアドレス:               0x1690
  プログラムの開始ヘッダ:          64 (バイト)
  セクションヘッダ始点:          29464 (バイト)
  フラグ:                            0x0
  このヘッダのサイズ:                64 (バイト)
  プログラムヘッダサイズ:            56 (バイト)
  プログラムヘッダ数:                9
  セクションヘッダ:                  64 (バイト)
  セクションヘッダサイズ:            29
  セクションヘッダ文字列表索引:      28

ダイナミックリンクの確認

ARMプロセッサ用バイナリ

$ readelf -d paho_cs_sub
Dynamic section at offset 0x4efc contains 27 entries:
  タグ        タイプ                       名前/値
 0x00000001 (NEEDED)                     共有ライブラリ: [libpaho-mqtt3cs.so.1]
 0x00000001 (NEEDED)                     共有ライブラリ: [libc.so.6]
 0x00000001 (NEEDED)                     共有ライブラリ: [ld-linux.so.3]
 0x0000001d (RUNPATH)                    ライブラリの runpath: [/home/tetsuo/paho.mqtt.arm.c/src:/home/tetsuo/arm/usr/lib:]
 0x0000000c (INIT)                       0x10f5c
 0x0000000d (FINI)                       0x13a0c
 0x00000019 (INIT_ARRAY)                 0x24ef0
 0x0000001b (INIT_ARRAYSZ)               4 (バイト)
 0x0000001a (FINI_ARRAY)                 0x24ef4
 0x0000001c (FINI_ARRAYSZ)               4 (バイト)
 0x6ffffef5 (GNU_HASH)                   0x101ac
 0x00000005 (STRTAB)                     0x10910
 0x00000006 (SYMTAB)                     0x10430
 0x0000000a (STRSZ)                      992 (バイト)
 0x0000000b (SYMENT)                     16 (バイト)
 0x00000015 (DEBUG)                      0x0
 0x00000003 (PLTGOT)                     0x25000
 0x00000002 (PLTRELSZ)                   368 (バイト)
 0x00000014 (PLTREL)                     REL
 0x00000017 (JMPREL)                     0x10dec
 0x00000011 (REL)                        0x10dcc
 0x00000012 (RELSZ)                      32 (バイト)
 0x00000013 (RELENT)                     8 (バイト)
 0x6ffffffe (VERNEED)                    0x10d8c
 0x6fffffff (VERNEEDNUM)                 2
 0x6ffffff0 (VERSYM)                     0x10cf0
 0x00000000 (NULL)                       0x0

x86-64バイナリ

Dynamic section at offset 0x5c60 contains 29 entries:
  タグ        タイプ                       名前/値
 0x0000000000000001 (NEEDED)             共有ライブラリ: [libpaho-mqtt3cs.so.1]
 0x0000000000000001 (NEEDED)             共有ライブラリ: [libc.so.6]
 0x000000000000001d (RUNPATH)            ライブラリの runpath: [/tmp/build.paho/src:]
 0x000000000000000c (INIT)               0x13b8
 0x000000000000000d (FINI)               0x3fa4
 0x0000000000000019 (INIT_ARRAY)         0x205c50
 0x000000000000001b (INIT_ARRAYSZ)       8 (バイト)
 0x000000000000001a (FINI_ARRAY)         0x205c58
 0x000000000000001c (FINI_ARRAYSZ)       8 (バイト)
 0x000000006ffffef5 (GNU_HASH)           0x298
 0x0000000000000005 (STRTAB)             0xa30
 0x0000000000000006 (SYMTAB)             0x370
 0x000000000000000a (STRSZ)              902 (バイト)
 0x000000000000000b (SYMENT)             24 (バイト)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x205e70
 0x0000000000000002 (PLTRELSZ)           1008 (バイト)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0xfc8
 0x0000000000000007 (RELA)               0xe78
 0x0000000000000008 (RELASZ)             336 (バイト)
 0x0000000000000009 (RELAENT)            24 (バイト)
 0x000000000000001e (FLAGS)              BIND_NOW
 0x000000006ffffffb (FLAGS_1)            フラグ: NOW PIE
 0x000000006ffffffe (VERNEED)            0xe48
 0x000000006fffffff (VERNEEDNUM)         1
 0x000000006ffffff0 (VERSYM)             0xdb6
 0x000000006ffffff9 (RELACOUNT)          7
 0x0000000000000000 (NULL)               0x0