加载驱动时发现有未知的符号表,下面记录一下定位的过程。
root@OpenWrt:~# insmod slic3_intel.ko
77.827684 slic3_intel: Unknown symbol SLICMGR_HOOK_REGISTER (err -2)
77.834429 slic3_intel: Unknown symbol SPI_bytes_write (err -2)
77.840652 slic3_intel: Unknown symbol SPI_bytes_read (err -2)
failed to insert slic3_intel.ko
root@OpenWrt:~# SLICMGR_HOOK_REGISTER 105.432913 oltvendor_id 0
查看ko依赖关系:
insmod sys_mod.ko
root@hnk:/# cat /proc/kallsyms | grep SLICMGR_HOOK_REGISTER
e5d6cd88 T SLICMGR_HOOK_REGISTER fxs3
可以看到SLICMGR函数在fxs3模块
接下来需要insmod fxs3.ko
root@OpenWrt:/lib/modules# insmod fxs3.ko
394.792002 fxs3: Unknown symbol getPcmConfig (err -2)
394.797421 fxs3: Unknown symbol SPI_Reset (err -2)
394.802379 fxs3: Unknown symbol pcm_setFreeRunMode (err -2)
394.808241 fxs3: Unknown symbol pcmChipScuQuery (err -2)
394.813729 fxs3: Unknown symbol SPI_cfg (err -2)
394.818519 fxs3: Unknown symbol pSLIC_Reset (err -2)
394.823806 fxs3: Unknown symbol pcm_reinit_slic (err -2)
394.829342 fxs3: Unknown symbol SPI_bytes_write (err -2)
394.834868 fxs3: Unknown symbol SPI_bytes_read (err -2)
接下来安装下面的ko,使用cat /proc/kallsyms | grep SLICMGR_HOOK_REGISTER依次找到函数属于那个ko模块,加载相应的ko即可
insmod spi.ko
insmod sys_mod.ko
insmod lec.ko
insmod DSPCore.ko
insmod spi.ko
insmod pcm1.ko
insmod spi.ko
insmod fxs3.ko
insmod slic3_intel.ko
最后可以看到加载成功了。
那么没有正常的设备可以看到cat /proc/kallsyms | grep SLICMGR_HOOK_REGISTER呢,我们怎么找到ko的依赖关系呢。
(1)查看vmlinux
nm vmlinux | grep SLICMGR_HOOK_REGISTER
readelf -s vmlinux | grep SLICMGR_HOOK_REGISTER
(2),查看ko依赖关系:
readelf -s module.ko | grep SLICMGR_HOOK_REGISTER
modinfo module.ko
如果在 vmlinux 或 .ko 中找不到该符号,可能是因为没有使用 EXPORT_SYMBOL 导出,或者没有正确配置内核编译选项。确保在驱动源码中使用了 EXPORT_SYMBOL,并且在内核配置中启用了符号导出选项,例如:
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
1,扫描系统KO文件:遍历 /lib/modules/$(uname -r)/kernel/ 下所有 .ko 文件
使用 nm -D *.ko | grep SLICMGR_HOOK_REGISTER
ubuntu@ubuntu:~/test/BSP/sdk_2.1$ nm openwrt-21.02/openwrt-21.02.1_dev/staging_dir/target-aarch64_cortex-a53_musl/root-airoha/lib/modules/fxs3.ko | grep SLICMGR_HOOK_REGISTER
0000000000015654 T SLICMGR_HOOK_REGISTER
ubuntu@ubuntu:~/test/BSP/sdk_2.1 nm openwrt-21.02/openwrt-21.02.1_dev/staging_dir/target-aarch64_cortex-a53_musl/root-airoha/lib/modules/pcm1.ko | grep getPcmConfig
00000000000000a0 T getPcmConfig
依赖关系追踪方法
获取目标模块依赖树:modinfo target.ko | grep depends
2,扫描vmlinux:
使用 nm -D vmlinux | grep SLICMGR_HOOK_REGISTER