交叉编译工具和操作系统之间的关系

时间:2011-03-29 12:05:08

标签: compiler-construction embedded operating-system cross-compiling embedded-linux

HI,All,

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

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

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

感谢您的任何澄清!!

2 个答案:

答案 0 :(得分:2)

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

无论如何,我不是百分百肯定你在问什么。许多小型设备操作系统并非设计用于处理文件系统以及托管编译器所需的其他复杂性,因此它们永远无法编译自己的代码,并且始终需要交叉编译。交叉编译器使用的库本身可能是交叉编译的;当然,标题也是目标系统的标题。

答案 1 :(得分:0)

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

通常,您不使用用于用户空间的相同交叉编译器编译OS内核。相反,您使用“bootstrap”交叉编译器编译内核和C库,该编译器旨在编译在没有OS帮助的情况下直接在硬件上运行的东西,并且设置为不寻找预先存在的libc。此时,您拥有内核和核心库,并可以使用它们来创建普通的用户空间交叉编译器。

(Linux在内核方面有点例外,因为包含了一些hackery,这使得使用用户空间编译器编译Linux内核成为可能。这根本不是“正常”的好例子。 “但即便在那里交叉编译器也是第一位的;你不需要编译内核就能包含内核头文件。”