第五章:动态链接
第五章:动态链接
5.1 为什么要动态链接
静态链接的缺点
静态链接存在以下问题:
- 空间浪费
- 更新困难
- 内存占用大
示例代码:
1 | #include <stdio.h> |
1 | #include <stdio.h> |
编译和链接命令:
1 | # 创建静态库 |
动态链接的优势
动态链接的优点:
- 节省空间
- 便于更新
- 共享内存
示例代码:
1 | #include <stdio.h> |
1 | #include <stdio.h> |
编译和链接命令:
1 | # 创建动态库 |
5.2 动态链接的实现
动态链接的基本实现
动态链接的基本步骤:
- 加载动态库
- 符号解析
- 重定位
示例代码:
1 | #include <stdio.h> |
编译和运行命令:
1 | # 编译 |
动态链接的细节
动态链接的细节包括:
- 符号解析
- 重定位
- 延迟绑定
示例代码:
1 | #include <stdio.h> |
编译和运行命令:
1 | # 编译 |
动态链接的优化
动态链接的优化技术:
- 符号预解析
- 共享库缓存
- 延迟加载
示例代码:
1 | #include <stdio.h> |
编译和运行命令:
1 | # 编译 |
实践练习
- 动态库创建实验
1 | # 创建动态库 |
- 动态链接实验
1 | # 创建主程序 |
- 延迟绑定实验
1 | # 查看延迟绑定信息 |
思考题
- 动态链接相比静态链接有哪些优势?
- 动态链接的基本实现步骤是什么?
- 什么是延迟绑定?它有什么作用?
- 如何优化动态链接的性能?
- 动态链接可能带来哪些问题?
参考资料
- 《程序员的自我修养:链接、装载与库》
- 动态链接器文档
- ELF 文件格式规范
- GNU Binutils 文档
- System V ABI