链接器的理解
文章平均质量分 86
发如雪-ty
一个工作7年的程序员,一直从事C++开发方面的工作,曾有幸在安防行业深耕4年,并有幸在工业检测行业工作至今已有3年,主要负责系统软件的设计与开发,个人编程的信仰:不要盲目学习酷炫的东西,最重要的依然是内功。
展开
-
链接器的理解-05-重定位
我们继续来讲解链接器的重定位。 程序的运行过程就是CPU不断的从内存中取出指令然后执行执行的过程,对于函数调用来说比如我们在C/C++语言中调用简单的加法函数add,其对应的汇编指令可能是这样的: call 0x4004fd 其中0x4004fd即为函数add在内存中的地址,当CPU执行这条语句的时候就会跳转到0x4004fd这个位置开始执行函数add对应的机器指令。 再比如我们在C语言中对一个全局变量g_num不断加一来进行计数,其对应的汇编指令可能是这样的: mov 0x400fda %eax add原创 2021-04-11 16:24:56 · 987 阅读 · 1 评论 -
链接器的理解-04-库与可执行文件的生成<下>
我们继续来看动态链接。 我们知道静态库在编译链接期间就被打包copy到了可执行文件,也就是说静态库其实是在编译期间(Compile time)链接使用的,那么动态库又是在什么时候才链接使用的呢,动态链接可以在两种情况下被链接使用,分别是load-time dynamic linking(加载时动态链接) 以及 run-time dynamic linking(运行时动态链接),接下来我们分别讲解一下。 load-time dynamic linking(加载时动态链接) 首先可能有的同学会问,什么是load原创 2021-04-11 12:59:44 · 256 阅读 · 0 评论 -
链接器的理解-03-库与可执行文件的生成<上>
在链接器可操作的元素这一节中我们提到,链接器可以操作的最小单元为目标文件,也就是说我们见到的无论是静态库、动态库、可执行文件,都是基于目标文件构建出来的。目标文件就好比乐高积木中最小的零部件。 给定目标文件以及链接选项,链接器可以生成两种库,分别是静态库以及动态库,如图所示,给定同样的目标文件,链接器可以生成两种不同类型的库,接下来我们分别介绍。 静态库 假设这样一个应用场景,基础设计团队设计了好多实用并且功能强大的工具函数,业务团队需要用到里面的各种函数。每次新添加其中一个函数,业务团队都要去找相应的实原创 2021-04-10 16:31:09 · 351 阅读 · 0 评论 -
链接器的理解-02-符号决议
所有的应用程序都是链接器将所需要的一个个简单的目标文件汇集起来形成的。你可以将这个过程想象成拼图游戏,每个拼块就是一个简单的目标文件: 1,拼图游戏当中的每个拼块都依赖于其它拼块提供的拼接口,这就好比我们写的程序模块依赖于其它模块提供的编程接口,比如我们在list.c中实现了一种特定的链表数据结构,其它模块需要使用这种链表,这就是模块间的依赖。而链接器其中一项任务就是要确保提供给链接器进行链接的目标文件集合之间依赖是成立的(也就是说,不会出现在被依赖的模块中链接器找不到需要的接口),这就是后面我们要讲到的符原创 2021-04-08 21:23:51 · 379 阅读 · 0 评论 -
链接器的理解-01-前言
对于C++源文件,从文本到可执行文件一般需要四个过程: 预处理阶段:对源代码文件中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,生成预编译文件。 编译阶段:将经过预处理后的预编译文件转换成特定汇编代码,生成汇编文件 汇编阶段:将编译阶段生成的汇编文件转化成机器码,生成可重定位目标文件 链接阶段:将多个目标文件及所需要的库连接成最终的可执行目标文件 在介绍本章的主题之前,我们先来看几个问题: 问题一 写C/C++的同学应该经常遇到这样的一个Error: “undefined reference原创 2021-04-08 09:50:49 · 228 阅读 · 3 评论