use*_*635 48 linux makefile gnu-make kernel-module linux-kernel
通常内核源存储在/usr/src/linux-2.6.x/
.如果我修改模块的源代码,为了避免重新编译整个内核,我该如何重新编译该模块?
Nik*_* B. 56
切换到源树的根目录并运行以下命令:
$ make modules SUBDIRS=drivers/the_module_directory
Run Code Online (Sandbox Code Playgroud)
并安装已编译的模块:
$ make modules_install SUBDIRS=drivers/the_module_directory
Run Code Online (Sandbox Code Playgroud)
注意:正如lunakid所提到的,后一个命令可能不会先构建模块,所以要小心.
Ole*_*rin 13
因为内核版本3.xx和4.xx程序变得更复杂(但是有希望,所以请继续阅读):
make distclean
如果您还没有克隆新的源,但之前用于构建其他模块/boot/config-`uname -r`
文件(例如:/boot/config-4.8.0-46-generic)复制到内核源文件夹文件.config并运行make oldconfig
.如果模块属于内核源,请通过调用验证是否已启用make menuconfig
,通过搜索模块并在必要时应用字母"M"make kernelversion
它是否与其完全匹配uname -r
)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)到新创建的模块源文件夹中为模块汇编(一个额外的例子中).obj-y += <module_source_file_name>.o
或者如果源代码很复杂,请使用此处的指导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重建您的模块
小智 8
如果您仅编辑 drivers/net/ethernet/intel/e1000/e1000_main.c 文件中的代码
构建模块。
make scripts prepare modules_prepare
make -C . M=drivers/net/ethernet/intel/e1000
Run Code Online (Sandbox Code Playgroud)
安装模块。
cp drivers/net/ethernet/intel/e1000/e1000.ko /lib/modules/5.1.15/kernel/drivers/net/ethernet/intel/e1000/e1000.ko
Run Code Online (Sandbox Code Playgroud)
您可以将路径传递给模块名称或模块目录以作为参数.
make path/to/the/module/itself.ko
make path/to/the/module/directory/
Run Code Online (Sandbox Code Playgroud)