2012年7月6日 星期五

編kernel module遇到一些麻煩


因為工作需要,不時會寫一些小kernel module來用
以往只有一個.c檔, abc.c, Makefile就很簡單.
編出來的module自然就是abc.ko
------------------------------------------------------------
#
#  Makefile for abc driver
#

obj-m = abc.o

------------------------------------------------------------


不過因這次內容有點多,
就依功能把分成兩個檔案 abc.c, xyz.c
同時也修改一下Makefile
------------------------------------------------------------
#
#  Makefile for abc driver
#

obj-m = abc.o

abc-objs += xyz.o

------------------------------------------------------------

順利地把abc.ko編出來,沒有compile error.
也有看到abc.o, xyz.o等也都編出來.

但module load進去後功能並不如預期.
反覆試了幾次, 發現連module insert成功的message也沒印出來.
後來把module檔dump出來一看

# objdump -S abc.ko

發現裡面只有包括xyz.c內容,
abc.o雖然有編出來,但裡面的內容跟xyz.o完全一樣,
來看是abc.c完全沒有被編到....


這時才發現Makefile的寫法一整個就是錯誤.
把Makefile改寫後編出來的module再變正常~
改寫後的Makefile:
------------------------------------------------------------
#
#  Makefile for abc driver
#

obj-m = aaa.o

aaa-objs += xyz.o
aaa-objs += abc.o

------------------------------------------------------------

不過這樣編出來的module檔名會是 aaa.ko

難道是有多個.c檔時,module的名字就不可以跟其中某個檔案一下?
改天再來研究看看...

沒有留言: