
Estou tentando recompilar o sound/usb
módulo no Ubuntu 18.10 no kernel em execução. Não recebo erros de compilação, mas quando tento carregar o módulo recebo este erro:
Invalid module format
Estou executando o 4.18.0-21-lowlatency
kernel.
Eu obtenho a fonte do kernel desta forma
apt source linux
Isso baixa e extrai a fonte do 4.18.0
kernel para a linux-4.18.0
pasta.
Copio os arquivos .config
e para a raiz do diretório de origem do meu kernel.Module.symvers
/lib/modules/4.18.0-21-lowlatency/build
Eu corro make EXTRAVERSION=-21-lowlatency modules_prepare
e entãomake EXTRAVERSION=-21-lowlatency M=sound/usb
A execução insmod
resulta no seguinte erro escrito emsyslog
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 '
Executar modinfo /lib/modules/
uname -r /kernel/sound/usb/snd-usb-audio.ko | grep vermagic
retorna isso
vermagic: 4.18.0-21-lowlatency SMP preempt mod_unload
A execução modinfo
no meu módulo recém-compilado retorna isto
vermagic: 4.18.20-21-lowlatency SMP preempt mod_unload
Rastreei o problema até as primeiras linhas doMakefile
VERSION = 4
PATCHLEVEL = 18
SUBLEVEL = 20
Se eu mudar SUBLEVEL
para 0
e compilar, posso carregar o módulo com sucesso.
Portanto, embora eu esteja executando o 4.18.0
kernel e apt source linux
pareça baixá-lo 4.18.0
, os arquivos baixados são versionados 4.18.20
.
Isso é normal ou estou faltando alguma coisa?
Responder1
Eu tive um problema semelhante. O problema está no método como você obtém a fonte do kernel e como você "construi" o kernel. Existe um link para qual é a forma oficial de fazer isso. Eu acompanhei desdehttps://help.ubuntu.com/community/Kernel/Compile. Pela aparência, parece desatualizado e de longa leitura.
Com base na situação, quero usar o kernel oficial do Ubuntu lançado (não de qualquer outro lugar) apt-get source xxxxx
. É uma pasta com a pasta Debian e uma bola tar. Então sigo instruções parciais deTentando construir o kernel em 18.04. Nenhuma opção editconfigs
Baixar fontes do kernel (
deb-src
deve ser descomentado em/etc/apt/sources.list
)$ apt-get install linux-source kernel-package
Vá para a pasta com fontes do kernel e descompacte
$ cd /usr/src/linux-source-x.x.x $ tar jxvf linux-source-x.x.x.tar.bz2
- Mover conteúdo para a pasta atual
$ mv linux-source-x.x.x/* . $ rm -rf linux-source-x.x.x/
- Obtenha os pacotes necessários
$ apt-get build-dep linux-source $ mkdir debian/stamps
Então eu posso correr fakeroot debian/rules clean
e fakeroot debian/rules binary-headers binary-generic binary-perarch
. No meio, tenho que copiar manualmente um arquivo de cabeçalho AMD GPU para o local ausente, caso contrário, a compilação falhará. Dessa forma, você fakeroot debian/rules
está usando a configuração do kernel em execução ( uname -r
).
Se eu usar o make menuconfigure
e .config, acabo tendo o mesmo problema que você. Portanto, você pode usar meu exemplo para usar o kernel oficial do Ubuntu e fakeroot debian/rules
compilar. A versão do módulo pode corresponder.
Minha versão é Ubuntu 18.04 e a minha uname -r
é 5.3.0-51. Eu uso o apt-get para obter a fonte por volta de 15/04/2020.
Acredito que existem outras maneiras de usar make
em vez de fakeroot debian/rules
, e isso pode ajudar a construir módulos em árvore.