概要
- クロスコンパイル環境のバイナリファイルで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