KXH-WIKI
编译时
加载时
运行时
目标文件 (*.o)
- 可重定位目标文件:可以在编译时与其他可重定位目标文件合并,生成一个可执行目标文件;
- 可执行目标文件:可以直接复制到内存执行;
- 共享目标文件:特殊的可重定位目标文件,可以在加载时或运行时动态加载至内存并链接;
符号和符号表
符号表
- 位于可重定位目标模块;
- 包括可充定额外目标模块定义和引用符号信息;
三种符号
- 全局符号:非静态的函数和全局变量;
- 外部符号:其他模块的全局符号;
- 局部符号:静态的函数和全局变量,无法被其他模块引用;
静态链接
静态链接器
- 基于一组可重定位目标文件和命令行参数;
- 生成一个完全链接,可以加载和运行的可执行文件;
主要任务
- 符号解析;
- 符号:对应一个函数,变量;
- 将符号引用和符号定义关联;
- 重定位;
可执行目标文件
可执行目标文件
加载可执行目标文件
- 使用称为加载器的系统代码运行;
- 将可执行目标文件的代码和数据从磁盘复制到内存中;
- 跳转到程序的第一条指令或入口点运行;
动态链接共享库
静态库的缺点
- 需要定期维护和更新;
- 多次链接的静态库的相同代码重复复制到内存中,浪费内存空间;
共享库 (*.so) 和动态链接
- 共享库又称为共享模块;
- 在运行或加载时,实时加载至内存任意地址并与程序链接;
- 该过程称为动态链接,通过动态链接器执行;
- 允许多个进程共享内存中的相同的库代码;