Compiler construction 交叉编译器与操作系统有什么关系?

Compiler construction 交叉编译器与操作系统有什么关系?,compiler-construction,compilation,Compiler Construction,Compilation,我试图理解为什么我们需要交叉编译器,我发现如果我们需要在不同的平台上生成二进制文件,我们需要一个为目标平台生成二进制文件的交叉编译器。 我的问题是,交叉编译器是否与操作系统有关? 例如,如果我在带有ARM处理器的windows机器上运行编译器,生成的二进制文件可以直接在运行ARM处理器的Linux机器上运行吗?编译器是否在二进制文件周围添加了任何特定的包装,以便操作系统理解它 感谢您的回复二进制格式通常是特定于操作系统的,它们反过来会影响代码生成: 任何与动态链接相关的内容都可能是特定于操作系

我试图理解为什么我们需要交叉编译器,我发现如果我们需要在不同的平台上生成二进制文件,我们需要一个为目标平台生成二进制文件的交叉编译器。 我的问题是,交叉编译器是否与操作系统有关? 例如,如果我在带有ARM处理器的windows机器上运行编译器,生成的二进制文件可以直接在运行ARM处理器的Linux机器上运行吗?编译器是否在二进制文件周围添加了任何特定的包装,以便操作系统理解它


感谢您的回复

二进制格式通常是特定于操作系统的,它们反过来会影响代码生成:

  • 任何与动态链接相关的内容都可能是特定于操作系统的。如何定义或调用动态库中的符号、要准备的表等
  • 重新定位并避免它(考虑独立于位置的代码生成)
  • 确切的ABI可能会产生影响(例如,SSE的堆栈对齐)
  • 资源
  • TLS实现
  • 关于符号的规则(例如,某些二进制格式在所有符号前面加上“\ux”)
  • 生成汇编元语句,如节
除此之外,编译器通常对链接器的调用进行插装,这也可能需要额外的细节知识

所以这当然是交叉的一种形式。交叉到必须构建一个单独的编译器吗?这很难说。但是没有人说过两个不同的体系结构也必须是两个单独的二进制文件。这只是惯例和体系结构的结果


例如,Free Pascal不需要单独的二进制文件在同一体系结构上进行跨操作系统编译,因此Linux编译器可以生成windows二进制文件。更强大的是,Linux编译器内置了相应体系结构的win32/64汇编程序、archiver和链接器。

这一切都取决于您使用的编译器。