Linux内核从4.18升级到5.14后编译KO遇memset_s未定义问题求解
Linux内核4.18升级至5.14后memset_s未定义的KO编译问题解决方案
场景1:可修改内核源码添加EXPORT_SYMBOL()时的解决步骤
- 定位内核中
memset_s的实现文件:通常在lib/string.c - 在
memset_s函数定义下方添加导出声明:EXPORT_SYMBOL(memset_s); - 重新编译内核环境及目标KO模块:先执行
make prepare更新内核编译环境,再重新编译你的模块;若需完整内核更新,执行make && make modules_install && make install后再编译模块
场景2:无法修改内核源码时的解决方案
方案1:在模块源码中自行实现memset_s
参考内核函数逻辑,在模块代码中添加适配的实现,示例:
#include <linux/types.h> #include <linux/string.h> #include <linux/minmax.h> void *memset_s(void *s, size_t smax, int c, size_t n) { if (!s) return NULL; n = min(n, smax); return memset(s, c, n); }
确保实现行为与内核memset_s一致,避免功能偏差。
方案2:替换模块中对memset_s的调用
若模块中memset_s的调用逻辑简单,直接替换为内核已导出的memset函数,调整参数适配:
比如将原调用:
memset_s(buf, BUF_SIZE, 0, data_len);
替换为:
memset(buf, 0, min(data_len, BUF_SIZE));
方案3:调整模块编译参数
检查模块Makefile,尝试添加链接内核字符串库的参数:
EXTRA_LDFLAGS += -lstring
注:该方法仅适用于部分内核版本,需根据实际编译环境验证有效性。
内容的提问来源于stack exchange,提问作者Dog Fish
相关产品推荐
相关产品推荐

