Я пытаюсь перекомпилировать модуль sound/usb
в Ubuntu 18.10 для работающего ядра. Я не получаю ошибок компиляции, но когда я пытаюсь загрузить модуль, я получаю эту ошибку:
Invalid module format
Я использую ядро 4.18.0-21-lowlatency
.
Таким образом, я получаю исходный код ядра
apt source linux
Это загружает и извлекает исходный код ядра 4.18.0
в папку linux-4.18.0
.
Я копирую файлы .config
и Module.symvers
из /lib/modules/4.18.0-21-lowlatency/build
в корень моего исходного каталога ядра.
Я запускаю make EXTRAVERSION=-21-lowlatency modules_prepare
, а затем make EXTRAVERSION=-21-lowlatency M=sound/usb
Запуск insmod
приводит к следующей ошибке, записанной в syslog
snd_usb_audio: version magic '4.18.20-21-lowlatency SMP preempt mod_unload ' should be '4.18.0-21-lowlatency SMP preempt mod_unload '
Запуск modinfo /lib/modules/
uname -r /kernel/sound/usb/snd-usb-audio.ko | grep vermagic
возвращает это
vermagic: 4.18.0-21-lowlatency SMP preempt mod_unload
Запуск modinfo
в моем недавно скомпилированном модуле возвращает это
vermagic: 4.18.20-21-lowlatency SMP preempt mod_unload
Я проследил проблему до первых нескольких строк Makefile
VERSION = 4
PATCHLEVEL = 18
SUBLEVEL = 20
Если я изменю SUBLEVEL
на 0
, а затем скомпилирую, я могу успешно загрузить модуль.
Так что, хотя я использую ядро 4.18.0
, а apt source linux
, похоже, загружает ядро 4.18.0
, загруженные файлы имеют версию 4.18.20
.
Это нормально или я что-то упускаю?
У меня была похожая проблема. Проблема заключается в том, как вы получаете исходный код ядра и как вы «собираете» ядро. Есть ссылка на то, что официальный способ сделать это. Я следовал за ним с https://help.ubuntu.com/community/Kernel/Compile. Судя по всему, он устарел и долго читается.
Исходя из ситуации, я хочу использовать официально выпущенное ядро Ubuntu (а не откуда-либо еще) apt-get source xxxxx
. Это папка с папкой Debian и tar-шаром. Затем я следую частичным инструкциям из Попытка собрать ядро 18.04. Нет опции editconfigs
Загрузить исходники ядра (deb-src
следует раскомментировать в /etc/apt/sources.list
)
$ apt-get install linux-source kernel -упаковка
Перейти в папку с исходниками ядра и разархивировать
$ cd /usr/src/linux-source-x.x.x
$ tar jxvf linux-source-x.x.x.tar.bz2
$ mv linux-source-x.x.x/* .
$ rm -rf linux-source-x.x.x/
$ apt-get сборка-депозитный исходный код linux
$ mkdir дебиан/штампы
Затем я могу запустить fakeroot debian/rules clean
и fakeroot debian/rules binary-headers binary-generic binary-perarch
. В середине мне приходится вручную копировать один заголовочный файл amd gpu в отсутствующее место, иначе компиляция не удалась. Таким образом, fakeroot debian/rules
использует вашу текущую конфигурацию ядра (uname -r
).
Если я использую make menuconfigure
и .config, у меня та же проблема, что и у вас. Таким образом, вы можете использовать мой пример для использования официального выпущенного ядра Ubuntu и fakeroot debian/rules
для компиляции. Версия модуля может совпадать.
Моя версия — Ubuntu 18.04, а uname -r
— 5.3.0-51. Я использую apt-get для получения исходного кода около 2020-4-15.
Я полагаю, что есть другие способы использовать make
вместо fakeroot debian/rules
, и это может помочь в построении модулей в дереве.