无法使用 armv8-rpi4-linux-gnueabihf-gcc 编译 u-boot

Cannot compile u-boot with armv8-rpi4-linux-gnueabihf-gcc

我在尝试为 Raspberry Pi 4 构建 u-boot 时遇到问题。我使用的交叉编译工具是armv8-rpi4-linux-gnueabihf-gcc。我通过使用 ng-crosstool 自动工具链生成器获得它。我遵循的步骤如下。

首先,在u-boot目录下,声明CROSS_COMPILEARCH环境变量同时更改 PATH 还:

其次,我使用名为 rpi_4_defconfig.

的板特定配置文件调用构建过程

很遗憾,构建过程失败。下面是该过程的简化终端输出。

scripts/kconfig/conf  --syncconfig Kconfig
  CFG     u-boot.cfg
cc1: warning: unknown register name: x18
  GEN     include/autoconf.mk
  GEN     include/autoconf.mk.dep
cc1: warning: unknown register name: x18
  CFGCHK  u-boot.cfg
  UPD     include/generated/timestamp_autogenerated.h
  CC      lib/asm-offsets.s
cc1: warning: unknown register name: x18
  CC      arch/arm/lib/asm-offsets.s
cc1: warning: unknown register name: x18

............. *(Redundant lines removed intentionally.)*

  CC      arch/arm/cpu/armv8/cpu.o
cc1: warning: unknown register name: x18
{standard input}: Assembler messages:
{standard input}:36: Error: unexpected character `n' in type specifier
{standard input}:36: Error: bad instruction `b.ne 1b'
make[1]: *** [scripts/Makefile.build:266: arch/arm/cpu/armv8/cpu.o] Error 1
make: *** [Makefile:1784: arch/arm/cpu/armv8] Error 2

你认为我做错了什么?我应该如何继续寻找合适的解决方案?

你的编译器有问题。请使用您的发行版中的 aarch64 标准工具链,或使用 tools/buildman/buildman 从 kernel.org 为您下载工具链。

与您的问题无关,不需要在 U-Boot 中设置 ARCH=arm,并且在某些情况下可能非常有害。然而,在这种情况下,它不是罪魁祸首,因为您的工具链没有将 -ffixed-x18 视为有效,而它应该而且必须如此。

问题是由生成的工具链引起的。 ng-crosstool 工具链生成器在生成您需要的正确工具链时有很多选项。如果在调用 ng-crosstool 之前列出配置选项,您将看到 Raspberry Pi 4 开发板有两个选项: armv8-rpi4-linux-gnueabihfarch64-rpi4-linux-gnu.

要列出可能的配置,请在 ng-crosstool 目录中键入以下内容。输出将显示常用系统的所有可能配置。

bin/ct-ng list-samples

正确的配置是带有 arch64- 前缀的配置。如果您使用该选项生成工具链,问题将得到解决。

特别感谢 @NateEldredge@TomRini 和来自 Linux 土耳其社区的一个人给我一些线索:)