C语言编译链接机制深度解析
📚 共计 30 章节
01
编译概述
C语言从源码到可执行文件的完整旅程,预处理、编译、汇编、链接四阶段概览。
四阶段
总览
02
预处理详解
头文件包含(#include)、宏定义(#define)、条件编译(#ifdef/#ifndef)、#pragma指令。
宏
头文件
03
编译原理
词法分析、语法分析、语义分析、中间代码生成、优化、目标代码生成。
词法
语法
优化
04
汇编阶段
汇编器的作用,从汇编代码到机器码(.o/.obj文件),符号表的生成。
汇编器
符号表
05
链接基础
链接器的角色,静态链接与动态链接的区别,符号解析与重定位。
静态
动态
重定位
06
目标文件格式
ELF(linux)与PE(windows)格式详解,节区(section)与段(segment)。
ELF
PE
节区
07
符号与符号表
全局符号、局部符号、外部符号,强符号与弱符号,符号表结构。
强符号
弱符号
08
重定位机制
重定位表,绝对地址重定位与相对地址重定位,重定位类型。
绝对地址
相对地址
09
静态链接
静态库(.a/.lib)的创建与使用,归档器(ar)工具,链接顺序问题。
静态库
ar
10
动态链接
共享库(.so/.dll)的原理,位置无关代码(PIC),全局偏移表(GOT)与过程链接表(PLT)。
PIC
GOT
PLT
11
加载器与运行时
程序加载过程,动态链接器/加载器(ld.so),延迟绑定。
ld.so
延迟绑定
12
内存布局
代码段、数据段、BSS段、堆、栈,各段在编译链接时的分配。
BSS
堆栈
13
变量存储类别
auto、register、static、extern,链接属性与作用域。
static
extern
14
函数调用约定
cdecl、stdcall、fastcall,栈帧结构,参数传递与返回值。
cdecl
stdcall
15
内联汇编
GCC内联汇编语法,约束条件,在C中嵌入汇编代码。
GCC
约束
16
编译优化
O0/O1/O2/O3/Os等级,常见优化技术(内联、循环展开、常量传播)。
O3
内联
循环展开
17
调试信息
DWARF格式,-g选项,符号调试与源码映射。
DWARF
-g
18
链接脚本
ld链接脚本语法,内存区域定义,节区放置规则。
ld
脚本
19
可执行文件格式
ELF可执行文件结构,程序头表,入口点。
ELF
入口点
20
库依赖与搜索路径
-L与-l选项,LD_LIBRARY_PATH,rpath与runpath。
rpath
LD_LIBRARY_PATH
21
符号可见性
__attribute__((visibility)),导出与隐藏符号,版本脚本。
visibility
版本脚本
22
C与C++链接
名字修饰(name mangling),extern "C",ABI兼容性。
name mangling
extern "C"
23
多文件项目管理
Makefile基础,增量编译,头文件依赖自动生成。
Makefile
增量编译
24
预编译头
PCH原理,加速编译的技巧,使用注意事项。
PCH
加速
25
LTO(链接时优化)
Link Time Optimization原理,WHOPR,优缺点分析。
LTO
WHOPR
26
地址空间布局随机化
ASLR原理,对编译链接的影响,PIE与PIC。
ASLR
PIE
27
交叉编译
交叉工具链,目标平台配置,sysroot与库移植。
交叉工具链
sysroot
28
常见链接错误
未定义引用、多重定义、符号冲突,诊断与解决。
未定义
多重定义
29
二进制分析工具
readelf、objdump、nm、ldd、strace的使用。
readelf
objdump
nm
30
综合实战
从零构建一个小型C项目,完整走通编译链接全流程。
实战
全流程