1. 安装交叉编译链
首先检查自己的Linux系统是否已经安装了对应的交叉编译链,有两种方式。
第一种:采用输入arm然后双击TAB检查输出的方式,如下图所示则已经安装了arm-linux-gnueabihf-交叉编译链。

第二种:输入arm-linux-gnueabihf-gcc -v (命令不完全相同,可以输入arm再TAB补齐)

当时我的ubuntu中已经安装了交叉编译工具,所以就直接进行下一步了。关于交叉编译链的下载安装过程已经有很多博客了,可以自己去查询相关内容进行安装。
2. 下载linux内核源代码
因为我需要交叉编译生成内核模块,所以比起一般的交叉编译还需要配置关于Linux头文件部分,即下载目标机器同版本Linux内核代码并进行交叉编译。
- 下载目标机器对应Linux内核版本的源代码,解压后放到要编译的代码的目录下。Linux内核源代码下载链接:
https://cdn.kernel.org/pub/linux/kernel/
- 对源代码进行交叉编译
直接make,后面编译自己的代码时会报错,比如“include/uapi/linux/types.h:4:23: fatal error: asm/types.h: 没有那个文件或目录”
(我最开始直接make就遇到这个问题,重新交叉编译linux内核代码后就没出现问题)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8

3. 编写对应的Makefile文件
修改所写代码的Makefile文件,文件中需要指明交叉编译链、目标机器架构,以及对应的Linux内核源码位置(也就是KDIR这部分)。我将文件 lkm.c 编译成内核模块的 Makefile 如下:
CROSS_COMPILE:= arm-linux-gnueabihf-
ARCH:= arm
CC:= $(CROSS_COMPILE)gcc
LD:= $(CROSS_COMPILE)ld
obj-m:=lkm.o
P_KVER ?= $(shell uname -r)
#KDIR:=/lib/modules/$(shell uname -r)/build
KDIR:=/$(shell pwd)/linux-3.10.108 //目标机器同版本Linux内核路径
PWD:=$(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules ARCH=$(ARCH)
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
$(RM) Module.markers modules.order
$(RM) $(PWD)/src/modules/kmod/client/kmod/Module.markers
$(RM) $(PWD)/src/modules/kmod/client/kmod/modules.order
4. 编译代码,得到输出
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

查看生成的 .ko 文件属性,可以看到生成的是 ARM 架构的目标文件:

以上就是关于Linux-ARM交叉编译内核模块的相关环境配置内容,整个步骤是我慢慢摸索成功的。如有错误,请多多指正!
参考文章:
https://zhuanlan.zhihu.com/p/94221380
https://blog.csdn.net/Luckiers/article/details/124531266 交叉编译linux内核实例(最详细)总结
https://blog.csdn.net/qq_43557686/article/details/126247648 Linux交叉编译生成驱动模块.ko (这部分有关于Makefile的内容)
https://blog.csdn.net/whatday/article/details/98485036 linux 交叉编译 生成模块 makefile


&spm=1001.2101.3001.5002&articleId=137566319&d=1&t=3&u=fd645682f81446bca12a89340bd831e1)
326

被折叠的 条评论
为什么被折叠?



