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

时间:2012-01-05 14:26:52

标签: linux linux-kernel kernel

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

5 个答案:

答案 0 :(得分:56)

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

$ make modules SUBDIRS=drivers/the_module_directory

并安装已编译的模块:

$ make modules_install SUBDIRS=drivers/the_module_directory

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

答案 1 :(得分:9)

由于内核版本 3.x.x 4.x.x ,程序变得更加复杂(但有希望,请继续阅读):

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

    提交所有更改,强制释放标记使用git tag -a <tag version> -f命令转移到修改之上。然后从第8步重建模块

答案 2 :(得分:7)

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

如果您仅编辑了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