我按照文檔編譯了一個驅動程式。但是當我嘗試通過加載它們時
insmod onebox_wlan_nongpl.ko
,我收到一條錯誤訊息:
insmod:錯誤:無法插入模組 onebox_wlan_nongpl.ko:模組中的未知符號
我知道這是由於加載.ko
文件的順序錯誤造成的,但它沒有告訴我它依賴於哪個模組。我想知道什麼符號是未知的,無法歸檔我應該首先加載的模組。
答案1
您可以使用 簡單地檢查 dmesg 中缺少的符號dmesg | tail
。如果您想檢查符號是否確實在符號表中,請使用cat /proc/kallsyms | grep <function_name>
類似問題進行檢查:
https://ubuntuforums.org/showthread.php?t=1360950
答案2
若要查看實際遺失了哪些符號,請使用 查看核心日誌dmesg
。它會向您顯示確切的符號。如果您自己編寫了核心模組,並且它依賴於裝置映射框架之類的框架,則必須先載入依賴項。這是我遇到的一個例子:
我寫了一個裝置映射器,這取決於設備映射框架。插入時,會發生這種情況:
$ sudo insmod some-module.ko
insmod: ERROR: could not insert module some-module.ko: Unknown symbol in module
檢查內核日誌:
$ sudo dmesg
[ XX.XXXXXX] some-module.ko: Unknown symbol dm_per_bio_data (err -2)
[ XX.XXXXXX] some-module.ko: Unknown symbol dm_put_device (err -2)
...
檢查加載的模組:
$ lsmod | grep dm
<NOTHING>
插入裝置映射目標驅動程式:
$ sudo modprobe dm_mod
$ lsmod | grep dm
dm_mod 184320 0
現在插入原始模組,錯誤已解決。