C++系列:链接器是如何工作的

发布于 2021-04-08 04:14


但是不论我们的目标是伟大的还是平凡的,我们尝试走自己的道路的理由是:这将是自己的生活,自己的选择,自己的错误。

——《优秀的绵羊》


之前讲过C++是如何编译的,这里小编继续和大家谈谈C++是如何链接的。

讲到代码的运行过程,还是得看下面的这个详细步骤,我们的代码在经过上次讲到的编译过程后变成目标代码,然会通过链接器形成可执行文件。

源代码→ 预处理器→ 编译器→ 汇编程序→ 目标代码→ 链接器→ 可执行文件,最后打包好的文件就可以给电脑去判读运行了。

C++源文件在经过一系列步骤后形成可执行文件,即二进制文件.首先是编译源文件,关于C++是如何编译的,传送门如下:
C++系列:编译器是如何工作的

源文件在经过编译处理后,接下来便是链接器找到哪些符号和函数在哪。

比如一个C++程序包含许多个子文件,这些文件由函数相互串联起来,那么链接的作用便是找到这些文件并链接起来,以形成一个项目。

可能大家会很疑惑为啥我们要知道编译器和链接器是干啥的,这里以链接器举个例子,为啥我们要学习编译和链接过程。



1.为啥要学习链接?



1.理解链接过程对构建大型项目大有好处。
构建大型应用经常会碰到链接器错误,这些错误发生的原因一般有:模块缺失、类库缺失、类库版本不兼容等。除非理解了链接器是怎样解析引用、什么是类库、链接器是怎样使用类库来解析引用等原理,这类错误经常令人困惑。
2.理解链接器可以减少严重编程错误的出现频率。
Linux链接器在解析符号引用时所作的决策会静默地影响程序的正确性。比如,在默认情况下,如果错误地定义了多个全局变量,链接器是不会报错的。但是生成的程序会表现出令人困惑的行为,且这种程序是很难调试的。需要学习了解这种情形是怎样发生的,并且知道这种情形该如何避免。

3.理解链接过程有助于理解编程语言的作用域规则是如何实现的。
比如,全局变量和局部变量有什么区别?当定义了静态变量或者静态函数时,到底会意味着什么?等等

4.理解链接过程有助于理解其他重要的系统概念。
由链接器生成的可执行对象文件许多重要系统功能中发挥着关键作用,比如程序加载、程序运行、虚拟内存、内存映射等;
5.理解链接有助于使用共享库。
多年来,链接被认为是相当直接和无趣的。然而,随着共享库和动态链接在现代操作系统中的重要性越来越高,链接是一个复杂的过程,它为有知识的程序员提供了强大的功能。例如,许多软件产品在运行时使用共享库来升级压缩打包的二进制文件。此外,许多web服务器依赖于共享库的动态链接来提供动态内容。


2.链接器是啥呢?



链接器:又译为链接器、连结器,是一个程序,将一个或多个由编译器或汇编器生成的目标文件外加库,链接为一个可执行文件。

链接器的作用:简单的讲,链接器的工作就是解析未定义的符号引用,将目标文件中的占位符替换为符号的地址。链接器还要完成程序中各目标文件的地址空间的组织,这可能涉及重定位工作。

这里还会有个新名词,什么是重定位呢?
To:重定位,就是将每个符号和内存中的一个位置关联起来,然后修改代码中所有对这些符号的引用,使它们指向这个内存位置。

一般来说,现代操作系统包括静态链接和动态链接。

如果说只有一个函数,即main函数。那么程序也会找到这个函数,并以main函数开始运行。当然,也不是说没有main函数程序就不会运行。
End:当然,由于小编并非万能的,也只能和大家浅显的谈谈链接在我们程序运行时是怎样的。
C++系列...

为你,千千万万遍.

程序员Bob
旨在与大家一起共享学习资源,方法,心得,经验。
132篇原创内容

往期推荐:

三月碎碎念 || Q1总结 2021-04-03
C++系列:编译器是如何工作的 2021-04-05
C++系列:Visual Studio(VS)2019登录不上? 2021-03-26
一键三连,就差你了

本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。

相关素材