内核模块insmod时符号版本不匹配问题的解决方法
解决RDMA内核模块符号版本不匹配问题
核心问题定位
你遇到的符号不匹配/未知符号问题,本质是编译mcswap时依赖的RDMA符号校验值,和系统当前加载的DKMS版ib_core提供的符号校验值不一致。本地Module.symvers为空,导致编译时只能从系统默认路径拉取符号,而系统存在多份不同的Module.symvers,直接引发符号匹配冲突。
具体解决步骤
1. 锁定系统当前使用的ib_core符号源
先确认DKMS版ib_core的编译路径,执行命令:
modinfo ib_core | grep srcversion # 同时查看DKMS模块的编译目录,通常路径为/var/lib/dkms/ib_core/<对应版本>/build/
找到该DKMS目录下的Module.symvers,这个文件才是当前运行内核实际依赖的符号基准。
2. 强制mcswap编译时使用正确的符号文件
修改你的Makefile,添加指定符号文件的参数,确保编译过程绑定DKMS版ib_core的符号:
# 替换为实际的DKMS ib_core的Module.symvers路径 KBUILD_EXTRA_SYMBOLS := /var/lib/dkms/ib_core/<你的模块版本>/build/Module.symvers
或者直接将DKMS目录下的Module.symvers复制到mcswap的编译目录,覆盖空的本地文件。
3. 重新编译并清理旧模块
编译前先清理旧产物,避免缓存干扰:
make clean make rmmod mcswap # 如果之前加载过该模块 insmod mcswap.ko
之后查看dmesg输出,确认符号错误是否消失。
4. 清理系统中的符号文件冲突
/usr/src下存在多份不同的Module.symvers,说明系统可能残留了多版本内核开发包或RDMA模块编译产物,可做以下操作:
- 删除未使用的内核开发包,仅保留当前运行版本(5.15.0-127-generic)的对应包
- 检查DKMS模块的内核版本匹配性,执行
dkms status查看,若版本不匹配则重新编译DKMS模块:
dkms remove ib_core/<模块版本> --all dkms install ib_core/<模块版本> -k 5.15.0-127-generic
5. 验证符号一致性
编译完成后,用nm命令对比mcswap和ib_core的符号校验值:
nm -D mcswap.ko | grep rdma_leave_multicast nm -D /lib/modules/5.15.0-127-generic/updates/dkms/ib_core.ko | grep rdma_leave_multicast
两者的符号校验值一致,即说明符号匹配正常。
内容的提问来源于stack exchange,提问作者id_17
相关产品推荐
相关产品推荐

