环境准备
- 安装编译器
http://xxxxx/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz sudo dpkg -i gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
- 设置环境变量
export PATH=$PATH:<xxxx/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin>
获取内核源码
- 获取指定版本源代码
git clone --recurse-submodules http://git.xxxxx/mirrors/linux.git /home/jeff.zhao/workstation/bootis-build/components/linux git checkout v5.14.21 -b v5.14.21
单独编译dtb
-
拷贝
linux/arch/arm64/boot/dts/freescale/Makefile
文件添加dts的编译
例如:fsl-lx2162a-u26z.dtb
-
编译dtbs
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j4 dtbs
单独编译内核
- 清理项目工程
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- distclean
- 配置.config文件
cp -f /xxx/lx2162au26z_defconfig /xxx/linux/ make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j4 oldconfig
这里使用的是NXP的config文件,这里根据不同的设备使用不同的配置文件
- 编译内核
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j4 Image.gz
去除vmlinux调试信息
strip掉debug信息,需要保留vmlinux用于之后的debug
cp vmlinux vmlinux.debuginfo
eu-strip --remove-comment -o vmlinux.strip vmlinux
查看是否是同一次编译可以用如下命令
eu-readelf -n vmlinux | grep "Build ID" | awk '{print $NF}'
例如:
xxxxx:~/workstation/bootis-build/build/linux/output$ eu-readelf -n vmlinux | grep "Build ID" | awk '{print $NF}'
b50f251a2f12916f576ed76e15b8fe09ef0a6f34
xxxxx:~/workstation/bootis-build/build/linux/output$ eu-readelf -n vmlinux.strip | grep "Build ID" | awk '{print $NF}'
b50f251a2f12916f576ed76e15b8fe09ef0a6f34
这里就说明build_id是一致的,在我们使用crash工具的时候就不会报mis match的报错
小结
上面是详细分解了一下编译内核的步骤,其实我们可以一键编译并生成dep包或者rpm包
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j4 Image.gz dtbs
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j4 bindeb-pkg
会编译出deb的bin包