链接是将代码和数据合成一个文件的一个过程,生成的文件可以直接拷贝到存储器中并且执行。
链接可以在程序编译时,加载时,甚至运行时执行。
1.编译器的驱动程序
编译器系统中包含编译驱动程序,驱动程序主要包含:预处理器,编译器,汇编器和连接器。
处理过程如下:
预处理器 编译器 汇编器
main.c------------------>main.i----------------------->main.s------------------->main.o
swap.c------------------>swap.i----------------------->swap.s------------------->swap.o
链接器
swap.o +main.o ----------------->exe文件
2.目标文件
可重定位的目标文件 包含二进制代码和数据,比如main.o就是典型的可重定位目标文件
可执行的目标文件 包含二进制代码和数据,可拷贝到存储器或者直接执行,比如exe文件
共享目标文件 一种特殊的可重定位目标文件,加载或者运行时被动态加载到存储器并链接。
3.链接的作用
符号解析:符合解析就是把每个符合引用和一个符号定义联系起来。(最典型的是在一个cpp文件中定义的全局变量,在另外一个cpp文件使用)
重定位:
4.可重定位目标文件

.text :已编译的机器代码
.rodata 只读数据
.data: 已初始化的全局变量
.bss 未初始化的全局变量
.systab 符号表,用来存放程序中定义和引用的函数和全局变量的信息
.rel.text
.rel.data
5.符号和符号表
符号表中定义了main.o中定义和引用的符合的信息。有三种不同的符号:
a.由main.o中定义并能够被其他程序引用
b.只被模块main.o定义和引用的本地符号
c.由其他模块定义,并且被main.o中引用
本地变量和本地程序变量
本地变量一般是指全局变量,还有一些在函数中定义的static变量
本地程序变量一般是指函数中的临时变量,这些变量由栈来维护。
在函数中声明静态的变量,比如
int test()
{
static int x=0;(个人认为,这里的x就相当于是全局变量,只不过不能被其他函数访问)
return x;
}
在这里编译器会在.data节中为x分配一个空间
3790

被折叠的 条评论
为什么被折叠?



