如何重新编译一个单一的内核模块?
通常内核源码存放在/usr/src/linux-2.6.x/
。 为了避免重新编译整个内核,如果我修改模块的源代码,我该如何重新编译模块?
切换到源代码树的根目录并运行以下命令:
$ make modules SUBDIRS=drivers/the_module_directory
并安装编译模块:
$ make modules_install SUBDIRS=drivers/the_module_directory
注意:正如lunakid提到的那样,后者的命令可能不会先build立模块,所以要小心。
您可以将path传递到模块名称或模块目录作为参数。
make path/to/the/module/itself.ko make path/to/the/module/directory/
因为内核版本3.xx和4.xx的过程变得更加复杂(但有一个希望,所以请继续阅读):
- 如果你不只是克隆一个新的源代码,而是用来构build其他的模块,那么就可以做一些修改
- 为模块源创build新的文件夹(例如: extra ),仅将与需要构build的模块相关的源文件(从内核源文件或其他地方)复制到这个新文件夹中
- 将
/boot/config-``uname -r
文件(例如: /boot/config-4.8.0-46-generic ) 复制到内核源文件夹文件.config中,然后运行make oldconfig
。 如果模块属于内核源,则通过调用make menuconfig
,通过search模块并在必要时应用字母“M”来validation它是否已被启用 - 内核源代码根Makefile必须用与当前正在运行的组件匹配的确切版本组件进行更改(如果与内核版本完全匹配,则可以使用
make kernelversion
validation) - 在制作脚本之前,也有强烈的build议来构build
make scripts
-
make prepare
,make modules_prepare
必须在实际的模块构build之前执行 - Module.symvers必须从相应的正在运行的内核版本
/usr/src/linux-headers-``uname -r``/Module.symvers
的目标系统头文件夹中复制(例如: /usr/src/linux-headers-3.13 .0-117-generic / Module.symvers )添加到为模块编译准备的新创build的模块源文件文件夹(示例中的一个附加文件 )中。 - 在模块源代码编译文件夹中创build新的Makefile文件,内容如下:
obj-y += <module_source_file_name>.o
或者源代码复杂,请使用这里的指导 - 只有这样才能正确地build立模块,
make -C <kernel source path> M=the_module_directory
使用make -C <kernel source path> M=the_module_directory
(例如:make -C . M=extra/
make -C <kernel source path> M=the_module_directory
make -C . M=extra/
) - 使用命令
modprobe --dump-modversion <module_name>.ko
validation模块导出API与Module.symvers中对应值之间的CRC匹配 - validationkernel.release文件内容是否与当前运行版本的标题完全匹配。 如果你在最后发现了+ ,这意味着你一直在编译git clonned source,而你的实验性修改导致了构build系统在最后加上+来折中localversionstring。
- 如果在kernel.release存储值的尾部只发现了+ ,并且与目标运行内核的确切名称不匹配,
解决scheme如下:
提交所有更改,强制释放标记,以便使用git tag -a <tag version> -f
命令移动到修改的上方。 然后从第8步重build你的模块