链接过程
Step1:将全局变量、函数定义为symbol,生成relocatable object file(.o file)
Step2:将不同relocatable object file合并到同一个executable file(可直接拷贝进入内存执行,加载到0x40000000位置)中,并将symbol用内存中的实际地址替换。
ELF
.test段:存放代码
.rodata段:只读数据
.data段:已初始化的全局变量、静态变量
.bss段:未初始化的全局变量、静态变量,不占用空间
symbol
Strong symbol:初始化的全局变量、函数
Weak symbol:未初始化的全局变量
Rule:
- 不允许多个强符号同时出现
- 出现强符号和弱符号时选择强符号
- 出现多个弱符号时随机选择
动态库与静态库
静态库
相关函数被编译成独立的目标模块,单独封装成文件
编译时需要输入所有静态库
unix> ar rs libc.a atoi.o printf.o random.o
维护unresolve references列表,从左到右扫描时解决,如果扫描完毕,列表不为空会报错。
动态库
能够直接被加载如内存(.so文件,也叫DLL)