---
title: "完整编译流程"
---
graph LR
A[源文件 *.c / *.cpp] --> B[预处理器 生成*.i]
B --> C[编译器前端 生成*.s]
C --> D[汇编器 生成*.o目标文件]
D --> E[链接器 生成可执行文件]
E --> F[程序 a.out / exe]
---
title: "完整编译流程"
---
graph LR
A[源文件 *.c / *.cpp] --> B[预处理器 生成*.i]
B --> C[编译器前端 生成*.s]
C --> D[汇编器 生成*.o目标文件]
D --> E[链接器 生成可执行文件]
E --> F[程序 a.out / exe]
---
title: "完整编译流程"
---
graph LR
A[源文件 *.c / *.cpp] --> B[预处理器 生成*.i]
B --> C[编译器前端 生成*.s]
C --> D[汇编器 生成*.o目标文件]
D --> E[链接器 生成可执行文件]
E --> F[程序 a.out / exe]
---
title: "完整编译流程"
---
graph LR
A[源文件 *.c / *.cpp] --> B[预处理器 生成*.i]
B --> C[编译器前端 生成*.s]
C --> D[汇编器 生成*.o目标文件]
D --> E[链接器 生成可执行文件]
E --> F[程序 a.out / exe]
---
title: "编译器前端详细流程"
---
graph LR
A[预处理后的代码 *.i] --> B[词法分析器 Token序列]
B --> C[语法分析器 抽象语法树AST]
C --> D[语义分析器 带类型信息的AST]
D --> E[中间代码生成 中间表示IR]
E --> F[代码优化器 优化后的IR]
F --> G[目标代码生成]
G --> H[汇编代码 *.s]
---
title: "编译器前端详细流程"
---
graph LR
A[预处理后的代码 *.i] --> B[词法分析器 Token序列]
B --> C[语法分析器 抽象语法树AST]
C --> D[语义分析器 带类型信息的AST]
D --> E[中间代码生成 中间表示IR]
E --> F[代码优化器 优化后的IR]
F --> G[目标代码生成]
G --> H[汇编代码 *.s]
---
title: "编译器前端详细流程"
---
graph LR
A[预处理后的代码 *.i] --> B[词法分析器 Token序列]
B --> C[语法分析器 抽象语法树AST]
C --> D[语义分析器 带类型信息的AST]
D --> E[中间代码生成 中间表示IR]
E --> F[代码优化器 优化后的IR]
F --> G[目标代码生成]
G --> H[汇编代码 *.s]
---
title: "编译器前端详细流程"
---
graph LR
A[预处理后的代码 *.i] --> B[词法分析器 Token序列]
B --> C[语法分析器 抽象语法树AST]
C --> D[语义分析器 带类型信息的AST]
D --> E[中间代码生成 中间表示IR]
E --> F[代码优化器 优化后的IR]
F --> G[目标代码生成]
G --> H[汇编代码 *.s]
ELF Header:
Magic: 7f 45 4c 46020101000000000000000000 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: 1096(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: 16 Section header string table index: 15
# 使用readelf命令,结合 -S查看节表sections,可以看到 .text, .rela.text, .data, .bss等# 并且能看到每个section的地址对齐,文件偏移,大小,类型(PROGBITS,RELA,PROGBITS,NOBITS等)There are 16 section headers, starting at offset 0x448:
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 00000000000000000000000000000000000000000000000000000000000[ 1] .text PROGBITS 000000000000000000000040 000000000000003f 0000000000000000 AX 001[ 2] .rela.text RELA 0000000000000000 000002f8
00000000000000600000000000000018 I 1318[ 3] .data PROGBITS 00000000000000000000008000000000000000080000000000000000 WA 004[ 4] .bss NOBITS 00000000000000000000008800000000000000040000000000000000 WA 004[ 5] .rodata PROGBITS 00000000000000000000008800000000000000240000000000000000 A 001[ 6] .data.rel.local PROGBITS 0000000000000000 000000b0
00000000000000100000000000000000 WA 008[ 7] .rela.data.r[...] RELA 00000000000000000000035800000000000000300000000000000018 I 1368[ 8] .comment PROGBITS 0000000000000000 000000c0
000000000000002e 0000000000000001 MS 001[ 9] .note.GNU-stack PROGBITS 0000000000000000 000000ee
00000000000000000000000000000000001[10] .note.gnu.pr[...] NOTE 0000000000000000 000000f0
00000000000000200000000000000000 A 008[11] .eh_frame PROGBITS 00000000000000000000011000000000000000580000000000000000 A 008[12] .rela.eh_frame RELA 00000000000000000000038800000000000000300000000000000018 I 13118[13] .symtab SYMTAB 000000000000000000000168000000000000013800000000000000181468[14] .strtab STRTAB 0000000000000000 000002a0
00000000000000570000000000000000001[15] .shstrtab STRTAB 0000000000000000 000003b8
00000000000000890000000000000000001Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
D (mbind), l (large), p (processor specific)
查看符号表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看符号表,在最右边那一列看到了我们上面C代码中自己定义的:global_var,local_static,my_add,call_ext等以及他们的类型Symbol table '.symtab' contains 13 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000000000000 NOTYPE LOCAL DEFAULT UND
1: 00000000000000000 FILE LOCAL DEFAULT ABS sample.c
2: 00000000000000000 SECTION LOCAL DEFAULT 1 .text
3: 00000000000000000 SECTION LOCAL DEFAULT 3 .data
4: 00000000000000000 SECTION LOCAL DEFAULT 5 .rodata
5: 00000000000000044 OBJECT LOCAL DEFAULT 3 local_static
6: 00000000000000004 OBJECT GLOBAL DEFAULT 3 global_var
7: 00000000000000004 OBJECT GLOBAL DEFAULT 4 uninit_var
8: 00000000000000008 OBJECT GLOBAL DEFAULT 6 message
9: 00000000000000088 OBJECT GLOBAL DEFAULT 6 message2
10: 000000000000000040 FUNC GLOBAL DEFAULT 1 my_add
11: 000000000000002823 FUNC GLOBAL DEFAULT 1 call_ext
12: 00000000000000000 NOTYPE GLOBAL DEFAULT UND ext_func