程序设计的模块化是程序员一直追求的目标,因为当一个系统非常复杂的时候,我们就不得不把一个复杂的系统逐步分割成晓得系统以达到各个突破的目的。一个复杂软件的开发过程也如此;首先把每个源代码模块独立地编译,然后按照需要将他们“组装”起来,这个组装过的过程就是我们通常说的链接的过程。链接的主要内容就是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接。

链接器所做的工作和程序员“人工调整地址”本质上是一样的。只不过现代高级语言的诸多特性和功能,使得编译器、链接器更为复杂,功能更为强大。但是从原理上面讲,她的工作无非就是把一些指令对其他符号地址的引用加以修正。链接过程主要包括地址和空间分配(Address and Storage Allocation)、符号决议(Symbol Resolution)和重定位(Relocation)等这些步骤。

1.静态链接过程示意图

每个模块的源代码文件(如.c文件)经过编译器编译成目标文件(Object File,一般扩展名为.o或.obj文件)。目标文件与库(libarary)一起链接形成最终的可执行文件。而最常见的库就是运行时库(Runtime Library)。他是支持程序运行的基本函数集合。库其实是一组目标文件的包,就是一些最常用的代码编辑成目标文件后打包存放
注:对于object文件没有一个很合适的中文名称,我们把它称为中间目标文件还是比较合适的,简称为目标文件。

2.链接的内部执行过程

现代的链接和编译过程也并非想想中的那么复杂,他还是一个比较容易理解的概念。比如我们在程序模块main.c中使用另外一个模块func.c中的函数foo()。我们在main.c模块中每一处调用foo的时候都必须明确知道foo函数的地址,所以链接器暂时把这些调用foo函数的指令的目标地址搁置,等待最后链接的时候由链接器区将这些指令的目标地址修正。如果没由链接器,那么我们就必须手动的修改,即填入正确的foo函数地址。
这里我们需要注意一点的是:当func.c模块被重新编译,foo函数的地址有可能改变时,那么我们在main.c中所有使用到的foo地址指令将要全部重新调整。如果没由链接器,那么这一项工作对于程序员来说就是一个噩梦!使用链接器,我们可以直接引用其他模块的函数和全局变量而不用知道他们的地址!!!(这对程序员来说,无疑是个Big Surprise)因为连接器在链接的时候,会根据我们程序中所引用的foo符号,自动去相应的func.c模块中查找foo地址,然后将main.c模块中所有引用到foo的指令重新进行修改,让他们的目标地址为真正的foo函数地址。这就是静态链接的最基本的过程和作用。

三探·模块拼装思想(静态链接)相关推荐

  1. MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用

    静态链接库LIB和动态链接库DLL的区别,创建和示例   1.什么是静态连接库,什么是动态链接库   静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都 ...

  2. COM编程之五 动静态链接

    [1]静态链接 静态链接是指由链接器在链接时将库的内容加入到可执行程序中的做法. 链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序. 函数和数据被编译 ...

  3. 乔巴机器人 番外篇_乔巴超级机器人系列 篇二:乔巴超级机器人三号四号五号拼装及合体...

    乔巴超级机器人系列 篇二:乔巴超级机器人三号四号五号拼装及合体 2017-03-01 16:50:51 11点赞 23收藏 15评论 乔巴超级机器人系列 篇一:乔巴超级机器人购买过程及一号二号拼装托尼 ...

  4. UNIX环境高级编程(三)—— 静态链接库与动态链接库

    动态链接库一般不开放源码,需要建工程才能使用(其中提供的接口和 API): 0. .a/.o/.so What are .a and .so files? .o 就相当于 windows 里的 obj ...

  5. python字符串换行的三种方式_Python:怎样拼装超长字符串和包含回车换行字符串...

    Python 中字符串可以使用单引号('--')或双引号("--")表示.反斜杠 \ 是转义字符.如果你不希望 \ 转义字符成特殊字符,可以在引号前添加 r 即可.如下所示: &q ...

  6. c++定义一个动态全局变量_静态链接与动态链接的宏观概述及微观详解

    静态链接与动态链接的宏观概述及微观详解 第一部分 宏观概述 1. 静态链接 静态链接就是在程序运行前,链接器通过对象文件中包含的重定位表,完成所有重定位操作,并最终形成一个在运行时不需要再次进行依赖库 ...

  7. 米兔机器人终于拼完了_找回童年的DIY乐趣 米兔积木机器人拼装体验

    找回童年的DIY乐趣 米兔积木机器人拼装体验 2017年10月13日 15:57作者:马景东编辑:马景东文章出处:泡泡网原创 分享 米兔积木机器人是小米发布的首款智能机器人玩具,这次有机会获得体验机会 ...

  8. 【计算机基础】静态链接与动态链接

    文章目录 一.前言 二.编译 三.链接 1. 静态链接 2. 动态链接 3. 总结 四.库 参考链接 一.前言 一段代码从文本编辑器上产生到最终能够在机器上运行,经历了非常多的阶段,概括而言,至少包含 ...

  9. Linux-动态链接与静态链接对比(动态库和静态库)

    博客转载自:Linux-动态链接与静态链接对比 一.库的基础概念: 在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于wi ...

最新文章

  1. matlab函数 size()函数和waterfal()l函数,三维图形,矩阵
  2. go 调用dll char*传输
  3. 慎用 TOraQuery RecordCount
  4. 三种主流的Kubernetes部署方式
  5. python常规异常的基类_python常见异常内容
  6. 单文档切换OpenGL视图
  7. C#控件储备——信息提示控件toolTip
  8. 面试2年经验的Java程序员面试题部分带答案
  9. 通过jenkins+gitlab构建CI/CD流水线
  10. 最简单的单片机c语言程序,单片机的C语言编程基础知识(初学注意)
  11. spring 使用注解遇到的问题
  12. 贴个图,讲下技巧如何进入9008模式:记一次救砖小米note3-9008刷小米note3-小米note3miui10降级miui9
  13. uniapp在onLoad事件中不显示showToast的问题
  14. 微信公众号授权登录之二(tp5)
  15. IT时代,为什么要学习UI设计
  16. 教妹学 Java:大有可为的集合
  17. maven打包将依赖jar也打包的方法
  18. n的阶乘c语言输出为负数,为什么 n 为20 阶乘为负数
  19. 分享些发表技术类文章的平台
  20. cesium中缓冲区分析

热门文章

  1. vs2013 编译 notepad++ 源代码 2014-7-23
  2. ubuntu server搭建svn server
  3. abstract class和interface有什么区别?
  4. 非技术(一)——从最近的股票市场看到的
  5. hdu 5062(dp)
  6. NYOJ 640 Geometric Sum
  7. Codeforces 494E. Sharti
  8. 如何识别一个指针式的时种的时间?
  9. vmware--查看链接克隆依赖关系
  10. Linux系统挂载操作mount详解