一、准备工作
1、在官网下载最新的kernel源代码:
https://developer.nvidia.com/embedded/downloads#?tx=$software,l4t-tx1
2、ubuntu16.04编译环境准备:
下载两个交叉编译器aarch64-linux-gnu和arm-linux-gnueabihf,这两个编译器都是交叉编译需要使用的,在linaro官网可以下载:https://www.linaro.org/downloads/
3、解压kernel源码和交叉编译器在合适的位置:
tar -xvjf kernel_src.tbz2
1、Export 环境变量
$ export CROSS_COMPILE=<crossbin>
$ export CROSS32CC=<cross32bni>gcc
$ export ARCH=arm64
2、编译内核文件zImage
$ make mrproper
$ make tegra21_defconfig
$ make zImage
3、编译kernel device tree components:
$ make dtbs
4、编译内核modules
$ make modules
一切正常的情况下,在~/kernel/arch/arm64/boot下即可得到编译后的目标文件。但是正常的情况总是很少,一般编译过程都会遇到一些问题,接下来总结下我编译时遇到的问题和解决方法,仅供参考。
1、编译错误:提示缺少compiler-gcc6.h文件
这是因为使用的编译器aarch64-linux-gnu是6.2.1版本,也就是gcc6系列版本,查看TX1的~/include/linux/下,只有gcc5以下版本文件
这个问题,在网上下载complier-gcc6.h放到~/kernel/include/linux/下即可解决问题。
2、编译错误:r7 cannot be used in asm here
这个错误网上有解决方案:
https://tls.mbed.org/kb/development/arm-thumb-error-r7-cannot-be-used-in-asm-here
https://developer.ridgerun.com/wiki/index.php?title=Compiling_Tegra_X1_source_code#Flashing_the_board
不多说,直接贴上git -diff
Index: kernel_source/arch/arm64/kernel/vdso32/Makefile
===================================================================
--- kernel_source.orig/arch/arm64/kernel/vdso32/Makefile 2016-04-08 21:28:52.651992663 -0600
+++ kernel_source/arch/arm64/kernel/vdso32/Makefile 2016-04-11 12:20:03.377388110 -0600
@@ -11,7 +11,7 @@
GCOV_PROFILE := n
-ccflags-y := -shared -fPIC -fno-common -fno-builtin -march=armv7-a
+ccflags-y := -shared -fPIC -fomit-frame-pointer -fno-common -fno-builtin -march=armv7-a
ccflags-y += -nostdlib -Wl,-soname=linux-vdso32.so.1 \
$(call cc-ldoption, -Wl$(comma)--hash-style=sysv)
asflags-y := -D__VDSO32__ -s
3、新编译器GCC6遇到 “-Werror=misleading-indentation”
原因在gcc官网以后说明,编译器增加了许多新的特性。
具体参考:https://gcc.gnu.org/gcc-6/porting_to.html
但是源码这种东西,不建议直接改代码,所以尽量的回避。使用#pragma 来规避,在需要保护的代码段增加如下代码
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wmisleading-indentation"(“双引号中包含忽略的错误”)
/* (code for which the warning is to be disabled) */
#pragma GCC diagnostic pop
编译过程中会遇到很多这种类似问题,都是如此修改。
4、make menuconfig提示:Unable to find the ncurses libraries....
解决办法:
Sudo apt-get install libncurses5-dev
完。