是否可以生成没有链接器的工作二进制文件?

时间:2018-02-22 09:28:15

标签: linker d

据我所知编译器将源代码转换为机器代码。但是这段代码没有任何与OS相关的部分,链接器将它们添加到文件中。

但是没有链接器可以制作一些可执行文件吗?

2 个答案:

答案 0 :(得分:3)

非常简单地回答您的问题 - ,可以在没有链接器的情况下创建执行文件:您不需要编译器或链接器来生成机器代码。二进制文件是一系列操作码和相关信息(偏移量,地址等)。如果打开二进制编辑器,则键入一些操作码并制作程序。保存并运行它。

当然二进制文件将特定于处理器,就像您编译了二进制(本机)执行程序一样。这是对Intel x86操作码的引用。 http://ref.x86asm.net/coder32.html

如果你问,“我可以直接将源文件编译成没有链接器的执行文件吗?”然后纯粹说:不 - 除非编译器在其中集成了链接器的各个方面。编译器生成中间对象,这些对象传递给链接器以将它们“链接”到二进制文件(例如库或执行程序)中。没有链接步骤,管道不完整。

答案 1 :(得分:2)

让我们首先做一个被认为是真实的陈述,编译器不会生成可以立即执行的机器代码(JIT可以做,但让我们忽略它)。

相反,他们生成文件(对象,静态,动态,可执行),描述它们包含的内容以及符号组。符号可以是全局变量或函数。

但是文件本身的符号包含元数据。此元数据非常重要。请参阅存储在符号中的机器代码是目标体系结构的原始指令,但它不知道存储器的存储位置。

虽然现代CPU为每个进程提供了自己的地址空间,但符号可能无法着陆,并且可能不会两次落在同一地址。在最近的时间里,这是一种安全措施,但在过去,它使动态链接正常工作。

因此,当操作系统加载可执行文件或共享库时,它可以将它放在任何需要的地方,这样做就不会重复了。否则,我们都必须开始关心并说“这个文件包含我打算执行的代码的100%”。通常在加载时,符号表中的原始二进制文件通过使用RAM中的符号位置进行修补来进行转换。让一切正常。

总之,编译器会发出允许动态修补程序集的文件 在执行之前。如果没有,我们将生活在一个非常严格和有问题的世界。

Linkers甚至有脚本来改变它们的运作方式。它们是使我们的程序工作所需的非常复杂和精致的软件。

如果您想了解这些格式究竟有多复杂,请阅读PE-COFF和ELF标准。