编译内核模块出现未定义符号错误:未使用相关符号却报错求助
内核模块编译出现未使用符号未定义错误的原因及解决方法
错误信息
ERROR: modpost: "root_mem_cgroup" [fs/xxx/xxx.ko] undefined! ERROR: modpost: "__detach_mounts" [fs/xxx/xxx.ko] undefined! ERROR: modpost: "mem_cgroup_update_lru_size" [fs/xxx/xxx.ko] undefined! ERROR: modpost: "__mod_lruvec_state" [fs/xxx/xxx.ko] undefined!
错误原因
- 间接依赖引入:模块本身未直接调用这些符号,但依赖的其他内核组件(如链接的对象文件、其他模块或内核内置代码)引用了这些符号,导致编译时需要解析它们。
- 内核配置缺失:这些符号均属于内存控制组(memcg)相关功能,若内核未开启
CONFIG_MEMCG及相关子选项(如CONFIG_MEMCG_LRU),会导致符号不存在。 - Makefile配置错误:模块编译脚本中可能误引入了不必要的依赖项,比如链接了不需要的内核对象,或依赖规则设置错误,导致编译过程中加载了包含这些符号的代码。
解决方法
1. 检查并调整内核配置
- 执行
grep CONFIG_MEMCG /usr/src/linux/.config查看内核是否开启内存控制组功能:- 若输出为空或为
# CONFIG_MEMCG is not set,需重新配置内核,开启CONFIG_MEMCG及CONFIG_MEMCG_LRU等相关选项,然后重新编译安装内核。
- 若输出为空或为
2. 修正模块Makefile
- 检查Makefile中的依赖规则,移除不必要的链接项,确保仅引入模块实际需要的内核头文件和对象依赖。
- 避免使用冗余的链接参数,比如不必要的
-l选项或额外的内核对象引用。
3. 排查间接依赖
- 使用
nm xxx.o | grep undefined查看模块目标文件的未定义符号,确认这些符号来自哪个依赖组件。 - 用
modinfo xxx.ko查看模块的依赖列表,确保所有依赖的模块已正确加载,且对应模块导出了所需符号。
4. 处理符号导出问题
- 若内核中存在这些符号但未导出(未使用
EXPORT_SYMBOL或EXPORT_SYMBOL_GPL标记),可尝试升级内核到支持这些符号导出的版本;若必须使用当前内核,需修改内核代码导出对应符号(不推荐,可能破坏内核稳定性)。
内容的提问来源于stack exchange,提问作者user1651758
相关产品推荐
相关产品推荐

