在載入自己寫的3.1.4核心的adc驅動時,頻頻出現下面的錯誤提示,以前在2.6.29的核心上從未碰到:

[[email protected] drivers]# insmod /lib/modules/adc.ko
adc: module license 'unspecified' taints kernel.
Disabling lock debugging due to kernel taint
adc: Unknown symbol platform_get_irq (err 0)
adc: Unknown symbol platform_driver_register (err 0)
adc: Unknown symbol platform_get_resource (err 0)
insmod: cannot insert '/lib/modules/adc.ko': unknown symbol in module or invalid parameter

   對於經常寫驅動的大牛來說這可能根本不是問題,但是它卻困擾我一段時間。反覆查閱網上的資料,找到可以從以下幾點來解決這個問題,在此記錄:

這是linux kernel 2.6.26 之後版本的bug (詳細描述, 請看http://bugzilla.kernel.org/show_bug.cgi?id=12446)
並且這個bug不會被fix

解決辦法是把mod_a的Module.symvers放到mod_b的當前路徑,從而編譯mod_b,符號資訊會自動連線進去.
或者在mod_b的makefile中使用KBUILD_EXTRA_SYMBOLS指定mod_a的Module.symvers, 如:
KBUILD_EXTRA_SYMBOLS=/mod_a/Module.symvers

編譯mod_b時,搜尋Module.symvers的路徑是:
1, kernel source path, e.g. /usr/src/kernels/linux-2.6.28.10
2, makefile中M=所指定的路徑, 它等效於變數KBUILD_EXTMOD的值
3, 變數KBUILD_EXTRA_SYMBOLS的值

   我按照上面所敘述的對我的核心模組的Makefile 做了修改,在編譯命令那行加了“KBUILD_EXTRA_SYMBOLS=/linux-3.1.4/Module.symvers”引數,編譯問題仍沒解決。我想細心地朋友,也許發現了問題根本所在,adc: module license 'unspecified' taints kernel.
   對,主要問題就是沒有模組許可證宣告。而我在新增MODULE_LICENSE("GPL");  後問題解決了。

.