通常内核源存储在/usr/src/linux-2.6.x/
中。
如果我修改模块的源代码,为了避免重新编译整个内核,我该如何重新编译该模块呢?
答案 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 ,程序变得更加复杂(但有希望,请继续阅读):
make distclean
如果你还没有克隆新的来源但是在/boot/config-`uname -r`
文件(例如: /boot/config-4.8.0-46-generic )复制到内核源文件夹文件 .config 并运行{ {1}}。如果模块属于内核源,请通过调用make oldconfig
验证是否已启用,通过搜索模块并在必要时应用字母“M”make menuconfig
与make kernelversion
完全匹配,则可以与uname -r
进行验证)< / LI>
make scripts
make prepare
和make modules_prepare
必须在实际模块构建之前执行/usr/src/linux-headers-`uname -r`/Module.symvers
(例如: /usr/src/linux-headers-3.13.0 -117-generic / Module.symvers )进入为模块编译准备的新创建的模块源文件文件夹(例如 extra )。obj-y += <module_source_file_name>.o
或者如果源代码很复杂,请使用here make -C <kernel source path> M=the_module_directory
构建模块的正确时间(例如:make -C . M=extra/
)modprobe --dump-modversion <module_name>.ko
验证模块导出API与 Module.symvers 中相应值之间的CRC匹配。如果失败,请使用命令modinfo <module_name>.ko
代替解决方案如下:
提交所有更改,强制释放标记使用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