构建树莓派交叉编译器
(2022-11-25 21:36:31)
标签:
linxuit |
分类: 树莓派 |
编译驱动需要使用与内核版本相同的、编译过的库。我发现直接用apt-get install raspberrypi-kernel-headers安装的内核库往往和在用系统的内核版本不一致,在完成编译驱动后,在系统上执行会报格式不对的错误。为了解决这个问题,需要升级现有系统的内核。这在树莓派的官方文档上有说明如何编译树莓派的内核。有两种办法,在树莓派系统上编译,或者找台pc机安装linux,使用交叉编译。我的方案选择的是第二种,明显来说编译速度只要几十分钟,而第一种方案可能需要几个小时。
什么是交叉编译器:
交叉编译器是编译器能够生成的可执行用于代码平台比在其上运行编译器的一个其它。例如,我们的目的是在PC上运行但生成在树莓派上运行的代码的编译器。
其实官方已经提供了直接可以使用的交叉编译,可以直接下载使用。本着DIY的精神,也可以自己构建交叉编译器。构建交叉编译器是一件复杂的工作,好在有牛人给我们开发出了构建交叉编译器的工具,下面就介绍如何使用工具构造交叉编译器。
构建树莓派交叉编译器:
基于《树莓派实战秘籍》一书,有关于如何构建交叉工具的内容,提到的工具就是crosstool-ng,官方网站:http://crosstool-ng.org。我的环境是windows上安装了vmware虚拟机,虚机内存一定要4G以上,下面有说明。
记录构建过程:
1、下载ct-ng工具 当前是1.25.0版本。
2、根据书上先安装一些包,libstdc++-dev用libstdc++-9-dev代替
3、直接configure发现有些有些包还是需要安装,如:patch gawk cvs help2man,特别是libtool-bin
4、继续./configure顺利通过
5、ct-ng menuconfig 进行配置编译器,可参考书
ct-ng build 进行编译,发现linux源码下载失败(网速原因,https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.2.17.tar.xz)zlib包的链接已经失效,可以使用如下链接:http://www.zlib.net/fossils/zlib-1.2.12.tar.gz
碰到以上情况,可以手工下载,然后把文件放在{home}/src目录里,继续执行ct-ng build。该目录在配置里有,可以参考书Paths and misc options/Local tarballs directory部分。
编译到构造C编译器时发现错误,从试了几次不行,后来想到可能内存开太小了,把虚机停了将内存有2G改到4G,重新编译成功。编译完成的程序默认在x-tools/arm-rpi-linux-gnueabihf/bin,可以将这个目录纳入PATH方便执行。
构建一个定制内核
官方版本:
https://www.raspberrypi.com/documentation/computers/linux_kernel.html#cross-compiling-the-kernel
下面以树莓派3B为例,编译内核。
sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
#install the 32-bit Toolchain for a 32-bit Kernel
sudo apt install crossbuild-essential-armhf
2、下载代码:
git clone --depth=1 https://github.com/raspberrypi/linux
或者下载特定版本
git clone --depth=1 --branch https://github.com/raspberrypi/linux
也可直接下载源码,比如下载5.2.y版本:
https://github.com/raspberrypi/linux/archive/rpi-5.2.y.tar.gz
tar xzvf rpi-5.2.y.tar.gz
##make mrproper(清除到原始状态,比 make clean更加彻底)
3、缺省配置内核
Apply the Default Configuration,For Raspberry Pi 2, 3, 3+ and Zero 2 W, and Raspberry Pi Compute Modules 3 and 3+ default 32-bit build configuration。
cd linux
KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
Customising the Kernel Version Using LOCALVERSION
change the following line in .config:(源码目录下.config文件)
CONFIG_LOCALVERSION="-v7l-MY_CUSTOM_KERNEL"
4、编译
make -j 6 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
可以用-j n 进行并行编译配置,官方推荐n为1.5倍的内核数,编译成功生成:
Arch/arm/boot/zImage 内核文件
Arch/arm/boot/dts
#include
#include
#include
MODULE_LICENSE("GPL");
MODULE_AUTHOR("luping");
MODULE_VERSION("1.0");
MODULE_DESCRIPTION("Hello");
static int __init hello_init(void){
}
static void __exit hello_exit(void){
}
module_init(hello_init);
module_exit(hello_exit);
写Makefile
PWD := $(shell pwd)
KERNELDIR = /lib/modules/5.15.74-v7+/build
obj-m := hello.o
all:
clean:
编译碰到错误,关于第一个错误:按方法三解决
https://blog.csdn.net/weixin_42792088/article/details/121657463
第二个错误
Makefile 1088行(删除了)没删,后来有没报错了
编译openssl/bio.h: No such file or directory解决
apt-get install libssl-dev