我如何正确下载 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
我的输出如下图所示:
完成后我将使用标准 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