是否可以在没有链接器的情况下生成工作二进制文件?
Is it possible to produce working binary without linker?
据我所知,编译器将源代码转换为机器代码。但是这段代码没有任何 OS 相关的部分,链接器将它们添加到文件中。
但是是否可以在没有链接器的情况下制作一些可执行文件?
让我们首先声明一个被认为是正确的声明,编译器不会生成可以立即执行的机器代码(JIT 会生成,但让我们忽略它)。
相反,它们生成的文件(对象、静态、动态、executable)描述了它们包含的内容以及符号组。符号可以是全局变量或函数。
但是符号就像文件本身一样包含元数据。这个元数据非常重要。查看符号中存储的机器代码是目标体系结构的原始指令,但它不知道内存存储在哪里。
虽然现代 CPU 为每个进程提供了自己的地址 space,但一个符号可能不会登陆并且可能不会登陆同一地址两次。在最近,这是一项安全措施,但在过去,动态链接可以正常工作。
因此,当 OS 加载一个 executable 或共享库时,它可以将它放在任何它想要的地方,这样就不会重复 table。否则我们都必须开始关心并说 "this file contains 100% of the code I intend to execute"。通常在加载符号 table 中的原始二进制文件时,通过使用 RAM 中的符号位置对其进行修补来对其进行转换。让一切正常运转。
总而言之,编译器发出允许动态修补程序集的文件
在执行之前。否则,我们将生活在一个限制性很强且问题多多的世界中。
链接器甚至有脚本来改变它们的操作方式。它们是使我们的程序运行所需的非常复杂和精致的软件。
如果您想了解这些格式到底有多复杂,请阅读 PE-COFF 和 ELF 标准。
非常字面地回答你的问题 - 是,可以在没有 linker 的情况下制作可执行文件:你不需要编译器或 linker 生成机器码。二进制文件是一系列操作码和相关信息(偏移量、地址等)。如果你打开一个二进制编辑器,然后输入一些操作码并编写一个程序。保存并 运行 它。
当然,二进制文件将特定于处理器,就像您编译了二进制(本机)执行程序一样。这是对 Intel x86 操作码的引用。
http://ref.x86asm.net/coder32.html.
如果你问的是,"Can I compile a source file directly into an executive file without a linker?" 那么纯粹地说:不 - 除非编译器在其中集成了 linker 的方面。编译器生成传递给 linker 的中间对象,再将它们 "link" 转化为二进制文件,例如库或执行程序。没有 link 步骤,管道是不完整的。
据我所知,编译器将源代码转换为机器代码。但是这段代码没有任何 OS 相关的部分,链接器将它们添加到文件中。
但是是否可以在没有链接器的情况下制作一些可执行文件?
让我们首先声明一个被认为是正确的声明,编译器不会生成可以立即执行的机器代码(JIT 会生成,但让我们忽略它)。
相反,它们生成的文件(对象、静态、动态、executable)描述了它们包含的内容以及符号组。符号可以是全局变量或函数。
但是符号就像文件本身一样包含元数据。这个元数据非常重要。查看符号中存储的机器代码是目标体系结构的原始指令,但它不知道内存存储在哪里。
虽然现代 CPU 为每个进程提供了自己的地址 space,但一个符号可能不会登陆并且可能不会登陆同一地址两次。在最近,这是一项安全措施,但在过去,动态链接可以正常工作。
因此,当 OS 加载一个 executable 或共享库时,它可以将它放在任何它想要的地方,这样就不会重复 table。否则我们都必须开始关心并说 "this file contains 100% of the code I intend to execute"。通常在加载符号 table 中的原始二进制文件时,通过使用 RAM 中的符号位置对其进行修补来对其进行转换。让一切正常运转。
总而言之,编译器发出允许动态修补程序集的文件 在执行之前。否则,我们将生活在一个限制性很强且问题多多的世界中。
链接器甚至有脚本来改变它们的操作方式。它们是使我们的程序运行所需的非常复杂和精致的软件。
如果您想了解这些格式到底有多复杂,请阅读 PE-COFF 和 ELF 标准。
非常字面地回答你的问题 - 是,可以在没有 linker 的情况下制作可执行文件:你不需要编译器或 linker 生成机器码。二进制文件是一系列操作码和相关信息(偏移量、地址等)。如果你打开一个二进制编辑器,然后输入一些操作码并编写一个程序。保存并 运行 它。
当然,二进制文件将特定于处理器,就像您编译了二进制(本机)执行程序一样。这是对 Intel x86 操作码的引用。 http://ref.x86asm.net/coder32.html.
如果你问的是,"Can I compile a source file directly into an executive file without a linker?" 那么纯粹地说:不 - 除非编译器在其中集成了 linker 的方面。编译器生成传递给 linker 的中间对象,再将它们 "link" 转化为二进制文件,例如库或执行程序。没有 link 步骤,管道是不完整的。