Eu tenho esses dispositivos Linux embutidos. Eu gostaria de adicionar funcionalidade no nível do kernel a ele, mas preferiria não compilar meu próprio kernel para fazer isso. (Se o kernel não carregar e chegar ao espaço do usuário, o dispositivo está emparedado; não consigo acessar o carregador de inicialização para recuperá-lo. O kernel atual não tem suporte a kexec, então não pude usá-lo para testar uma imagem do kernel de minha autoria.)
O kernel do dispositivo tem suporte para módulos, mas não tenho uma cópia do arquivo Module.symvers correspondente.
Minha pergunta: se eu não tenho o arquivo Module.symvers para um kernel Linux, mas tenho a imagem do kernel e um módulo compilado para ele, posso compilar mais módulos que podem ser inseridos nesse kernel, talvez gerando o módulo ausente. arquivo symvers?
O dispositivo está executando o kernel Linux versão 3.10.
Imagem do kernel (em seu contêiner uImage): https://www.olio.watch/olio-firmware-1.10.220/olio-firmware/uImage
Configuration (extraído da imagem acima graças a CONFIG_IKCONFIG): https://www.olio .watch/3.10.0-g2ae2f33-config
O único módulo do kernel que tenho que corresponde a esse kernel: https://www.olio.watch/olio-firmware-1.10.220/olio-firmware/drv2605.ko
Primeiro, para responder à sua pergunta "posso compilar o módulo do kernel do Linux sem o Module.symvers", precisamos entender qual é o objetivo de
Module.symvers
:Module.symvers
serve a dois propósitos principais:1) Lista todos os símbolos exportados do vmlinux e todos os módulos.
2) Lista o CRC se
CONFIG_MODVERSIONS
estiver habilitado. SemCONFIG_MODVERSIONS
habilitado, o CRC leria 0x00000000.Module.symvers
será gerado durante a compilação do kernel, ele contém todos os símbolos exportados do kernel e módulos compilados. Para cada símbolo, o valor CRC correspondente também é armazenado. A sintaxe do arquivo Module.symvers é:Por exemplo:
Dito isto, se tivermos
Module.symvers
, podemos construir qualquer módulo porque contém todos os símbolos necessários.Se
Module.symvers
não estiver disponível, ainda podemos construir um módulo externo construindo este arquivo ou pegando-o emprestado de outro módulo.Normalmente, ao construir um módulo externo, o sistema de compilação precisa acessar os símbolos do kernel para verificar se todos os símbolos externos estão definidos. Isso é feito em uma etapa de construção chamada
MODPOST
. Esta etapa obtém os símbolos lendoModule.symvers
a árvore de origem do kernel.Se um
Module.symvers
arquivo estiver presente no diretório onde o módulo externo está sendo construído, este arquivo também será lido. Durante aMODPOST
etapa, um novoModule.symvers
arquivo será escrito contendo todos os símbolos exportados que não foram definidos no kernel.se
Module.symvers
o arquivo não estiver presente, um módulo externo pode estar usando símbolos exportados de outro módulo externo,kbuild
precisa ter conhecimento total de todos os símbolos para evitar emitir avisos sobre símbolos indefinidos.Para esta situação, existem três soluções:
1) Use um arquivo de nível superior
kbuild
: Se você tiver dois módulos,foo.ko
ebar.ko
, ondefoo.ko
precisa de símbolos debar.ko
, você pode usar umkbuild
arquivo de nível superior comum para que ambos os módulos sejam compilados na mesma compilação. Considere o seguinte layout de diretório:2) Use um arquivo extra
Module.symvers
: Quando um módulo externo é construído, umModule.symvers
arquivo é gerado contendo todos os símbolos exportados que não estão definidos no kernel. Para obter acesso aos símbolos debar.ko
, copie o arquivo Module.symvers da compilação de bar.ko para o diretório onde o foo.ko foi construído. Durante a construção do módulo,kbuild
irá ler oModule.symvers
arquivo no diretório do módulo externo, e quando a construção for finalizada, um novoModule.symvers
arquivo é criado contendo a soma de todos os símbolos definidos e não parte do kernel.3) Use a variável "make"
KBUILD_EXTRA_SYMBOLS
: Se for impraticável copiarModule.symvers
de outro módulo, você pode atribuir uma lista de arquivos separada por espaçosKBUILD_EXTRA_SYMBOLS
em seu arquivo de compilação. Esses arquivos serão carregadosmodpost
durante a inicialização de suas tabelas de símbolos.Mais detalhes 1