Especificamente, qual o problema é que, quando você construiu seu módulo, a árvore de origem do kernel provavelmente estava sem o arquivo Modules.symvers. O sistema kbuild realmente alerta sobre isso quando você constrói seu módulo. Se Modules.symvers estiver ausente, você verá:
Aviso: está faltando a versão do símbolo dump /usr/src/linux-2.6.34-12/Modules.symvers; Os módulos não terão dependências e modificações.
Se o seu kernel CONFIG_MODVERSIONS
habilitou, durante a fase modpost de construção do driver, ele executará scripts / mod / modpost com a opção -m. Se você for corajoso e dê uma olhada no código- fonte scripts / mod / modpost.c , verá que a opção -m adiciona o símbolo _module_layout_ do vmlinux, no entanto, se você não tiver o Modules.symvers do kernel, você não receberá o valor CRC desse símbolo e receberá esta mensagem de erro.
Portanto, existem duas maneiras de contornar isso.
1) execute uma compilação completa do seu kernel em execução para gerar o Modules.symvers e depois reconstrua o seu módulo. [http://www.mjmwired.net/kernel/Documentation/kbuild/modules.txt[[1]
51 === 2. How to Build External Modules
52
53 To build external modules, you must have a prebuilt kernel available
54 that contains the configuration and header files used in the build.
55 Also, the kernel must have been built with modules enabled. If you are
56 using a distribution kernel, there will be a package for the kernel you
57 are running provided by your distribution.
58
59 An alternative is to use the "make" target "modules_prepare." This will
60 make sure the kernel contains the information required. The target
61 exists solely as a simple way to prepare a kernel source tree for
62 building external modules.
63
64 NOTE: "modules_prepare" will not build Module.symvers even if
65 CONFIG_MODVERSIONS is set; therefore, a full kernel build needs to be
66 executed to make module versioning work.
2) A outra opção é dizer ao modprobe estúpido que ignore toda essa porcaria e carregue seu módulo de qualquer maneira:
modprobe -f <module>
Eu tendem a favorecer a opção 2 :)
Tenha os pacotes
linux-headers
elinux-source
correspondentes ao seu kernel instalados. Por exemplo, para o kernel,3.2.0-27-generic-pae
você precisa:linux-headers-3.2.0-27-generic-pae
elinux-source-3.2.0-27-generic-pae
.Caso a versão dos pacotes acima não corresponda à sua versão do kernel em execução, você precisará substituí-lo
$(uname -r)
pela string de versão do pacote do kernel instalado acima.Para o exemplo acima, a versão do pacote é
3.2.0-27-generic-pae
. Quando você executauname -r
e sua saída é algo diferente,3.2.0-27-generic-pae
é necessário substituir cada um$(uname -r)
abaixo para corresponder à cadeia de versão dos pacotes instalados.cd /usr/src/linux-source-$Version
e descompacte o arquivo .tar.bz2 no lugar e o CD no diretório extraído - acho que você já fez issocp /boot/config-$(uname -r) .config
no diretório de origem do kernelcp /usr/src/linux-headers-$(uname -r)/Module.symvers .
no diretório de origem do kernelDepois de fazer isso, no diretório de origem do kernel, faça o seguinte:
make prepare
make scripts
make M=drivers/usb/serial
- mude o caminho depoisM=
para atender às suas necessidadesInfelizmente, não sei como construir um módulo específico, mantendo-o
Module.symvers
intocado. Fazermake drivers/usb/serial/option.ko
, por exemplo, mata oModule.symvers
arquivo e você acaba com o problema original. Usar oM=
parâmetro não o mata, mas você precisa criar todos os módulos no caminho especificado - e ainda não encontrei uma maneira de contornar isso.fonte
Você deve usar a configuração do kernel precisamente idêntica antes da execução
make prepare
. Além disso, se você estiver construindo fora da árvore, precisará construí-lo com os cabeçalhos do kernel precisamente idênticos que correspondem ao kernel atualmente em execução (ou o de destino se você não estiver executando no momento da compilação).fonte