You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:19:58