O kernel Linux contém estruturas de dados cujo layout varia não apenas de versão para versão, mas também dependendo das opções de compilação. Como conseqüência, quando você compila um módulo do kernel, você precisa ter não apenas os arquivos de cabeçalho da fonte do kernel, mas também alguns arquivos de cabeçalho que são gerados durante a compilação do kernel. Apenas descompactar a fonte do kernel não é suficiente.
Com os kernels construídos com CONFIG_MODVERSIONS
, o número da versão pode diferir, mas o layout das estruturas de dados deve ser o mesmo. Esta opção está ativada nos kernels do Ubuntu. Com essa opção, além dos cabeçalhos, os módulos precisam ser compilados com o arquivo Module.symvers
adequado. O Ubuntu, como a maioria das distribuições, inclui este arquivo no mesmo pacote que os cabeçalhos do kernel resultantes da compilação. O pacote de cabeçalho do kernel do Ubuntu é chamado linux-headers-VERSION-VARIANT
, por ex. linux-headers-3.8.0-38-generic
.
Com os kernels construídos sem o CONFIG_MODVERSIONS
(o que pode ser o caso se você compilou seu próprio kernel), a verificação ao carregar um módulo é uma simples verificação de versão. Você pode pegar o código-fonte do kernel descompactado, copiar o .config
que foi usado durante a compilação do seu kernel em execução e executar make modules_prepare
. O ônus está em você para verificar se qualquer patch que você tenha feito no kernel não afeta a compatibilidade binária.