📜  链接器和加载器的区别(1)

📅  最后修改于: 2023-12-03 14:58:13.933000             🧑  作者: Mango

链接器和加载器的区别

链接器和加载器都是与程序编译和执行过程密切相关的工具,但是它们的作用不同。

链接器

链接器主要作用是将多个目标文件(.o 或 .obj 等)合并成一个可执行文件,或者将目标文件和库文件(.a 或 .lib 等)合并成一个可执行文件。

链接器主要分为静态链接器和动态链接器:

静态链接器

静态链接器在编译时将所有的目标文件和库文件链接在一起生成一个完整的可执行文件。这样,在执行时就不需要再载入其他文件了。优点是执行速度快,不需要考虑库的版本兼容性问题。缺点是可执行文件的大小会比较大,每次有更新都要重新编译和链接,浪费存储空间和时间。

动态链接器

动态链接器是在可执行文件运行时才将库载入到内存中,减少了可执行文件的体积,同时也减少了程序在运行时的内存消耗。但是,当系统中有不同版本的库文件时,会出现兼容性问题。

加载器

加载器主要作用是将可执行文件的内容读入内存,并运行该程序。

当程序启动时,系统的加载器会读入可执行文件的头部信息,然后按照程序的分段信息将程序装入内存中。其中,代码段和数据段是必须的,BSS 段和堆栈段是可选的。

在加载时,加载器还会进行一些初始化工作,如对全局变量进行初始化,建立好 BSS 段、堆和栈等空间,从而为程序提供必要的运行环境。

总之,链接器和加载器都是程序编译和执行过程中必不可少的工具,它们各自担负着不同的任务。了解它们的作用和区别有助于程序员更好地理解程序的编译和运行过程,从而更好地进行程序设计和开发。