Compiler construction 交叉编译工具与操作系统的关系

Compiler construction 交叉编译工具与操作系统的关系,compiler-construction,embedded,operating-system,cross-compiling,embedded-linux,Compiler Construction,Embedded,Operating System,Cross Compiling,Embedded Linux,大家好, 我有一个关于交叉编译工具(编译器、汇编、链接器等)和操作系统的问题。让我们以ELDK和linux内核为例 来自wiki和ibm教程(https://www6.software.ibm.com/developerworks/education/l-cross/l-cross-ltr.pdf),配置的交叉编译器应该知道某些特定的目标OS头文件以及新的libc等。但是,目标OS内核也将通过交叉编译器进行交叉编译,例如eldk,在目标嵌入式板或机器上 那么谁先来?操作系统还是交叉编译器 谢谢你

大家好,

我有一个关于交叉编译工具(编译器、汇编、链接器等)和操作系统的问题。让我们以ELDK和linux内核为例

来自wiki和ibm教程(https://www6.software.ibm.com/developerworks/education/l-cross/l-cross-ltr.pdf),配置的交叉编译器应该知道某些特定的目标OS头文件以及新的libc等。但是,目标OS内核也将通过交叉编译器进行交叉编译,例如eldk,在目标嵌入式板或机器上

那么谁先来?操作系统还是交叉编译器


谢谢你的澄清

任何操作系统的第一个版本都必须是交叉编译的,或者(对于一个非常简单的操作系统,就像过去一样)用机器代码手工编写。然后,更复杂的可执行文件可以针对更简单的操作系统,并可能用于构建更复杂的操作系统(初始编译称为“引导”,操作系统编译本身的过程称为“自托管”)。有些操作系统会成为自托管,有些操作系统永远不会成为,如果它们不是针对这种复杂程度设计的


无论如何,我不是100%确定你在问什么。许多小型设备操作系统的设计不是为了处理文件系统和托管编译器所需的其他复杂性,因此它们永远无法编译自己的代码,交叉编译总是必要的。交叉编译器使用的库本身可能已经交叉编译过;当然,标题也总是目标系统的标题。

内核和用户空间交叉编译器都不是第一位的

通常,您不会使用用于用户空间的相同交叉编译器编译操作系统内核。相反,您使用一个“引导”交叉编译器编译内核和C库,该交叉编译器旨在编译直接在硬件上运行的东西,而无需操作系统的帮助,并且设置为不查找预先存在的libc。此时,您就有了内核和核心库,可以使用它们来创建普通的用户空间交叉编译器


(Linux在内核方面有点例外,因为其中包含了相当多的黑客技术,使得使用用户空间编译器编译Linux内核成为可能。这根本不是一个“正常”的好例子。但即使在这里,交叉编译器也是第一位的;您不需要编译内核就可以包含内核头文件。)

嗨,欧内斯特,谢谢您的回答。我听不懂你的描述。如果您愿意,通过阅读IBM如何构建交叉编译器,您将注意到交叉编译器需要其目标OS头文件和库。然而,正如我们都知道的,如果你有一个内核源代码,等等,你需要通过一些东西使它交叉编译,这需要一个交叉编译器。对我来说,这听起来像是一种鸡与蛋的关系。所以我想我应该误解了,这是个鸡蛋问题。为新平台编译(或汇编)的第一段代码必须在没有任何特殊支持文件的情况下编译:该系统根本没有特殊的头文件和库。因此,第一个版本将非常简单,许多工作将由手工完成。例如,第一位可能是通过串行端口读取程序并执行它的代码。这个程序需要手工编写,至少部分是用汇编语言编写的。但是现在有了一个与串口通信的库函数,您可以在主机系统上保存它的副本,并在下一个程序中使用它:它是第一个“库”。也许下一个程序将是一些基本的磁盘I/O,因此您可以在新系统上保存文件。这些例程也必须用机器语言编写,主要是手工编写的。第三,您可以执行简单的I/O例程,但这样,您就拥有了创建一个非常简单的编译器所需的一切。现在,您的主机系统可以在新系统上编译一个简单的编译器,根据需要调用这些I/O例程。因此,您不必再在汇编中编写代码了,事实上,您已经接近让新系统实现自托管了。谢谢您,欧内斯特,您的回答真的很有帮助。顺便问一下,有没有相关的材料或文件来详细描述这一点?