在加載自己寫的3.1.4內(nèi)核的adc驅(qū)動(dòng)時(shí),頻頻出現(xiàn)下面的錯(cuò)誤提示,以前在2.6.29的內(nèi)核上從未碰到:
[root@LK2440 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
對(duì)于經(jīng)常寫驅(qū)動(dòng)的大牛來說這可能根本不是問題,但是它卻困擾我一段時(shí)間。反復(fù)查閱網(wǎng)上的資料,找到可以從以下幾點(diǎn)來解決這個(gè)問題,在此記錄:
據(jù)CSDN的一位網(wǎng)友 daidaiangel 所介紹的:
這是linux kernel 2.6.26 之后版本的bug (詳細(xì)描述, 請(qǐng)看http://bugzilla.kernel.org/show_bug.cgi?id=12446)
并且這個(gè)bug不會(huì)被fix
解決辦法是把mod_a的Module.symvers放到mod_b的當(dāng)前路徑,從而編譯mod_b,符號(hào)信息會(huì)自動(dòng)連接進(jìn)去.
或者在mod_b的makefile中使用KBUILD_EXTRA_SYMBOLS指定mod_a的Module.symvers, 如:
KBUILD_EXTRA_SYMBOLS=/mod_a/Module.symvers
編譯mod_b時(shí),搜索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的值
我按照上面所敘述的對(duì)我的內(nèi)核模塊的Makefile 做了修改,在編譯命令那行加了“KBUILD_EXTRA_SYMBOLS=/linux-3.1.4/Module.symvers”參數(shù),編譯問題仍沒解決。我想細(xì)心地朋友,也許發(fā)現(xiàn)了問題根本所在,adc: module license 'unspecified' taints kernel.
對(duì),主要問題就是沒有模塊許可證聲明。而我在添加MODULE_LICENSE("GPL"); 后問題解決了。
聯(lián)系客服