ARM U-Boot 构建的交叉工具链问题

3
我正在尝试为树莓派构建自己的工具链,这是出于教育目的。我知道有很多预构建的工具链。到目前为止,我已经成功地构建了gcc和uClib。我正在为目标arm-unknown-linux-eabi构建。现在,当涉及到准备可引导文件系统时,我在质疑如何构建uboot来适配我的arm-unknown-linux-eabi工具链。对于这个系统的bootloader部分似乎不完整。我需要构建一个不依赖于linux内核调用的工具链吗?我的第一次研究让我知道有两种不同的工具链:OS相关(如linux内核sys-calls等)和不需要在内核下运行的裸机工具链或独立工具链。有些资源提到可以使用linux工具链构建U-Boot。如果这是真的,那么为什么?如何实现?如果我必须为“Bare Metal”工具链构建第二个工具链,那么在哪里可以找到关于这两者之间的区别的信息?我需要另一个libstdc吗?

你可以尝试使用 Buildroot 脚本。我相信网络上有一两个适用于RPI的配置文件。 - sawdust
2个回答

2
您可以使用与内核构建时相同的交叉工具链来构建U-Boot - 并且很可能是系统其余用户空间所使用的工具链。
引导加载程序本质上是独立的,不关心您选择的C运行时库,因为它不使用它。因此,系统调用的问题并不影响它。
工具链始终需要由完全功能的开发系统托管 - 通常不是目标系统。无论您看到什么“裸金属工具链”的参考资料都不涉及编译器对系统调用的使用(它在I/O方面严重依赖于操作系统)。在构建引导加载程序和内核时,重要的是将编译器和链接器配置为生成静态链接代码,以便可在特定内存地址上运行。

1
在几乎所有可能的方式中,嵌入式和Linux工具链之间没有区别。但有一个例外。
这个例外是__clear_cache - 一个可以由编译器生成的函数,在“Linux”工具链中包括一个系统调用来同步指令和数据缓存。(有关该位的更多信息,请参见http://blogs.arm.com/software-enablement/141-caches-and-self-modifying-code/。)
现在,除非您明确添加对该函数的调用,否则我所知道的唯一调用它的方法是通过在C中编写嵌套函数(应避免使用的GCC扩展)。
但这是一个区别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接