链接是什么?
- 定义: 把多个代码和数据片段组合成单一文件的过程;
- 编译时链接: 源代码翻译成机器代码后立即链接;
- 加载时链接: 程序被加载器加载到内存时链接;
- 运行时链接: 应用程序运行过程中才链接;
- 好处: 支持分离编译, 修改一个模块只需重新编译该模块;
目标文件有哪几种?
| 类型 | 用途 |
|---|
| 可重定位目标文件 | 可在编译时与其他可重定位目标文件合并 |
| 可执行目标文件 | 可以直接复制到内存执行 |
| 共享目标文件 | 可在加载时或运行时动态加载到内存并链接 |
符号和符号表是什么?
- 符号表: 位于可重定位目标模块中, 记录本模块定义和引用的符号信息;
- 全局符号: 非静态的函数和全局变量;
- 外部符号: 其他模块定义的全局符号;
- 局部符号: 静态函数和静态全局变量, 不能被其他模块引用;
静态链接器的主要任务是什么?
- 符号解析: 把每个符号引用关联到唯一的符号定义;
- 重定位: 合并各个节并分配运行时地址, 再把符号引用改为指向该地址;
可执行目标文件怎样被加载运行?
- 形式: 二进制文件;
- 加载器: 一段系统代码, 把可执行文件的代码和数据从磁盘复制到内存;
- 启动: 跳转到入口点, 即程序的第一条指令;
静态库有什么缺点?
- 维护成本: 静态库更新后, 使用它的程序必须重新链接才能用上新版本;
- 空间浪费: 多个程序链接同一静态库时, 相同代码在内存中被重复复制;
共享库和动态链接解决什么问题?
- 共享库: 又称共享模块, 是一种特殊的可重定位目标文件;
- 动态链接: 在加载时或运行时把共享库加载到内存的任意地址并与程序链接, 由动态链接器完成;
- 收益: 多个进程可以共享内存中同一份库代码, 且库更新后无需重新链接程序;