在Android中单独编译linux kernel驱动模块
本文参考了:http://blog.csdn.net/qq1084283172/article/details/56958136
Makefile
obj-m += mytp.o
KERNELDIR ?= <aosp_path>/out/target/product/<product_name>/obj/KERNEL_OBJ/
PWD ?= $(shell pwd)
ARCH = arm64
CROSS_COMPILE=<aosp_path>/arm11/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-
CC=$(CROSS_COMPILE)gcc
LD=$(CROSS_COMPILE)ld
CFLAGS_MODULE=-fno-pic
.PHONY: modules clean
modules:
$(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm *.o *.mod.c *.order *.symvers
aosp_path 是Android源码的根目录路径
product_name 是产品的名字
注意事项
1. 关于KERNELDIR的值
如果你的“内核”编译系统生成中间文件不是在out路径下,而是在如下路径:
<aosp_path>/kernel
那么KERNELDIR的值要改为路径,而不是out下面。
2.关于ARCH和CROSS_COMPILE的值
如果你的ARCH是arm不是arm64,那么你的CROSS_COMPILE的值也要改变。具体路径差不多,这里就不列出来了。
3.CFLAGS_MODULE=-fno-pic
注意,Makefile中要加上 CFLAGS_MODULE=-fno-pic 选项,不然insmod加载编译好的 hello.ko relocation节 会错误:
insmod: init_module 'hello.ko' failed (Exec format error)
kmsg:
<3>[ 1646.589131] hello: unknown relocation: 27
End
最后,使用make命令即可编译生成正确的hello.ko文件。