
Я пытаюсь перекомпилировать 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
.
Это нормально или я что-то упускаю?
решение1
У меня была похожая проблема. Проблема в методе, как вы получаете исходный код ядра и как вы "собираете" ядро. Есть ссылка на то, как это сделать официально. Я следовал ей из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-package
Перейдите в папку с исходниками ядра и распакуйте
$ 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 build-dep linux-source $ mkdir debian/stamps
Затем я могу запустить 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
, и это могло бы помочь в создании модулей внутри дерева.