如何重新编译单个内核模块?

问题描述 投票:0回答:6

通常内核源代码存储在

/usr/src/linux-2.6.x/
中。 为了避免在修改模块的源代码时重新编译整个内核,如何重新编译该模块?

linux makefile linux-kernel gnu-make kernel-module
6个回答
63
投票

切换到源代码树的根目录并运行以下命令:

$ make modules SUBDIRS=drivers/the_module_directory

并安装已编译的模块:

$ make modules_install SUBDIRS=drivers/the_module_directory

注意: 正如 lunakid 提到的,后一个命令可能先构建模块,所以要小心。


27
投票

从内核版本3.x.x4.x.x开始,过程变得更加复杂(但有希望,所以继续阅读):

  1. make distclean
    如果您不仅克隆了新源而且之前还用于构建其他模块
  2. 在某处为模块源创建新文件夹(例如:extra) 并仅将与需要构建的模块相关的源文件(来自内核源或其他地方)复制到这个新文件夹中
  3. /boot/config-`uname -r`
    文件(例如:/boot/config-4.8.0-46-generic)复制到内核源文件夹文件.config并运行
    make oldconfig
    。如果该模块属于内核源代码,请通过调用
    make menuconfig
    、搜索该模块并在必要时应用字母“M”来验证它是否已启用
  4. 内核源根目录 Makefile 必须使用与当前运行组件匹配的确切版本组件进行更改(如果它与
    make kernelversion
    完全匹配,您可以使用
    uname -r
    进行验证)
  5. 之前也强烈建议构建脚本
    make scripts
  6. make prepare
    make modules_prepare
    必须在实际模块构建之前执行
  7. Module.symvers 必须从对应运行内核版本
    /usr/src/linux-headers-`uname -r`/Module.symvers
    (示例:/usr/src/linux-headers-3.13.0-117-generic/Module.symvers)的目标系统标头文件夹复制到为模块编译准备的新创建的模块源文件文件夹(示例中的extra)。
  8. 在模块源编译文件夹中创建新的Makefile,其中包含以下行:
    obj-y += <module_source_file_name>.o
    或者如果源代码很复杂,请使用此处
  9. 的指导
  10. 只有这样,才是使用
    make -C <kernel source path> M=the_module_directory
    构建模块的正确时机(示例:
    make -C . M=extra/
  11. 使用命令
    modprobe --dump-modversion <module_name>.ko
    验证模块导出API与Module.symvers中相应值之间的CRC匹配。如果失败,请使用命令
    modinfo <module_name>.ko
    代替
  12. 验证 kernel.release 文件内容是否与当前运行版本的标头中的内容完全匹配。如果您发现末尾附加了 +,则意味着您一直在编译 git 克隆源代码,并且您的实验性修改导致构建系统通过在末尾添加 + 来破坏本地版本字符串。
  13. 如果仅在 kernel.release 存储值的尾部发现 +,并且它与目标运行内核的确切名称不匹配,

解决方案如下:

提交所有更改,使用

git tag -a <tag version> -f
命令强制释放标签移动到您的修改之上。然后从第 8 步开始重建模块


9
投票

您可以将模块名称或模块目录的路径作为参数传递给make。

make path/to/the/module/itself.ko
make path/to/the/module/directory/

9
投票

如果您只编辑 drivers/net/ethernet/intel/e1000/e1000_main.c 文件中的代码

构建模块。

make scripts prepare modules_prepare
make -C . M=drivers/net/ethernet/intel/e1000

安装模块。

cp drivers/net/ethernet/intel/e1000/e1000.ko /lib/modules/5.1.15/kernel/drivers/net/ethernet/intel/e1000/e1000.ko

4
投票
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install

https://askubuntu.com/questions/515407/how-recipe-to-build-only-one-kernel-module


0
投票

我无法发表评论。因此,要完成 Niklas B. 对于

kernel-5.15
系列

的回答

切换到源代码树的根目录并运行以下命令。

make prepare
make modules SUBDIRS=drivers/the_module_directory
make modules_install SUBDIRS=drivers/the_module_directory

modules_install
重新安装所有驱动程序。我不知道是否可以/建议复制您的驱动程序。

使用

rtl8xxxu
驱动程序进行测试。

© www.soinside.com 2019 - 2024. All rights reserved.