A33-vstar报错记录:ERROR: build kernel Failed
解决ERROR: build kernel Failed
在编译了多次发现,每次都是在编译完了lcd.ko之后会弹出这个问题
主要是就报了这个ERROR: build kernel Failed
错误提示,但是没有报详细的错误,与我平时编译器直接报错的方式不同,但这也是一种经验的累积和成长,好消息是,我最终解决了这个问题.
解释错误
首先我发现每次都是在编译完lcd.ko
这个模块后报错的,而这个是单独在Linux-3.4
后出现的,也就是我们先找到这行命令,这行编译完内核代码后的命令
第一步:查找“build kernel Failed”出处
grep -rn "build kernel Failed" buildroot/
执行后显示:
qin@qin-ubuntu:~/vstar/Linux-SDK/dragonboard$ grep -rn "build kernel Failed" buildroot/
buildroot/scripts/mkcmd.sh:362: [ $? -ne 0 ] && mk_error "build kernel Failed" && return 1
qin@qin-ubuntu:~/vstar/Linux-SDK/dragonboard$
我们发现报错位置在buildroot/scripts/mkcmd.sh:362
,也就是在mkcmd.sh
这个文件的362行处,这行的内容:
(cd ${LICHEE_KERN_DIR} && [ -x ${build_script} ] && ./${build_script})
[ $? -ne 0 ] && mk_error "build kernel Failed" && return 1
我们发现,是执行了build_script
这个脚本
第二步 我们要知道 ${build_script} 是什么脚本
现在执行这个命令,查看 build_script 的值:
grep build_script buildroot/scripts/mkcmd.sh | grep '='
输出:
qin@qin-ubuntu:~/vstar/Linux-SDK/dragonboard$ grep build_script buildroot/scripts/mkcmd.sh | grep '='local build_script="scripts/build.sh"local build_script="scripts/build.sh"local build_script="scripts/build.sh"local build_script="scripts/build.sh"
qin@qin-ubuntu:~/vstar/Linux-SDK/dragonboard$
现在我们可以确认:buildroot/scripts/mkcmd.sh
中执行的就是:
cd ${LICHEE_KERN_DIR} && ./scripts/build.sh
那么,我们来单独执行这条命令:
cd linux-3.4
./scripts/build.sh
输出错误:
qin@qin-ubuntu:~/vstar/Linux-SDK/dragonboard$ cd linux-3.4
./scripts/build.sh
make: arm-linux-gnueabi-gcc: 没有那个文件或目录
Building kernel
make: arm-linux-gnueabi-gcc: 没有那个文件或目录CHK include/linux/version.hCHK include/generated/utsrelease.hCC scripts/mod/empty.o
/bin/sh: 1: arm-linux-gnueabi-gcc: not found
make[2]: *** [scripts/Makefile.build:308:scripts/mod/empty.o] 错误 127
make[1]: “include/generated/mach-types.h”已是最新。
make[1]: *** [scripts/Makefile.build:443:scripts/mod] 错误 2
make[1]: *** 正在等待未完成的任务....
make: *** [Makefile:506:scripts] 错误 2
make: *** 正在等待未完成的任务....CC kernel/bounds.s
/bin/sh: 1: arm-linux-gnueabi-gcc: not found
make[1]: *** [/home/qin/vstar/Linux-SDK/dragonboard/linux-3.4/./Kbuild:36:kernel/bounds.s] 错误 127
make: *** [Makefile:985:prepare0] 错误 2
qin@qin-ubuntu:~/vstar/Linux-SDK/dragonboard/linux-3.4$
我们从错误就已经可以看到问题所在:当前环境下 找不到交叉编译工具链 arm-linux-gnueabi-gcc,导致内核 scripts/build.sh 脚本失败,最终 build.sh 脚本才会报 build kernel Failed。
说白了,就是交叉编译环境没有弄好。
解决问题
其实我一开始是弄了环境变量的,但是很乱,直接把交叉编译环境的绝对路径加到build.sh
的前面就行:
export ARCH=arm
export CROSS_COMPILE=/home/qin/vstar/Linux-SDK/dragonboard/brandy/gcc-linaro/bin/arm-linux-gnueabi-
export PATH=/home/qin/vstar/Linux-SDK/dragonboard/brandy/gcc-linaro/bin:$PATH
或者直接加到build.sh
中:
#!/bin/bash# 进入脚本所在目录,保证相对路径正确
cd "$(dirname "$0")"# 交叉编译器路径(相对路径,根据你的目录结构调整)
export CROSS_COMPILE="$(pwd)/brandy/gcc-linaro/bin/arm-linux-gnueabi-"
export PATH="$(pwd)/brandy/gcc-linaro/bin:$PATH"
export ARCH=arm# 你的后续build脚本逻辑...
buildroot/scripts/mkcommon.sh "$@"
这个用的是相对路径,会比较通用