How to recompile just a single kernel module?
Usually kernel source are stored in /usr/src/linux-2.6.x/
.
To avoid to recompile the entire kernel if I modify a module's source, how can I recompile just that module?
Solution 1:
Switch to the root directory of your source tree and run the following command:
$ make modules SUBDIRS=drivers/the_module_directory
And to install the compiled module:
$ make modules_install SUBDIRS=drivers/the_module_directory
Note: As lunakid mentions, the latter command might not build the module first, so be careful.
Solution 2:
since kernel versions 3.x.x and 4.x.x the procedure gets more complicated (but there is a hope, so keep reading):
-
make distclean
if you haven't just cloned a new source but used to build other modules before - create new folder somewhere for the module source (example: extra) and copy only source files (from the kernel source or somewhere else) related to the module needed to be build into this new folder
- copy
/boot/config-`uname -r`
file (example: /boot/config-4.8.0-46-generic) into kernel source folder file .config and runmake oldconfig
. if the module belongs to the kernel source, verify if it has been enabled by callingmake menuconfig
, by searching for the module and applying letter 'M' if necessary - kernel source root Makefile has to be altered with exact version components matching the current running one (you may verify with
make kernelversion
if it matches exactly theuname -r
one) - there is been a strong suggestion to build scripts also before with
make scripts
-
make prepare
andmake modules_prepare
has to be executed prior to the actual module build -
Module.symvers has to be copied from the target system headers folder corresponding running kernel version
/usr/src/linux-headers-`uname -r`/Module.symvers
(example: /usr/src/linux-headers-3.13.0-117-generic/Module.symvers) into the newly created module source files folder prepared for the module compilation (the one extra in example). - create new Makefile inside module source compilation folder having following line:
obj-y += <module_source_file_name>.o
or if the source code is complicated, use the guidance from here - only then it's the right time to build module with
make -C <kernel source path> M=the_module_directory
(example:make -C . M=extra/
) - Use command
modprobe --dump-modversion <module_name>.ko
to verify CRC match between module exporting API and corresponding values in Module.symvers. in case of failure use commandmodinfo <module_name>.ko
instead - verify if kernel.release file content match exactly the one from headers of the current running version. if you'll discover + appended at the end, it means you've been compiling git clonned source and your experimental modifications caused build system to compromise the localversion string by adding + at the end.
- if only + has been discovered at the tail of kernel.release stored value and it's a mismatch with the exact name of the target running kernel,
the solution would be following:
commit all your changes, force release tag to shift above your modifications with the git tag -a <tag version> -f
command. then rebuild your modules from step 8
Solution 3:
You can pass the path to the module name or module directory to make as parameter.
make path/to/the/module/itself.ko
make path/to/the/module/directory/
Solution 4:
In case you have edited just code in drivers/net/ethernet/intel/e1000/e1000_main.c file
Build the module.
make scripts prepare modules_prepare
make -C . M=drivers/net/ethernet/intel/e1000
Install the module.
cp drivers/net/ethernet/intel/e1000/e1000.ko /lib/modules/5.1.15/kernel/drivers/net/ethernet/intel/e1000/e1000.ko
Solution 5:
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