为什么在编译 Linux 内核和 uBoot 时使用 arm-linux-gnueabi-gcc 而不是 arm-none-eabi-gcc?

Why arm-linux-gnueabi-gcc and not arm-none-eabi-gcc when compiling Linux kernel and uBoot?

提问人:Joshua DeWeese 提问时间:11/8/2015 最后编辑:Darren NgJoshua DeWeese 更新时间:5/6/2021 访问量:2112

问:

我在为 ARM cortex-m 设备以及 Linux 内核、uBoot 和 Beaglebone Black (BBB) 应用程序编译裸机代码方面有一些经验(对于生活在岩石下的人来说,具有更多功能的 ARM 和 MMU)。对我来说,cortex-m 代码应该使用 arm-none-eabi-gcc(因为没有操作系统)进行编译,而 BBB 的应用程序代码应该使用 arm-linux-gnueabi-gcc 进行编译(因为有一个操作系统,可以进行系统调用,可以使用程序加载器和共享对象)。

我不明白的是为什么 uBoot 和内核也应该使用 arm-linux-gnueabi-gcc 进行编译。在我看来,至少uBoot是一个裸机程序,没有花哨的操作系统。这已经困扰了我一段时间,但我找不到答案。有没有人能启发我?

C Linux GCC U-Boot ABI

评论

0赞 sawdust 11/8/2015
你从哪里学来的这个“uBoot [原文如此],内核也应该用 arm-linux-gnueabi-gcc 编译”?我看到 U-Boot 和 Linux 内核使用相同的工具链(例如在 Buildroot 中)编译,大概是因为方便。但我通常使用裸机工具链来启动加载程序,例如 U-Boot(即我构建了两个工具链)。
0赞 Joshua DeWeese 11/8/2015
我只是从这样的例子中假设。你是说uBoot实际上可以用任何一个编译吗?内核呢?
2赞 Stian Skjelstad 3/24/2017
将 .c 编译为 .o 时,您选择的 ABI 会影响用于参数、堆栈布局等的寄存器。将 .o 链接到可执行文件时,ABI 具有默认的链接器脚本和帮助程序对象。但是内核和 u-boot 都提供了自己的链接器脚本等,因此这一步的 ABI 并不那么重要
0赞 Anna Lyons 11/30/2018
这个问题已经在这里得到回答:stackoverflow.com/questions/38956680/......
0赞 Darren Ng 5/6/2021
@JoshuaDeWeese processors.ti.wiki.com EOL。链接已死。在这里存档。

答:

-2赞 John Moon 11/17/2017 #1

U-Boot 旨在尽可能地反映 Linux 的设计理念。它使用相同的配置系统、通用目录结构等。它与 Linux 共享一些 API - 请参阅 include/linux 目录。正如上面的评论所提到的,在这一点上,ABI兼容性并不重要,但是使用Linux编译器在哲学上并不适合U-Boot。