在系统上运行程序¶
约 394 个字 预计阅读时间 2 分钟
链接¶
- gcc 编译链接程序:cpp 预处理器预处理源文件,cc1 编译器编译.i 文件为.S 文件,as 汇编器将.S 文件变为可重定位目标文件.o,最后运行 ld 链接器,创建一个可执行程序
- 执行./a.out,shell 调用加载器函数,将可执行文件的.text 和.data 复制到内存并跳转到该程序开头
解析多重定义的全局符号¶
- 规则
1. 不允许多个同名的强符号
2. 如果有一个强符号和多个弱符号同名,选择弱符号
3. 如果有多个弱符号同名,选择其中任意一个 - 链接器不会表示检测到符号的多重定义
- 未初始化的全局变量交给 COMMON 段,将可能存在多重定义的变量交给链接器进行裁决
- 未初始化的静态变量,初始化为 0 的静态或全局变量在.bss 段;全局变量初始化为 0 是一个强符号
与静态链接库链接¶
- 链接器将只复制被程序引用的目标模块
动态链接共享库¶
- 链接器复制了.so 文件的重定位和符号表信息
- 在可执行文件加载后,存在.interp 节,加载动态链接器(ld-linux.so);动态链接器本身不能依赖任何动态库,所有它是静态链接的