Linux内核模块KASAN编译配置失败,链接缺失符号求助
KASAN对可加载内核模块的支持及配置要点
KASAN完全支持可加载内核模块,你遇到的问题源于模块编译流程未与启用KASAN的内核配置完全对齐,以下是具体解决步骤和配置要求:
核心配置前提
- 确保内核编译时已开启
CONFIG_KASAN=y(这是模块KASAN支持的基础,KASAN不能以模块形式单独加载),同时开启CONFIG_DEBUG_INFO=y(KASAN需要调试符号定位错误)。 - 内核
.config中需保留CONFIG_MODULES=y(默认开启,允许加载模块),以及CONFIG_KASAN_INLINE=y(默认开启,影响KASAN符号的生成逻辑)。
正确编译模块的方法
不要手动修改/lib/modules/xxx下的配置文件,这会破坏内核构建系统的依赖链,导致链接符号缺失。正确的做法是直接基于你编译好的内核源码目录构建模块:
make -C /path/to/your/compiled/kernel/source M=$(pwd) modules
这个命令会自动继承内核源码目录中.config的所有配置(包括KASAN相关选项),编译时会自动添加-fsanitize=kernel-address等KASAN编译标志,链接阶段也会正确引用内核生成的KASAN符号(如__asan_handle_no_return)。
解决链接符号缺失问题
你手动复制auto.conf后出现的符号缺失,是因为模块编译时未使用内核构建系统提供的完整链接规则。内核的Makefile会自动处理KASAN相关的链接脚本和符号依赖,手动修改配置文件会丢失这些隐式规则。只要用上述正确的编译命令,就能避免这类问题。
验证模块KASAN启用状态
编译完成后,可通过以下命令检查模块是否已启用KASAN:
objdump -x your_module.ko | grep -E "(asan|kasan)"
如果输出包含KASAN相关的符号或段(如__asan_init、.asan.module_init),说明配置生效。加载模块后,KASAN会自动对模块内的内存操作进行检测,出现越界、使用释放内存等错误时,会打印详细的栈回溯信息。
常见避坑点
- 不要使用发行版预装的内核头文件编译带KASAN的模块,这类头文件通常未包含KASAN相关的宏和配置,必须使用自己编译内核时生成的源码目录。
- 若内核编译时开启了
CONFIG_KASAN_STACK=y(栈溢出检测),模块会自动继承该功能,无需额外配置。
内容的提问来源于stack exchange,提问作者John Ousterhout
相关产品推荐
相关产品推荐

