Android平台单独编译内核模块ko insmod
第一次在android平臺上單獨編譯內核模塊并且insmod,過程比較難受,畢竟啥事第一次做都不怎么順暢!
本文基于Android5.1 msm8909
因為筆者使用的平臺物理串口只有兩個,一個已經作為系統(tǒng)的debug調試串口,那就相當于只有一個串口供使用了,這樣因為串口個數需求遠大于一個,需要添加虛擬串口的驅動。
采取如下方法實現:
編寫虛擬串口驅動
單獨編譯的時候,
1.創(chuàng)建驅動目錄vcom
因為是單獨編譯,因此文件夾的位置可在任意處,筆者放在android源碼的根目錄下
2.準備.c .h Makefile 文件
.c 和 Makefile 文件是必須的
這里說下Makefile文件,因為筆者在這吃了個難受的虧
Makefile的編寫語法,格式什么的,我這里就不多說了,不知道的朋友可以去查查相關資料
Makefile中有幾個重要的點需要注意:第一個是編譯采用的ARCH平臺,如arm,arm64等;第二個是編譯器的路徑,這里需要知道絕對路徑和相對路徑的概念,為了穩(wěn)保路徑正確,我這里采用了絕對路徑。第三個就是內核目錄:這里我才用android源碼編譯過后的內核目錄。Makefile內容如下所示,幾個重要的點用箭頭指明了:
ifneq ($(KERNELRELEASE),)
MODULE_NAME = hogovcom
$(MODULE_NAME)-objs := extport.o vcom.o
obj-m := $(MODULE_NAME).o
else
? ? KERNELDIR ?= /home/adr/workspace/android_code/android5_1/code_7/LINUX/android/out/target/product/msm8909/obj/KERNEL_OBJ
? ? PWD ?= $(shell pwd)
? ? ARCH = arm
? ? CROSS_COMPILE= /home/adr/workspace/android_code/android5_1/code_7/LINUX/android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-4.8-
.PHONY: modules clean
modules:
? ? ? ? $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNELDIR) M=$(PWD) modules
clean:
? ? ? ? rm -f *.o *.mod.c .*.*.cmd *.ko *.order *.symvers
? ? ? ? rm -rf .tmp_versions
endif
?
3.執(zhí)行make指令
執(zhí)行make的時候,可能會遇到一些錯誤,出錯時可以閱讀出錯信息來進行糾錯,筆者在make時遇到了如下錯誤,可供參考:
在編譯完成并生成ko文件后,在android板上insmod發(fā)現出現了如下錯誤,這可以看到圖中有兩處類型的錯誤:
第一處?Unknown symbol _GLOBAL_OFFSET_TABLE_ (err 0)
這個可能是你編譯器不對的原因,筆者開始使用的并不是上圖makefile中所示的編譯器,而是同級目錄下的帶android字符的編譯器,然后因為出錯,我換成了不帶android字符的編譯器,結果重新make insmod,該錯誤解決
參考:ndk 編譯android內核模塊無法加載 解決方法_douniwan5788的博客-CSDN博客
第二處:咋的一看,這么多方法沒找到,但不應該啊,make都過去了,為啥insmod的時候會有方法找不到,結果把多個文件整合成一個文件,在make insmod ,問題解決。 但~ 這也不是個辦法啊,大家都知道,在C語言中,不能把所有的代碼都放在一個.c文件里面,這樣這個.c文件會很大,而且代碼維護起來會很麻煩。那么開始思考,makefile多文件生成一個ko這個該咋做,百度到個鏈接得到一個思路(參考:linux C下多文件編譯,以及Makefile的使用 - tangQ_Q - 博客園),然后,調換 vcom.o 和extport.o的位置,然后make insmod,問題解決,臥槽,還真是這個問題。對于這個問題,我理解的是因為我vcom.o 里面我是需要調用extport里面的函數的,如果我把extport放后面,這樣ld鏈接的時候,先編譯vcom鏈接,這個時候extport還沒有編譯鏈接,那么當然找不到相關函數,這里可能說的不清楚,有錯誤的地方請大家指點!
總結
以上是生活随笔為你收集整理的Android平台单独编译内核模块ko insmod的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity3D 安装
- 下一篇: 流处理器数量