(1)编译生成Freestanding的交叉编译器;
这个交叉编译器完全可以用来编译裸机C程序,编译OS,编译BootLoader,对于嵌入式底层开发者来说,这样一个编译器就足够了,完全可以到此为止。
然而对于一个在OS环境下的应用开发者来说,就需要一个功能更完整的编译器,以及完整的标准C库,这就需要进入步骤(2)。
(2)用刚生成的交叉编译器编译生成标准C库;
Freestanding编译器可以用来编译标准C库,这个是很重要的。
此时虽然编译器和C库都有了,却存在两个缺陷:
编译器可执行文件本身并不知道对应的C库的路径,所以编译程序时就需要额外的命令行参数来提供这些信息。
编译器不能提供Hosted类型C程序初始化环境,因为Hosted环境的建立需要标准C库的支持,而Freestanding编译器在生成时还没有可用的标准C库。这就是一个“鸡生蛋蛋生鸡”的问题了。
为了解决上述问题,需要额外的一个步骤:
(3)重新编译生成Hosted的交叉编译器。
这次编译时,可以有(2)生成的标准C库的支持了,所以可以产生出一个完整的Hosted交叉编译器了。