readelfコマンドはELFファイルについての情報を表示するコマンドになります。
ELFはExecutable and Linkable Formatの略でコンパイラが生成するオブジェクトファイルや実行ファイルで利用されているファイルフォーマットになります。
目次
ヘッダー情報を表示
(-eオプション)
-eオプションは、ヘッダー情報としてELFヘッダー情報・プログラムヘッダー情報・セクションヘッダー情報を表示できます。
このオプションは-hオプション(ELFヘッダー情報)、-lオプション(プログラムヘッダー情報)、-Sオプション(セクションヘッダー情報)をすべて指定した動作と同じになります。
また、-Wオプション(--wideオプション)は1行80文字に合わせて改行しないようにするオプションになります。
コマンド例
1 |
readelf -e -W a.out |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x400430 Start of program headers: 64 (bytes into file) Start of section headers: 6808 (bytes into file) Flags: 0x0 Size of this header: 64 (bytes) Size of program headers: 56 (bytes) Number of program headers: 9 Size of section headers: 64 (bytes) Number of section headers: 31 Section header string table index: 28 Section Headers: [Nr] Name Type Address Off Size ES Flg Lk Inf Al [ 0] NULL 0000000000000000 000000 000000 00 0 0 0 [ 1] .interp PROGBITS 0000000000400238 000238 00001c 00 A 0 0 1 [ 2] .note.ABI-tag NOTE 0000000000400254 000254 000020 00 A 0 0 4 [ 3] .note.gnu.build-id NOTE 0000000000400274 000274 000024 00 A 0 0 4 [ 4] .gnu.hash GNU_HASH 0000000000400298 000298 00001c 00 A 5 0 8 [ 5] .dynsym DYNSYM 00000000004002b8 0002b8 000060 18 A 6 1 8 [ 6] .dynstr STRTAB 0000000000400318 000318 00003d 00 A 0 0 1 [ 7] .gnu.version VERSYM 0000000000400356 000356 000008 02 A 5 0 2 [ 8] .gnu.version_r VERNEED 0000000000400360 000360 000020 00 A 6 1 8 [ 9] .rela.dyn RELA 0000000000400380 000380 000018 18 A 5 0 8 [10] .rela.plt RELA 0000000000400398 000398 000030 18 AI 5 24 8 [11] .init PROGBITS 00000000004003c8 0003c8 00001a 00 AX 0 0 4 [12] .plt PROGBITS 00000000004003f0 0003f0 000030 10 AX 0 0 16 [13] .plt.got PROGBITS 0000000000400420 000420 000008 00 AX 0 0 8 [14] .text PROGBITS 0000000000400430 000430 0001c2 00 AX 0 0 16 [15] .fini PROGBITS 00000000004005f4 0005f4 000009 00 AX 0 0 4 [16] .rodata PROGBITS 0000000000400600 000600 000016 00 A 0 0 4 [17] .eh_frame_hdr PROGBITS 0000000000400618 000618 00004c 00 A 0 0 4 [18] .eh_frame PROGBITS 0000000000400668 000668 000154 00 A 0 0 8 [19] .init_array INIT_ARRAY 0000000000600e10 000e10 000008 00 WA 0 0 8 [20] .fini_array FINI_ARRAY 0000000000600e18 000e18 000008 00 WA 0 0 8 [21] .jcr PROGBITS 0000000000600e20 000e20 000008 00 WA 0 0 8 [22] .dynamic DYNAMIC 0000000000600e28 000e28 0001d0 10 WA 6 0 8 [23] .got PROGBITS 0000000000600ff8 000ff8 000008 08 WA 0 0 8 [24] .got.plt PROGBITS 0000000000601000 001000 000028 08 WA 0 0 8 [25] .data PROGBITS 0000000000601028 001028 000010 00 WA 0 0 8 [26] .bss NOBITS 0000000000601038 001038 000008 00 WA 0 0 1 [27] .comment PROGBITS 0000000000000000 001038 000034 01 MS 0 0 1 [28] .shstrtab STRTAB 0000000000000000 001985 00010c 00 0 0 1 [29] .symtab SYMTAB 0000000000000000 001070 0006d8 18 30 50 8 [30] .strtab STRTAB 0000000000000000 001748 00023d 00 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings), l (large) I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown) O (extra OS processing required) o (OS specific), p (processor specific) Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align PHDR 0x000040 0x0000000000400040 0x0000000000400040 0x0001f8 0x0001f8 R E 0x8 INTERP 0x000238 0x0000000000400238 0x0000000000400238 0x00001c 0x00001c R 0x1 [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] LOAD 0x000000 0x0000000000400000 0x0000000000400000 0x0007bc 0x0007bc R E 0x200000 LOAD 0x000e10 0x0000000000600e10 0x0000000000600e10 0x000228 0x000230 RW 0x200000 DYNAMIC 0x000e28 0x0000000000600e28 0x0000000000600e28 0x0001d0 0x0001d0 RW 0x8 NOTE 0x000254 0x0000000000400254 0x0000000000400254 0x000044 0x000044 R 0x4 GNU_EH_FRAME 0x000618 0x0000000000400618 0x0000000000400618 0x00004c 0x00004c R 0x4 GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0x10 GNU_RELRO 0x000e10 0x0000000000600e10 0x0000000000600e10 0x0001f0 0x0001f0 R 0x1 Section to Segment mapping: Segment Sections... 00 01 .interp 02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .plt.got .text .fini .rodata .eh_frame_hdr .eh_frame 03 .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss 04 .dynamic 05 .note.ABI-tag .note.gnu.build-id 06 .eh_frame_hdr 07 08 .init_array .fini_array .jcr .dynamic .got |
ELFヘッダー情報を表示
(-hオプション)
-hオプションを用いると、ELFヘッダー情報を表示できます。
コマンド例
1 |
readelf -h prog.o |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: REL (Relocatable file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x0 Start of program headers: 0 (bytes into file) Start of section headers: 712 (bytes into file) Flags: 0x0 Size of this header: 64 (bytes) Size of program headers: 0 (bytes) Number of program headers: 0 Size of section headers: 64 (bytes) Number of section headers: 12 Section header string table index: 9 |
プログラムヘッダー情報を表示
(-lオプション)
-lオプションを用いて実行ファイルを指定するとプログラムヘッダー情報を表示できます。
また、-Wオプションを用いると1行80文字になるように改行しなくなります。
コマンド例
1 |
readelf -l -W a.out |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
Elf file type is EXEC (Executable file) Entry point 0x400430 There are 9 program headers, starting at offset 64 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align PHDR 0x000040 0x0000000000400040 0x0000000000400040 0x0001f8 0x0001f8 R E 0x8 INTERP 0x000238 0x0000000000400238 0x0000000000400238 0x00001c 0x00001c R 0x1 [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] LOAD 0x000000 0x0000000000400000 0x0000000000400000 0x0007bc 0x0007bc R E 0x200000 LOAD 0x000e10 0x0000000000600e10 0x0000000000600e10 0x000228 0x000230 RW 0x200000 DYNAMIC 0x000e28 0x0000000000600e28 0x0000000000600e28 0x0001d0 0x0001d0 RW 0x8 NOTE 0x000254 0x0000000000400254 0x0000000000400254 0x000044 0x000044 R 0x4 GNU_EH_FRAME 0x000618 0x0000000000400618 0x0000000000400618 0x00004c 0x00004c R 0x4 GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0x10 GNU_RELRO 0x000e10 0x0000000000600e10 0x0000000000600e10 0x0001f0 0x0001f0 R 0x1 Section to Segment mapping: Segment Sections... 00 01 .interp 02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .plt.got .text .fini .rodata .eh_frame_hdr .eh_frame 03 .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss 04 .dynamic 05 .note.ABI-tag .note.gnu.build-id 06 .eh_frame_hdr 07 08 .init_array .fini_array .jcr .dynamic .got |
セクションヘッダー情報を表示
(-Sオプション)
-Sオプションを用いるとセクションヘッダー情報を表示できます。
また、-Wオプションを用いると1行80文字になるように改行しなくなります。
コマンド例
1 |
readelf -S -W prog.o |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
There are 12 section headers, starting at offset 0x2c8: Section Headers: [Nr] Name Type Address Off Size ES Flg Lk Inf Al [ 0] NULL 0000000000000000 000000 000000 00 0 0 0 [ 1] .text PROGBITS 0000000000000000 000040 00001a 00 AX 0 0 1 [ 2] .rela.text RELA 0000000000000000 000208 000048 18 I 10 1 8 [ 3] .data PROGBITS 0000000000000000 00005a 000000 00 WA 0 0 1 [ 4] .bss NOBITS 0000000000000000 00005a 000000 00 WA 0 0 1 [ 5] .comment PROGBITS 0000000000000000 00005a 000035 01 MS 0 0 1 [ 6] .note.GNU-stack PROGBITS 0000000000000000 00008f 000000 00 0 0 1 [ 7] .eh_frame PROGBITS 0000000000000000 000090 000038 00 A 0 0 8 [ 8] .rela.eh_frame RELA 0000000000000000 000250 000018 18 I 10 7 8 [ 9] .shstrtab STRTAB 0000000000000000 000268 000059 00 0 0 1 [10] .symtab SYMTAB 0000000000000000 0000c8 000120 18 11 8 8 [11] .strtab STRTAB 0000000000000000 0001e8 00001f 00 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings), l (large) I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown) O (extra OS processing required) o (OS specific), p (processor specific) |
セクションの詳細を表示
(-tオプション)
-tオプションを用いると暗黙的に-SオプションがONになり、セクションごとの内容が詳細に表示されます。
また、-Wオプションを用いると1行80文字になるように改行しなくなります。
コマンド例
1 |
readelf -t -W prog.o |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
There are 12 section headers, starting at offset 0x2c8: Section Headers: [Nr] Name Type Address Off Size ES Lk Inf Al Flags [ 0] NULL 0000000000000000 000000 000000 00 0 0 0 [0000000000000000]: [ 1] .text PROGBITS 0000000000000000 000040 00001a 00 0 0 1 [0000000000000006]: ALLOC, EXEC [ 2] .rela.text RELA 0000000000000000 000208 000048 18 10 1 8 [0000000000000040]: INFO LINK [ 3] .data PROGBITS 0000000000000000 00005a 000000 00 0 0 1 [0000000000000003]: WRITE, ALLOC [ 4] .bss NOBITS 0000000000000000 00005a 000000 00 0 0 1 [0000000000000003]: WRITE, ALLOC [ 5] .comment PROGBITS 0000000000000000 00005a 000035 01 0 0 1 [0000000000000030]: MERGE, STRINGS [ 6] .note.GNU-stack PROGBITS 0000000000000000 00008f 000000 00 0 0 1 [0000000000000000]: [ 7] .eh_frame PROGBITS 0000000000000000 000090 000038 00 0 0 8 [0000000000000002]: ALLOC [ 8] .rela.eh_frame RELA 0000000000000000 000250 000018 18 10 7 8 [0000000000000040]: INFO LINK [ 9] .shstrtab STRTAB 0000000000000000 000268 000059 00 0 0 1 [0000000000000000]: [10] .symtab SYMTAB 0000000000000000 0000c8 000120 18 11 8 8 [0000000000000000]: [11] .strtab STRTAB 0000000000000000 0001e8 00001f 00 0 0 1 [0000000000000000]: |
シンボルテーブルを表示
(-sオプション)
-sオプションを用いるとシンボルテーブルを表示できます。objdumpコマンドの-tオプションと比較すると、readelfコマンドの-sオプションはセクションが-Sオプションで番号付けされている数字で表記されます。
コマンド例
1 |
readelf -s -W prog.o |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Symbol table '.symtab' contains 12 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 FILE LOCAL DEFAULT ABS prog.c 2: 0000000000000000 0 SECTION LOCAL DEFAULT 1 3: 0000000000000000 0 SECTION LOCAL DEFAULT 3 4: 0000000000000000 0 SECTION LOCAL DEFAULT 4 5: 0000000000000000 0 SECTION LOCAL DEFAULT 6 6: 0000000000000000 0 SECTION LOCAL DEFAULT 7 7: 0000000000000000 0 SECTION LOCAL DEFAULT 5 8: 0000000000000000 26 FUNC GLOBAL DEFAULT 1 main 9: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND func1 10: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND func2 11: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND func3 |
動的シンボルテーブルを表示
(--dyn-symsオプション)
--dyn-symsオプションを用いると動的シンボルテーブルを表示できます。
コマンド例
1 |
readelf --dyn-syms -W func.so |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Symbol table '.dynsym' contains 16 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000590 0 SECTION LOCAL DEFAULT 9 2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTable 3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.2.5 (2) 4: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__ 5: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses 6: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable 7: 0000000000000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@GLIBC_2.2.5 (2) 8: 00000000000006e0 19 FUNC GLOBAL DEFAULT 12 func1 9: 0000000000201028 0 NOTYPE GLOBAL DEFAULT 23 _edata 10: 0000000000201030 0 NOTYPE GLOBAL DEFAULT 24 _end 11: 00000000000006f3 19 FUNC GLOBAL DEFAULT 12 func2 12: 0000000000201028 0 NOTYPE GLOBAL DEFAULT 24 __bss_start 13: 0000000000000590 0 FUNC GLOBAL DEFAULT 9 _init 14: 0000000000000706 19 FUNC GLOBAL DEFAULT 12 func3 15: 000000000000071c 0 FUNC GLOBAL DEFAULT 13 _fini |
リロケーション情報を表示
(-rオプション)
-rオプションを用いるとリロケーション情報を表示できます。
コマンド例
1 |
readelf -r -W prog.o |
実行結果
1 2 3 4 5 6 7 8 9 |
Relocation section '.rela.text' at offset 0x208 contains 3 entries: Offset Info Type Symbol's Value Symbol's Name + Addend 0000000000000005 0000000900000002 R_X86_64_PC32 0000000000000000 func1 - 4 000000000000000a 0000000a00000002 R_X86_64_PC32 0000000000000000 func2 - 4 000000000000000f 0000000b00000002 R_X86_64_PC32 0000000000000000 func3 - 4 Relocation section '.rela.eh_frame' at offset 0x250 contains 1 entries: Offset Info Type Symbol's Value Symbol's Name + Addend 0000000000000020 0000000200000002 R_X86_64_PC32 0000000000000000 .text + 0 |
動的セクションを表示
(-dオプション)
-dオプションを用いると動的セクションを表示できます。
コマンド例
1 |
readelf -d -W a.out |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Dynamic section at offset 0xe28 contains 24 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x000000000000000c (INIT) 0x4003c8 0x000000000000000d (FINI) 0x4005f4 0x0000000000000019 (INIT_ARRAY) 0x600e10 0x000000000000001b (INIT_ARRAYSZ) 8 (bytes) 0x000000000000001a (FINI_ARRAY) 0x600e18 0x000000000000001c (FINI_ARRAYSZ) 8 (bytes) 0x000000006ffffef5 (GNU_HASH) 0x400298 0x0000000000000005 (STRTAB) 0x400318 0x0000000000000006 (SYMTAB) 0x4002b8 0x000000000000000a (STRSZ) 61 (bytes) 0x000000000000000b (SYMENT) 24 (bytes) 0x0000000000000015 (DEBUG) 0x0 0x0000000000000003 (PLTGOT) 0x601000 0x0000000000000002 (PLTRELSZ) 48 (bytes) 0x0000000000000014 (PLTREL) RELA 0x0000000000000017 (JMPREL) 0x400398 0x0000000000000007 (RELA) 0x400380 0x0000000000000008 (RELASZ) 24 (bytes) 0x0000000000000009 (RELAENT) 24 (bytes) 0x000000006ffffffe (VERNEED) 0x400360 0x000000006fffffff (VERNEEDNUM) 1 0x000000006ffffff0 (VERSYM) 0x400356 0x0000000000000000 (NULL) 0x0 |
バージョン情報の表示
(-Vオプション)
-Vオプションを用いるとバージョンについてのセクションでの情報を表示できます。
コマンド例
1 |
readelf -V -W a.out |
実行結果
1 2 3 4 5 6 7 8 |
Version symbols section '.gnu.version' contains 4 entries: Addr: 0000000000400356 Offset: 0x000356 Link: 5 (.dynsym) 000: 0 (*local*) 2 (GLIBC_2.2.5) 2 (GLIBC_2.2.5) 0 (*local*) Version needs section '.gnu.version_r' contains 1 entries: Addr: 0x0000000000400360 Offset: 0x000360 Link: 6 (.dynstr) 000000: Version: 1 File: libc.so.6 Cnt: 1 0x0010: Name: GLIBC_2.2.5 Flags: none Version: 2 |