一、准备工作

1、在官网下载最新的kernel源代码:

0818b9ca8b590ca3270a3433284dd417.png

2、ubuntu16.04编译环境准备:

下载两个交叉编译器aarch64-linux-gnu和aarch64-linux-gnu,这两个编译器都是交叉编译需要使用的,在linaro官网可以下载:https://www.linaro.org/downloads/

0818b9ca8b590ca3270a3433284dd417.png

3、解压kernel源码和交叉编译器在合适的位置:

tar -xvjf kernel_src.tbz2

0818b9ca8b590ca3270a3433284dd417.png

二、内核编译

1、Export环境变量

$ export CROSS_COMPILE=

$ export CROSS32CC=gcc

$ export ARCH=arm64

2、编译内核文件zImage

$ make mrproper

$ make tegra21_defconfig

$ make zImage

3、编译kernel device tree components:

$ make dtbs

4、编译内核modules

$ make modules

0818b9ca8b590ca3270a3433284dd417.png

一切正常的情况下,在~/kernel/arch/arm64/boot下即可得到编译后的目标文件。但是正常的情况总是很少,一般编译过程都会遇到一些问题,接下来总结下我编译时遇到的问题和解决方法,仅供参考。

三、编译遇到问题解决

1、编译错误:提示缺少compiler-gcc6.h文件

0818b9ca8b590ca3270a3433284dd417.png

这是因为使用的编译器aarch64-linux-gnu是6.2.1版本,也就是gcc6系列版本,查看TX1的~/include/linux/下,只有gcc5以下版本文件

0818b9ca8b590ca3270a3433284dd417.png

这个问题,在网上下载complier-gcc6.h放到~/kernel/include/linux/下即可解决问题。

2、编译错误:r7 cannot be used in asm here

0818b9ca8b590ca3270a3433284dd417.png

这个错误网上有解决方案:

不多说,直接贴上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”

0818b9ca8b590ca3270a3433284dd417.png

原因在gcc官网以后说明,编译器增加了许多新的特性。

但是源码这种东西,不方直接该代码,所以尽量的回避。使用#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....

0818b9ca8b590ca3270a3433284dd417.png

解决办法:

Sudo apt-get install libncurses5-dev

完。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐