我试图更好地理解链接器和装载机之类的东西。
他们属于计算机科学的哪个领域?编译器,操作系统,计算机体系结构?
链接器和装载机在开发过程中起什么作用?
发布于 2011-08-25 12:35:32
链接器和加载器是两个相互关联但又相互独立的概念。
链接器是编译器理论的一部分。当您编译一个由多个模块(源代码文件)组成的项目时,编译器通常会为每个源模块输出一个中间文件。这有几个好处,其中之一是,如果您只对一个文件进行更改,然后必须重新编译,则在只进行一个本地更改时,不必重新构建整个项目。
但这意味着,如果在一个模块中有调用不同模块中的函数的代码,编译器就不能为它生成一个CALL
指令,因为它没有另一个函数的位置。它位于一个不同的中间文件中,如果您对中介的源文件进行了本地更改并重新编译它,那么函数的确切位置就会发生变化。因此,它插入了一个“外部引用令牌”(确切地说,它是什么或它看起来并不重要,只是把它看作一个抽象的概念),它说:“我需要这个函数,它的确切地址我现在还不知道。”
一旦所有的东西都被编译成中间文件,链接器就是完成工作的工具。它遍历所有中间文件并将它们链接到最后的二进制文件中。因为它将事情组合在一起,所以它知道所有函数的实际地址,因此它可以用实际的CALL
指令替换外部引用令牌,以找到二进制文件中正确的位置。
另一方面,加载程序属于操作系统,而不是编译器。它的工作是将二进制文件加载到内存中,以便它能够执行,并完成链接过程,因为链接器只能解析它所知道的代码。如果您的程序正在使用任何DLL,则它们是外部的,即使在编译的二进制文件中也是如此,因此链接器不知道它们的地址。它以OS的加载器所知道的格式将外部引用令牌保留在最终的二进制文件中,然后加载器将这些标记与DLL中的实际函数地址进行匹配,一旦所有内容都加载到内存中。
发布于 2011-08-25 12:34:47
为了更多地了解链接器,我认为它们通常会与编译器结合讨论。它们用于将您的各个模块编成一个内聚单元,最后确定该代码中的地址。有些人甚至可能尝试执行优化。
为了了解更多关于加载器的信息,我认为通常会结合编写特定体系结构的编译器来讨论它们,除非您将加载器作为链接器的同义词。我认为加载程序是可执行文件头的一部分,它告诉操作系统如何打开和执行已编译的软件。
我同意阅读维基百科的文章可能会传递比你想要的更多的信息。至于它们的发展方向..。通常,它们超出了项目的控制范围,并且是您选择使用的操作系统和开发包选择的一部分。这是非常罕见的,你会使用(例如) MSVC,但想运行GCC的链接器.可能根本不可能。我唯一使用过非标准链接器的地方是在IBM使用开发副本的时候。
如果你对这些话题有更具体的问题,我想你会找到一个更好的答案。
发布于 2011-08-25 12:15:53
计算机基本使用二进制数字。
人们说他们的母语。
编程语言是用于人与计算机之间的交流的。
如果您说:添加2和3,然后从其中减去1,我怀疑计算机是否能理解任何东西(也许在某些编程语言中它会理解)。
所以,你需要把你的源代码转换成计算机能理解的格式,所以你需要一个编译器,它把一种编程语言翻译成共同称为目标代码的语言。但目标代码还不是计算机直接理解和执行的语言。因此,它需要一个链接器,它将生成一个以所谓的机器语言包含指令的可执行文件;机器语言是一组编码成二进制数字的操作,处理器可以理解这些操作。所有二进制指令都有其结构,并由处理器制造商发布。你可以在英特尔的网站上找到它,看看它们是什么样的。
https://softwareengineering.stackexchange.com/questions/103673
复制