目标文件
下面用 readelf 工具读出目标文件 max.o 的 ELF Header 和 Section Header Table,然后我们逐段分析。
[test@localhost Assembler]$ readelf -a largest.o
ELF 头:
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 (可重定位文件)
Machine: Advanced Micro Devices X86-64
Version: 0x1
入口点地址: 0x0
程序头起点: 0 (bytes into file)
Start of section headers: 496 (bytes into file)
标志: 0x0
本头的大小: 64 (字节)
程序头大小: 0 (字节)
Number of program headers: 0
节头大小: 64 (字节)
节头数量: 8
字符串表索引节头: 5
...
ELF Header 中描述了操作系统是 UNIX,体系结构是 Advanced Micro Devices X86-64。Section Header Table 中有 8 个 Section Header,从文件地址 496(0x1f0) 开始,每个 Section Header 占 64 字节,共 512 字节,到文件地址 0x3f0 结束。这个目标文件没有 Program Header。文件地址是这样定义的:文件开头第一个字节的地址是 0 ,然后每个字节占一个地址。
...
节头:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .text PROGBITS 0000000000000000 00000040
000000000000002d 0000000000000000 AX 0 0 1
[ 2] .rela.text RELA 0000000000000000 000001c0
0000000000000030 0000000000000018 I 6 1 8
[ 3] .data PROGBITS 0000000000000000 0000006d
0000000000000038 0000000000000000 WA 0 0 1
[ 4] .bss NOBITS 0000000000000000 000000a5
0000000000000000 0000000000000000 WA 0 0 1
[ 5] .shstrtab STRTAB 0000000000000000 000000a5
0000000000000031 0000000000000000 0 0 1
[ 6] .symtab SYMTAB 0000000000000000 000000d8
00000000000000c0 0000000000000018 7 7 8
[ 7] .strtab STRTAB 0000000000000000 00000198
0000000000000028 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