深入理解计算机系统 --第7章 链接

        链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储器并执行。

      

1、编译过程:

1.预编译

替换宏定义和外部文件的引用(例如 #define  和  #include)

[xyk@xyk linking]$ gcc -E main.c -o main.i

2.编译

将c语言或者c++语言翻译成汇编语言
[xyk@xyk linking]$ gcc -S main.i -o man.s

3.汇编

将汇编语言使用汇编器,编译成机器语言

[xyk@xyk linking]$ gcc -c main.s -o main.o

4.链接

将多个目标文件链接到一起,生成可执行的程序
[xyk@xyk linking]$ gcc -o p main.o

 

可记忆为:ISO 

 

2、静态链接

      静态链接器:以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。

链接器必须完成两个主要任务:

     1.符号解析:目标文件定义和引用符号。符号解析的目的是将每个符号的引用刚好和一个符号定义联系起来。

     2.重定位:编译器和汇编器生成从地址0开始的代码和数据节。链接器通过把每个符号定义与一个存储器位置联系起来,然后修改所有对这些符号的引用,使得它们指向这个存储器位置,从而重定位这些节。

 

 

3、目标文件

目标文件有三种形式:

     1.可重定位目标文件:可理解为经过汇编器后的生成的.o文件或者静态库文件

     2.可执行目标文件:可理解为经过静态链接的可执行文件。

     3.共享目标文件:可理解为动态库文件

在不同的操作系统中,目标文件的格式都不相同,在Linux系统中使用ELF(excutable and linkable format)格式,而在window NT中使用PE(portable executable)格式。

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(计算机)