计算机系统第七章:链接
链接的概念:将各种代码和数据片段收集并组合成为一个单一文件的过程·,这个文件可被加载(复制)到内存并执行。
链接是由叫做连接器的程序自动执行的。
7.1 编译器驱动程序
大多数编译系统提供编译器驱动程序,它代表用户在需要时调用语言预处理器、编译器、汇编器和链接器。
main.c–>main.i–>main.s–>main.o
7.2静态链接
为了构造可执行文件,链接器必须完成的主要任务:
1.符号解析,目的是将每个符号引用正好和一个符号定义关联起来。
2.重定位。
7.3目标文件
三种形式:
1.可重定位目标文件
2.可执行目标文件
3.共享目标文件
7.4可重定位目标文件
7.5符号和符号表
三种不同的符号:
1.由模块m定义并能被其他模块引用的全局符号
2.由其他模块定义并被模块m引用的全局符号
3.只能模块m定义和引用的局部符号
7.6符号解析
Linux连接器处理多重定义的符号名的规则:
1.不允许有多个同名的强符号
2.如果有一个强符号和多个弱符号同名,那么选择强符号
3.如果有多个弱符号同名,那么从这些弱符号中任选一个
笔记总结
1.尽量少定义全局变量,规则1、2会坑你,定义了全局最好要初始化
2.库文件要放在命令行的最后面
3.symtab:符号表,存放程序中定义和引用的函数和全局变量信息,不包含局部变量条目。