Linker and Loader(链接与加载)学习笔记---编译与链接前言

链接与加载的作用: 

  链接器:将不同部分的代码与数据收集起来,组成一个可加载,可执行的文件。

  加载器:把可执行文件从外存装入内存并进行执行。

GCC编译过程如下:

  源程序->预处理->编译->汇编->链接->可执行文件

  预处理的主要工作:(Gcc -E 预编译命令,生成.i文件)

    主要处理源代码中以 # 开头的预编译指令

  编译的主要工作:    (Gcc -S 编译命令,生成.s文件)

    词法分析,语法分析,语义分析,代码优化,生成汇编文件

  汇编的主要工作:    (Gcc -c 编译命令,生成.o文件)

    将汇编代码转化为机器指令

  链接的主要工作:    (Gcc -ld )

  编译过程的主要步骤如下:

    1、扫描 2、语法分析 3、语义分析 4、源代码优化 5、代码生成 6、目标代码优化

静态链接:

  链接过程主要包括 1、地址与空间分配 2、符号决议 3、重定位

  最基本的链接过程如下所示    

  

 

  每个模块的源代码文件(.c)经过编译器生成目标文件(.o),并和库一起链接起来形成最终的可执行文件。最常见的库是(Runtime 库)。

  链接具体干的事情以下面的例子简要描述(写完发现写了个反例~)。

    假设现在我们有文件main.c(包含调用math.c的add函数内容)和math.c(包含add(a,b)函数)

    编译器编译main.c时,它不知道add函数的地址。那么编译器暂时把调用add函数的命令暂时搁置,等待最后链接的时候

  由链接器去将这些指令的目标地址修正。如果没有连接器,我们则需要把每个调用add函数的命令修正,填入正确的add函数的地址。如果math.c中的

  add函数地址发生改变时,那么在main.c文件中用到的add的地址的指令将要全部调整,这对于执行人来说,简直是噩梦。

 

posted @ 2021-11-14 22:37  神龙逗勇士  阅读(466)  评论(0编辑  收藏  举报