Обычно исходники ядра хранятся в /usr/src/linux-2.6.x/. Чтобы избежать перекомпиляции всего ядра при изменении исходного кода модуля, как я могу перекомпилировать только этот модуль?
Как перекомпилировать только один модуль ядра?
Ответы (5)
Переключитесь в корневой каталог вашего исходного дерева и выполните следующую команду:
$ make modules SUBDIRS=drivers/the_module_directory
И установить скомпилированный модуль:
$ make modules_install SUBDIRS=drivers/the_module_directory
Примечание. Как упоминает lunakid, последняя команда может не построить модуль первой, так что будьте осторожны.
SUBDIRS относится к CWD: P
- person Niklas B.; 12.05.2014
make modules_install SUBDIRS=.... Это почти наверняка следующий шаг, и он может быть не сразу тривиальным (хотя это кажется так, например, после того, как я напрасно потратил несколько минут на гугление... :)). Спасибо, ура!
- person Sz.; 12.05.2014
mmc_block.ko возвращает сообщение, которое говорит что-то вроде No rule to make block.o.
- person Melab; 04.12.2015
начиная с версий ядра 3.x.x и 4.x.x процедура усложняется (но надежда есть, так что продолжайте читать):
make distcleanесли вы не просто клонировали новый исходный код, но использовали его для сборки других модулей ранее- создайте новую папку где-нибудь для исходного кода модуля (пример: extra) и скопируйте в эту новую папку только исходные файлы (из исходного кода ядра или где-то еще), относящиеся к модулю, который необходимо собрать.
- скопируйте файл
/boot/config-`uname -r`(пример: /boot/config-4.8.0-46-generic) в файл исходной папки ядра .config и запуститеmake oldconfig. если модуль принадлежит к исходному коду ядра, проверьте, был ли он включен, вызвавmake menuconfig, выполнив поиск модуля и при необходимости применив букву «M» - Корень исходного кода ядра Makefile должен быть изменен, чтобы компоненты точной версии соответствовали текущей версии (вы можете проверить с помощью
make kernelversion, если он точно соответствуетuname -rone) - было сильное предложение создать скрипты и раньше с
make scripts make prepareиmake modules_prepareдолжны быть выполнены до фактической сборки модуля- Module.symvers необходимо скопировать из папки заголовков целевой системы, соответствующей работающей версии ядра
/usr/src/linux-headers-`uname -r`/Module.symvers(пример: /usr/src/linux-headers-3.13.0-117-generic/Module. symvers) в только что созданную папку с исходными файлами модуля, подготовленную для компиляции модуля (одна дополнительная в примере). - создайте новый Makefile внутри папки компиляции исходного кода модуля со следующей строкой:
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, чтобы проверить соответствие CRC между модулем, экспортирующим API, и соответствующими значениями в Module.symvers. в случае неудачи используйте вместо этого командуmodinfo <module_name>.ko - проверьте, совпадает ли содержимое файла kernel.release с заголовком текущей запущенной версии. если вы обнаружите + в конце, это означает, что вы компилировали клонированный исходный код git, и ваши экспериментальные модификации привели к тому, что система сборки скомпрометировала строку localversion, добавив + в конце.
- если в конце сохраненного значения kernel.release обнаружен только + и это несоответствие точному имени целевого работающего ядра,
решение будет следующим:
зафиксируйте все свои изменения, заставьте тег выпуска сместиться над вашими изменениями с помощью команды git tag -a <tag version> -f. затем перестройте свои модули с шага 8
Вы можете передать путь к имени модуля или каталогу модуля, чтобы сделать его параметром.
make path/to/the/module/itself.ko
make path/to/the/module/directory/
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
Если вы редактировали только код в файле 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