链接-简介

来源:互联网 发布:java socket gui 实例 编辑:程序博客网 时间:2024/06/05 20:11

链接是将代码和数据合成一个文件的一个过程,生成的文件可以直接拷贝到存储器中并且执行。

链接可以在程序编译时,加载时,甚至运行时执行。

 

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分配一个空间