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

为何Linux内核模块无法包含kallsyms.h?如何正确编译?

解决Linux内核模块编译时头文件缺失及编译器版本问题

一、修复头文件缺失(linux/kallsyms.h找不到)

从编译日志可见,内核头文件目录存在拼写错误(gerneric应为generic),这是头文件找不到的核心原因,按以下步骤修复:

  1. 检查并修复内核头文件符号链接
    先查看当前build链接的指向:

    ls -l /lib/modules/5.19.0-46-generic/build
    

    如果输出显示链接指向拼写错误的/usr/src/linux-headers-5.19.0-46-gerneric,则重新创建正确链接:

    sudo rm /lib/modules/5.19.0-46-generic/build
    sudo ln -s /usr/src/linux-headers-5.19.0-46-generic /lib/modules/5.19.0-46-generic/build
    
  2. 重装内核头文件(链接修复后仍无效时)
    若头文件包损坏,执行重装命令:

    sudo apt-get install --reinstall linux-headers-$(uname -r) linux-headers-generic
    
  3. 验证头文件存在性
    检查目标头文件是否在正确路径:

    ls /usr/src/linux-headers-5.19.0-46-generic/include/linux/kallsyms.h
    

    若仍不存在,安装对应内核源码包补充:

    sudo apt-get install linux-source-5.19.0
    cd /usr/src
    sudo tar xjf linux-source-5.19.0.tar.bz2
    sudo ln -s linux-source-5.19.0 linux-source
    

    可在Makefile中添加源码头文件路径(仅当headers包确实缺失时使用):

    EXTRA_CFLAGS += -I/usr/src/linux-source/include
    

二、解决编译器版本不一致警告

内核使用gcc 11.3.0编译,当前环境用gcc 11.4.0,小版本差异虽不影响基础编译,但匹配版本可避免潜在问题:

  1. 安装对应版本的gcc

    sudo apt-get install gcc-11 gcc-11-multilib
    
  2. 在Makefile中指定编译器
    修改后的Makefile如下,确保使用gcc-11编译:

    obj-m := seafire.o
    KDIR := /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)
    CC := gcc-11
    
    all:
        $(MAKE) -C $(KDIR) M=$(PWD) modules
    
    clean:
        $(MAKE) -C $(KDIR) M=$(PWD) clean
    

三、额外注意事项

  • <linux/unistd.h>在Linux内核5.x版本中已被废弃,建议替换为<linux/syscalls.h>以避免后续编译问题。
  • 编译内核模块时确保源码目录权限正确,必要时用sudo make执行编译(不推荐日常使用,优先保证目录权限)。

内容的提问来源于stack exchange,提问作者Curtice Gough

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:22:30