在Android中單獨編譯linux kernel驅動模塊

在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文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章