ELF
ELF は readelf コマンドで閲覧することができる。以下は、/bin/sleep のヘッダーを表示した例。Entry point address が、実行プログラム内のエントリポイントの位置を示している。
code:shell
ubuntu:~$ readelf -h /bin/sleep
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: 0x401760
Start of program headers: 64 (bytes into file)
Start of section headers: 29552 (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: 29
Section header string table index: 28
コードおよびデータのオフセット、サイズ、開始アドレスを知るには -S オプションを利用する。この出力は、ヘッダーに示されているように二行で1組になっている。NAME が .text なのがコード領域、.data なのがデータ領域の情報。
code:shell
ubuntu:~$ readelf -S /bin/sleep
There are 29 section headers, starting at offset 0x7370:
Section Headers:
Nr Name Type Address Offset Size EntSize Flags Link Info Align
0 NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0
1 .interp PROGBITS 0000000000400238 00000238 000000000000001c 0000000000000000 A 0 0 1
# 中略
13 .plt.got PROGBITS 00000000004014d0 000014d0 0000000000000008 0000000000000000 AX 0 0 8
14 .text PROGBITS 00000000004014e0 000014e0 0000000000003319 0000000000000000 AX 0 0 16
15 .fini PROGBITS 00000000004047fc 000047fc 0000000000000009 0000000000000000 AX 0 0 4
# 中略
24 .got.plt PROGBITS 0000000000607000 00007000 00000000000001b0 0000000000000008 WA 0 0 8
25 .data PROGBITS 00000000006071c0 000071c0 0000000000000074 0000000000000000 WA 0 0 32
26 .bss NOBITS 0000000000607240 00007234 00000000000001c0 0000000000000000 WA 0 0 32
27 .gnu_debuglink PROGBITS 0000000000000000 00007234 0000000000000034 0000000000000000 0 0 1
28 .shstrtab STRTAB 0000000000000000 00007268 0000000000000102 0000000000000000 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)