安装交叉编译链
首先检测自己的Linux系统是否早已安装了对应的交叉编译链安装linux内核源代码,有两种方法。
一种可以采用输入arm之后双击TAB检测输出的形式,如右图所示则早已安装了arm-linux-gnueabihf-交叉编译链。
第二种时输入arm-linux-gnueabihf-gcc-v(命令不完全相同,可以输入arm再TAB补足)
关于交叉编译链的下载安装过程早已有好多博客了,可以自己去查询相关内容进行安装。
下载linux内核源代码
由于我须要交叉编译生成内核模块linux开源软件,所以比起通常的交叉编译还须要配置关于Linux头文件部份linux 内核,即下载目标机器同版本Linux内核代码。
下载目标机器对应Linux内核版本的源代码,解压后放在要编译的代码的目录下,下载链接:。
下载后对源代码进行编译,编译须要使用交叉编译(之间最开始直接make,前面编译自己的代码时会报错诸如“include/uapi/linux/types.h:4:23:fatalerror:asm/types.h:没有哪个文件或目录”,旁边重新交叉编译linux内核代码后就没出现问题了)。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
编撰对应的Makefile文件
更改所写代码的Makefile文件,我要将文件lkm.c编译成内核模块。文件中须要指明交叉编译链、目标机器构架安装linux内核源代码,以及对应的Linux内核源码位置(也就是KDIR这部份)。
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
编译代码,得到输出
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
查看生成的.ko文件属性,可以看见生成的是arm构架的目标文件。
以上就是关于Linux-ARM交叉编译内核模块的相关环境配置内容,整个步骤是我渐渐摸索成功的。如有错误,请多多见谅!
参考文章:
交叉编译linux内核实例(最详尽)总结
Linux交叉编译生成驱动模块.ko(这部份有关于Makefile的内容)
linux交叉编译生成模块makefile