Bootstrap

编译linux内核常见报错(最全)总结讲解

一、简介

本文主要介绍在编译内核中常见的报错问题的处理方法,编译过程中的主要报错有缺少本地依赖库、config设置、gcc版本与内核版本不匹配、内核源文件版本问题等,具体问题请看第二章。

二、常见报错

1、CC      arch/arm/kernel/asm-offsets.s
cc1: error: invalid option `abi=aapcs-linux'
make[1]: *** [arch/arm/kernel/asm-offsets.s] Error 1
make: *** [prepare0] Error 2
//解决方法:上述的关掉EABI选项可以通过测试(Kernel Features->Use EABI)
2、drivers/video/console/vgacon.o:987:warning:comparison is always true due to limited range of data type
make[3]:***[drivers/video/console/vgacon.o] error 1
make[2]:***[drivers/video/console2] error 2
make[1]:***[drivers/video1] error 2
make:***[drivers] error 2
//解决方法:在make menuconfig 时Device Drivers → Graphics support → Console display driver support →VGA text console(不选这个)
3、出现/usr/local/arm/bin/arm-linux-ld:arch/arm/kernel/vmlinux.lds:782: parse error
make:***[.tmp_vmlinux1] Error 1这类错误
//解决方法:修改arch/arm/kernel/vmlinux.lds
[arm@localhost linux2.6.14]$vi arch/arm/kernel/vmlinux.lds
//将文件尾2条的ASSERT注释掉(1439行)
 ASSERT((__proc_info_end __
proc_info_begin), "missing CPU support") 
ASSERT((__arch_info_end __
arch_info_begin), "no machine record defined") 
//原因:binutils版本太旧
4、 常见依赖包缺失报错,如libssl-dev、openssl-devel、libncurses5-dev、bison、flex,具体如下:
	1) make menuconfig
	/usr/bin/ld: cannot find -lncurses
	//解决办法:sudo apt-get install libncurses5-dev

	2)[root@localhost *内核目录*]# make -j4
	  HOSTCC  scripts/extract-cert
	scripts/extract-cert.c:21:25: 致命错误:openssl/bio.h:没有那个文件或目录
	 #include <openssl/bio.h>
	//解决办法:yum install openssl-devel

	3)[root@localhost *内核目录*]# make menuconfig
	  UPD     scripts/kconfig/.mconf-cfg
	  HOSTCC  scripts/kconfig/mconf.o
	  YACC    scripts/kconfig/zconf.tab.c
	/bin/sh: bison: 未找到命令
	make[1]: *** [scripts/kconfig/zconf.tab.c] 错误 127
	make: *** [menuconfig] 错误 2
	//解决办法:[root@localhost *内核目录*]# yum install bison flex

	4)compress.c:14:58: fatal error: zlib.h: No such file or directory
	compilation terminated.
	//解决办法:sudo apt-get install zlib1g-dev

	5)/bin/sh: gmake: not found
	make[3]: *** [clean] Error 1
	//原因:在ubuntu中已经取消掉了gmake,都用make代替。
	//解决办法: sudo ln -s /usr/bin/make /usr/bin/gmake

	6)“error : openssl/bio.h :No such file or folder
	//解决方法:sudo apt-get install libssl-dev
	
	7)Makefile:xxx: recipe for target 'xxx' failed
	make[2]:***[arch/arm/boot/compressed/piggy.lzo] Error 1
	make[1]: ***[arch/arm/boot/compressed/vmlinux] Error 2
	//解决方法:sudo apt-get install lzo lzop
	//原因:缺少工具lzo,lzop,LZO是致力于解压速度的一种数据压缩算法
5、在make modules_install时最后几行弹出错误:
if [ -r System.map -a -x /sbin/depmod ]; then /sbin/depmod -ae -F System.map 2.6.12.2; fi
/bin/sh: line 1: 3357 已杀死 /sbin/depmod -ae -F System.map 2.6 .12.2
make: *** [_modinst_post] 错误 137
//解决方法:make module_install之前你是否关闭了selinux,
//原因:该问题是selinux阻止写/lib/modules/ 目录
6、error:unrecognized command line options '-mabi=apcs-gnu'
note: valid arguments to '-mabi='  are: ms sysv
error: unrecognized command line option '-mlittle-endian'
//解决方法:交叉编译工具未指定,加上CROSS_COMPILE=arm-linux- 参数
7、使用内核包编译驱动时常常提示如下:
WARNING: Symbol version dump /usr/src/linux-2.6.26/Module.symvers is missing; modules will have no dependencies and modversions.
//原因:通常头核心包中是没有Module.symvers这个文件的,要想获取这个文件只能到下载相同版本核心(2.6.26-1-686)的头文件,只有下载的头文件中才有这个Module.symvers。
//解决方法:把Module.symvers 复制到核心包中,然后执行如下步骤:make oldconfig && make prepare && make scripts。
//然后重新编译驱动,将解决这个warning,同时也解决了版本不正确的问题

make 命令默认执行的是 make all,make all 有四个阶段: prepare test compile package
make prepare : 只会执行prepare阶段,这个阶段主要是下载编译依赖
make test : 只会执行test阶段,这个阶段主要是做单元测试
make compile : 只会执行compile阶段,这个阶段主要是进行编译
make package : 只会执行packege阶段,这个阶段会把编译产出都copy到output目录中
make install : 只会执行install阶段,这个阶段是把编译产出放到$GOPATH/bin目录下,这个不是必须的
make clean : 只会执行clean阶段,这个阶段把编译输出的一些文件删除,恢复到编译之前的状态

8、fatal error: linux/compiler-gcc7.h: No such file or directory.
提示缺少compiler-gcc7.h这个文件,是由于内核版本较低和我的gcc版本不匹配造成的有三种解决方法:
	1.在内核文件夹中include/linux目录下找到compiler-gcc4.h文件,不同内核版本可能不一样,也有可能是compiler-gcc3.h,将它重命名为compiler-gcc7.h。然后重新编译一下就好了。
	2.在新的内核源码中拷贝一个compiler-gcc7.h,将它拷贝到内核文件夹include/linux目录下,重新编译即可。
	3.重装一个版本低一点的gcc。
9、在进行make oldconfig时出现,code model kernel does not support PIC mode的错误
解决方法如下:
在源码的根目录下的Makefile中的KBUILD_CFLAGS中添加一个编译选项-fno-PIE

三、其他相关链接

1、交叉编译linux内核详细总结

2、gcc交叉编译工具链制作

;