程序员的修炼之路

理解链接之链接的基本概念

2018-12-28  本文已影响0人  Yonah潇

前言

我们知道,开发程序的基本流程是:设计-代码编写-编译-链接-执行

每一个步骤展开都是一个很大的课题,链接是一个被人忽略的课题,因为它并不是很复杂,相对于编译来说它还是比较简单的,但是并不代表它不重要。
现在编译链接的环节基本上由IDE帮助我们完成了,于是我们很少关注编译链接。虽然说不懂编译链接对开发程序并没有很大影响,但是如果要成为大牛,计算机底层的知识还是要掌握的。
编译的知识很多,不是几篇文章能说完的,推荐看《编译原理》。

这篇文章以及几篇相关的文章将参考《深入理解计算机系统》这本书,对链接作一些介绍。

链接的基本概念

链接(linking)就是将不同部分的代码和数据收集和组合成为一个单一文件的过程,这个文件可被加载或拷贝到内存并执行。

简单来说,就是把程序用到的所有源文件的目标文件合成一个可执行目标文件,是一个“多合一”的过程。

链接的执行时机包括:

在早期计算机系统中,链接是手动执行的。在现代计算机系统中,链接是由链接器自动执行的。

链接的意义

链接器在软件开发中扮演了关键的角色,它使得分离编译成为可能。我们不用将一个大小的应用程序组织成一个巨大的源文件,而是可以把它分解成为更小的,更好管理的模块,可以独立的修改和编译这些模块,最终由链接器链接成为一个可执行文件。

为什么要学习链接的知识

链接通常是由链接器处理的,不需要我们插手。但是这是在没有错误产生的情况下,一旦错误产生,不理解链接的工作过程和知识,我们就无法排除错误。以下列出学习链接的几个理由:

简单的链接过程

来看一个简单的静态链接过程,对链接有一个感性的认识。

static linking

源代码经过编译器翻译为汇编语言文件,再经过汇编器翻译为可重定向目标文件,最后由链接器链接为可执行目标文件。
(ccl:C编译器, as:汇编器, ld:链接器)

为了创建可执行文件,链接器要完成两个任务:

目标文件

可重定位目标文件

典型的ELF可重定位目标文件

可执行目标文件

典型的ELF可执行目标文件

从上图可以看出,可执行目标文件被分为三个部分:

上一篇下一篇

猜你喜欢

热点阅读