使用 Linaro 7.1.1 arm-linux-gnueabihf 进行交叉编译

使用 Linaro 7.1.1 arm-linux-gnueabihf 进行交叉编译

我如何正确下载 linaro 工具链并进行设置,以便可以将其与内核 Makefile 一起使用?当我在函数上测试我的版本时,arm-linux-gnueabihf-gcc --version它可以工作,但在编译自定义内核时它会失败。


语境

我正在为 Beaglebone Black 开发板编译自定义 Linux 内核。我构建自定义内核所遵循的指南是这里

在按照指南的步骤操作时,我需要使用arm-linux-gnueabihf-gcc 交叉编译 Beaglebone 硬件的内核。因此我安装了linaro 网站上的工具链。我只是下载了然后解压到/opt/文件夹里。

$ cd /opt/
$ sudo mv gcc-linaro-7.1.1-2017.08-x86_64_arm-linux-gnueabi.tar.xz/ gcc-arm-linux
$ export PATH=$PATH:/opt/gcc-arm-linux/bin

我进行测试并确保安装一切正常。

$ arm-linux-gnueabihf-gcc --version

我的输出如下图所示:

arm-linux-gnueabihf-gcc 版本

完成后我将使用标准 Makefile 编译内核。

$ cd ~/linux
$ sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bb.org_defconfig
$ sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage dtbs LOADADDR=0x80008000 -j4

此时,我在实际编译内核的命令上遇到了错误。

Makefile:686: Cannot use CONFIG_CC_STACKPROTECTOR_STRONG: -fstack-protector-strong not supported by compiler
make: arm-linux-gnueabihf-gcc: Command not found
  CHK     include/config/kernel.release
  CHK     include/generated/uapi/linux/version.h
  CC      scripts/mod/empty.o
/bin/sh: 1: arm-linux-gnueabihf-gcc: not found
scripts/Makefile.build:258: recipe for target 'scripts/mod/empty.o' failed
make[2]: *** [scripts/mod/empty.o] Error 127
scripts/Makefile.build:403: recipe for target 'scripts/mod' failed
make[1]: *** [scripts/mod] Error 2
make[1]: *** Waiting for unfinished jobs....
Makefile:556: recipe for target 'scripts' failed
make: *** [scripts] Error 2
make: *** Waiting for unfinished jobs....

最令人困惑的是,错误表明arm-linux-gnueabihf-gcc: not found,但是我可以在同一文件夹中运行该命令arm-linux-gnueabihf-gcc --version并且它将正确执行。

解决这个问题的办法可能是使用 apt 安装它:

sudo apt-get install gcc-arm*

建议回应,但这并不能解决我的困惑。

为什么我可以在函数上测试我的版本arm-linux-gnueabihf-gcc,但它无法在 Makefile 中正确执行?如何正确下载 linaro 工具链并进行设置,以便可以将其与内核 Makefile 一起使用?

答案1

不确定这是否与我遇到的问题相同,但我在寻找自己的问题的答案时偶然发现了这篇文章。

我在 docker 容器中使用较旧的 linux-arm 交叉编译器时遇到了类似的问题。问题是交叉编译 gcc 二进制文件是 32 位的,而运行 make 的容器是 64 位的。make 脚本报告“未找到 arm-linux/gcc”

你可以通过以下方式检查它是否是 32 位

file absolute-path-to-gcc

例如

root@b61b0b938b8a:~# file /usr/local/arm-linux/bin/gcc
/usr/local/arm-linux/bin/gcc: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, stripped

为了解决这个问题,我必须添加i386到docker容器中,如下所示问题

sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386

相关内容