【发布时间】:2012-02-03 08:54:12
【问题描述】:
通常内核源代码存储在/usr/src/linux-2.6.x/。
为避免在修改模块源代码时重新编译整个内核,如何仅重新编译该模块?
【问题讨论】:
标签: linux makefile linux-kernel gnu-make kernel-module
通常内核源代码存储在/usr/src/linux-2.6.x/。
为避免在修改模块源代码时重新编译整个内核,如何仅重新编译该模块?
【问题讨论】:
标签: linux makefile linux-kernel gnu-make kernel-module
切换到源代码树的根目录并运行以下命令:
$ make modules SUBDIRS=drivers/the_module_directory
并安装编译后的模块:
$ make modules_install SUBDIRS=drivers/the_module_directory
注意:正如 lunakid 所提到的,后一个命令可能不会先构建模块,所以要小心。
【讨论】:
SUBDIRS 与 CWD 相关:P
make modules_install SUBDIRS=...。这几乎可以肯定是下一步,并且可能不会立即变得微不足道(即使看起来如此,例如,在我花了几分钟谷歌搜索它是徒劳的...... :) )。谢谢,干杯!
由于内核版本 3.x.x 和 4.x.x 程序变得更加复杂(但有希望,所以请继续阅读):
make distclean 如果您之前没有克隆过新的源代码,而是用于构建其他模块/boot/config-`uname -r`文件(例如:/boot/config-4.8.0-46-generic)复制到内核源文件夹文件.config并运行make oldconfig .如果模块属于内核源,请通过调用make menuconfig 验证它是否已启用,通过搜索模块并在必要时应用字母“M”uname -rone 完全匹配,您可以使用 make kernelversion 进行验证)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 步重建你的模块
【讨论】:
您可以将要制作的模块名称或模块目录的路径作为参数传递。
make path/to/the/module/itself.ko
make path/to/the/module/directory/
【讨论】:
如果您只编辑了 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
【讨论】:
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
【讨论】: