insmod: error inserting 'sequans_usb.ko': -1 Unknown symbol in module

本文介绍了解决sequans_usb.ko模块加载时出现未知符号错误的方法。通过先加载依赖模块usbnet,成功解决了sequans_usb.ko的加载问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

root@king-e430:/home/king/nationz/mImage# insmod sequans_usb.ko
insmod: error inserting 'sequans_usb.ko': -1 Unknown symbol in module

用dmesg 查看启动信息:

root@king-e430:/home/king/nationz/mImage#dmesg | tail

[ 4731.336634] sequans_usb: Unknown symbol usbnet_suspend (err 0)
[ 4731.336670] sequans_usb: Unknown symbol usbnet_get_endpoints (err 0)
[ 4731.336728] sequans_usb: Unknown symbol usbnet_disconnect (err 0)
[ 4731.336749] sequans_usb: Unknown symbol usbnet_probe (err 0)
[ 4731.336772] sequans_usb: Unknown symbol usbnet_resume (err 0)
[ 4947.970005] sequans_usb:  INFO| Module paramters:
[ 4947.970043] sequans_usb:  INFO| registering THP class in sysfs
[ 4947.970106] usbcore: registered new interface driver sequans_usb
[ 5040.618057] usbcore: deregistering interface driver sequans_usb
[ 5040.618108] sequans_usb:  INFO| unregistered region for THP devices

root@king-e430:/home/king/nationz/mImage#./sequans_usb.ko |grep depend

depends:        usbnet

加载该模块后,sequans_usb.ko就可以顺利加载

root@king-e430:/home/king/nationz/mImage#modprobe usbnet

root@king-e430:/home/king/nationz/mImage#insmod ./sequans_usb.ko

成功加载
<think>我们正在处理一个内核模块加载时出现的"Unknown symbol in module"错误。用户试图加载wlan_mt7961_usb.ko驱动模块,但遇到了这个错误。根据引用[1]和[3],这个错误通常是由于模块依赖的符号(函数或变量)没有在当前内核中定义,或者依赖的其他模块没有被加载。 解决思路: 1. 使用`modinfo`命令检查该模块的依赖关系,查看是否有依赖的模块需要先加载。 2. 使用`dmesg`或`journalctl`查看内核日志,确定缺失的符号名称。 3. 根据缺失的符号,查找哪个模块提供了这个符号,然后先加载那个模块。 4. 如果缺失的符号是由内核本身提供的,那么可能是内核配置问题,需要确保内核配置中包含了该符号对应的功能(通常需要重新配置内核并编译,或者安装对应的内核头文件/开发包)。 5. 如果模块是第三方提供的,可能需要检查该模块是否是为当前运行的内核版本编译的(引用[3]中提到的vermagic检查)。 具体步骤: 步骤1:使用modinfo查看模块信息 ``` modinfo wlan_mt7961_usb.ko ``` 注意查看"depends"字段,它列出了该模块所依赖的其他模块。如果存在依赖模块,需要先加载这些模块。 步骤2:加载依赖模块 如果modinfo显示了依赖模块(比如cfg80211、mac80211等),则按顺序加载这些模块。例如: ``` insmod cfg80211.ko insmod mac80211.ko # 然后再加载wlan_mt7961_usb.ko insmod wlan_mt7961_usb.ko ``` 步骤3:检查内核日志 如果加载时仍然出现Unknown symbol错误,使用`dmesg`查看详细的错误信息,通常会显示缺失的符号名称。例如: ``` dmesg | tail -n 20 ``` 可能会看到类似这样的信息: ``` wlan_mt7961_usb: Unknown symbol mt76_alloc_device (err 0) ``` 步骤4:查找符号所在的模块 我们可以使用以下方法查找符号所在的模块: 方法1:在已经加载的内核模块中查找 ``` grep mt76_alloc_device /proc/kallsyms ``` 如果该符号已由某个模块导出,那么这里会显示该符号以及模块名(如果有的话,模块名会出现在符号后面的方括号内)。注意,如果该符号是由内核本身(vmlinux)导出的,则不会显示模块名。 方法2:使用System.map文件(需要内核的System.map文件,通常在/boot目录下) ``` grep mt76_alloc_device /boot/System.map-$(uname -r) ``` 如果找到,说明该符号应该由内核提供,那么可能是内核配置问题(没有开启对应的配置选项)或者内核版本不匹配。 方法3:如果符号是由另一个模块提供的,我们可以尝试在模块目录下查找哪个模块包含这个符号(使用modprobe的查找功能): ``` modprobe --show-depends <模块名> # 这需要模块已经被安装到lib/modules ``` 或者,我们可以使用以下命令来查找模块中导出的符号(需要先安装模块): ``` # 假设模块在/lib/modules/`uname -r`/kernel/drivers/net/wireless/... modinfo -F export /lib/modules/`uname -r`/kernel/drivers/net/wireless/mediatek/mt76/mt76.ko | grep mt76_alloc_device ``` 步骤5:解决符号依赖 如果发现缺失的符号是由另一个模块(例如mt76)提供的,那么我们需要先加载这个模块。例如: ``` insmod mt76.ko ``` 然后再加载wlan_mt7961_usb.ko。 步骤6:内核配置问题 如果缺失的符号应该由内核提供,但当前内核没有提供(比如在System.map中找不到,或者在内核配置中没有开启对应的选项),那么就需要重新配置内核并编译,或者安装与当前内核版本匹配的内核头文件/开发包。 但是,由于用户是在开发板上操作,重新编译内核可能比较复杂。因此,建议先检查是否已经加载了所有必要的依赖模块。 另外,引用[1]中提到,有时需要将cfg80211编译成模块并加载。因此,请确保cfg80211模块已经加载(如引用[1]和[2]所示)。 引用[2]中还提到了加载顺序,所以请务必按照正确的顺序加载模块。 总结: 1. 检查依赖模块并加载它们(使用modinfo查看)。 2. 查看dmesg日志,确定缺失的符号。 3. 找到提供该符号的模块并先加载它。 4. 如果符号由内核提供,检查内核配置和版本。 注意:如果模块是商业驱动,可能需要联系供应商获取正确的依赖关系。 如果以上步骤仍然无法解决,可能需要重新编译该驱动模块,确保它针对当前运行的内核版本进行编译,并且编译时依赖的内核头文件与运行内核一致。 最后,根据引用[4],Module.symvers文件在编译过程中记录符号的CRC值和模块名,如果驱动模块是单独编译的,可能需要确保在编译时使用的Module.symvers文件包含了所有依赖模块的符号信息。这通常要求将驱动模块放在内核源码树中编译,或者使用正确的Module.symvers文件进行外部编译。 因此,如果问题依旧,可能需要从源码重新编译该驱动模块。 希望这些步骤能帮助用户解决问题。</think>### 解决 insmod 加载 wlan_mt7961_usb.ko 驱动失败 "Unknown symbol in module" 错误 #### 问题原因分析 "Unknown symbol in module" 错误表明内核模块依赖的符号(函数或变量)未被解析,通常由以下原因导致: 1. **依赖模块未加载**:当前模块需要其他模块提供的符号(如 `cfg80211` 等无线驱动基础设施)[^1][^3] 2. **内核版本不匹配**:模块编译时的内核版本与当前运行内核不一致(可通过 `uname -r` 和 `modinfo` 验证) 3. **符号未导出**:依赖的符号未在目标内核中导出(需检查内核配置) 4. **加载顺序错误**:模块间存在依赖关系,必须按特定顺序加载[^2] --- #### 解决步骤 ##### 1. **检查模块依赖关系** ```bash modinfo wlan_mt7961_usb.ko | grep depends ``` 输出示例: `depends: cfg80211,mt76-usb,mt76-connac-lib,mt76` **操作**:按顺序加载所有依赖模块(顺序不可颠倒)[^2][^3]: ```bash insmod cfg80211.ko # 无线配置基础模块[^1] insmod mt76.ko # 公共驱动模块 insmod mt76-usb.ko # USB接口支持 insmod mt76-connac-lib.ko # 芯片组支持库 insmod wlan_mt7961_usb.ko # 目标驱动 ``` ##### 2. **诊断缺失符号** ```bash dmesg | grep "Unknown symbol" | tail -n 1 ``` 输出示例: `mt7961_usb: Unknown symbol mt76_alloc_device (err -2)` **操作**: - 验证符号提供者(以 `mt76_alloc_device` 为例): ```bash grep mt76_alloc_device /proc/kallsyms ``` 若无输出,说明符号未导出或提供模块未加载 ##### 3. **解决符号依赖** - **情况1**:符号由其他模块提供 通过 `modprobe` 查找符号所属模块: ```bash modprobe --show-depends mt76 # 假设符号在mt76模块中 insmod /lib/modules/$(uname -r)/kernel/drivers/net/wireless/mediatek/mt76/mt76.ko ``` - **情况2**:符号由内核核心提供 检查内核配置是否导出符号: ```bash grep CONFIG_MT76 /boot/config-$(uname -r) ``` 若未启用,需重新配置内核并编译: ```makefile CONFIG_MT76=y CONFIG_MT76_USB=y CONFIG_MT76_CONNAC_LIB=y ``` ##### 4. **验证内核版本兼容性** ```bash # 检查运行内核版本 uname -r # 检查模块编译环境 modinfo wlan_mt7961_usb.ko | grep vermagic ``` 若版本不一致,需重新编译模块: ```bash make -C /lib/modules/$(uname -r)/build M=/path/to/driver ``` ##### 5. **高级调试** - 查看符号表映射: ```bash cat /proc/kallsyms | grep mt76_ # 检查相关符号状态 ``` - 加载后启用网卡: ```bash ifconfig wlan0 up # 激活接口[^2] ``` --- #### 预防措施 1. **编译驱动时**:确保 `Module.symvers` 包含所有依赖模块的符号[^4] 2. **加载模块时**:使用 `modprobe` 自动处理依赖(需先安装模块到 `/lib/modules`) 3. **内核配置**:启用 `CONFIG_WIRELESS` 和 `CONFIG_CFG80211` 等无线支持选项 > **关键提示**: > - 驱动开发需保持内核头文件版本与运行内核**完全一致** > - 复杂驱动(如无线网卡)通常有严格加载顺序,参考厂商文档[^2] > - 若问题持续,检查 `dmesg` 完整日志,聚焦 `Unknown symbol` 后的符号名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值