加载中…
个人资料
silex
silex
  • 博客等级:
  • 博客积分:0
  • 博客访问:5,711
  • 关注人气:5
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

构建树莓派交叉编译器

(2022-11-25 21:36:31)
标签:

linxu

it

分类: 树莓派
编译驱动需要使用与内核版本相同的、编译过的库。我发现直接用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为例,编译内核。

 1、安装工具:

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){

        printk(KERN_ALERT "Hello,luping!");

        return 0;

}

static void __exit hello_exit(void){

        printk(KERN_ALERT "Goodbye!");

}

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:

        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

clean:

        rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c

编译碰到错误,关于第一个错误:按方法三解决

https://blog.csdn.net/weixin_42792088/article/details/121657463

第二个错误

Makefile 1088行(删除了)没删,后来有没报错了

编译openssl/bio.h: No such file or directory解决

apt-get install libssl-dev


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有