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

Posted

技术标签:

【中文标题】交叉编译工具与操作系统的关系【英文标题】:relation between cross compilation tools and OS 【发布时间】:2011-03-29 12:05:08 【问题描述】:

大家好,

我对交叉编译工具(编译器、汇编器、链接器等)和操作系统有疑问。我们以ELDK和linux内核为例。

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

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

感谢您的澄清!!

【问题讨论】:

【参考方案1】:

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

无论如何,我不能 100% 确定您要问什么。许多小型设备操作系统并非旨在处理文件系统和托管编译器所需的其他复杂性,因此它们永远无法编译自己的代码,并且始终需要交叉编译。交叉编译器使用的库本身很可能已经被交叉编译。当然,标头也始终是目标系统的标头。

【讨论】:

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

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

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

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

【讨论】:

以上是关于交叉编译工具与操作系统的关系的主要内容,如果未能解决你的问题,请参考以下文章

交叉编译工具链介绍《Building Embedded Linux Systems》

设置Linux系统的交叉编译环境

LINUX交叉编译工具链和GCC是啥关系啊

ARM交叉编译器扫盲

ARM交叉编译器GNUEABINONE-EABIARM-EABIGNUEABIHF等的区别

QtCreator配置交叉编译工具链