Compila o módulo do kernel Linux sem Module.symvers

6

Eu tenho esses dispositivos Linux embarcados. Eu gostaria de adicionar funcionalidade de nível de 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 é emparelhado; não consigo acessar o gerenciador 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 do meu próprio.)

O kernel do dispositivo tem suporte para módulos, mas eu 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 ela, posso compilar mais módulos que podem ser inseridos nesse kernel, talvez gerando o está faltando o arquivo Module.symvers?

O dispositivo está executando a versão 3.10 do kernel do Linux. Imagem do kernel (em seu contêiner uImage): link
Configuração (extraída da imagem acima graças ao CONFIG_IKCONFIG): link
O módulo do kernel que eu tenho que combina com o kernel: link

Se algum desses links não funcionar, verifique se o seu navegador está usando http em texto simples, em vez de padronizar para https; acabou de comprar esse domínio para colocar arquivos referentes a este dispositivo e ainda não configurou o TLS.

    
por Billy 07.10.2018 / 09:51

1 resposta

4

Primeiro, para responder à sua pergunta "posso compilar o módulo do kernel Linux sem Module.symvers", precisamos entender qual é o propósito de Module.symvers :

Module.symvers serve a dois propósitos principais:

1) Ele lista todos os símbolos exportados do vmlinux e de todos os módulos.

2) Ele lista o CRC se CONFIG_MODVERSIONS estiver habilitado. Sem CONFIG_MODVERSIONS ativado, o CRC leria 0x00000000.

Module.symvers será gerado durante uma compilação do kernel, ele contém todos os símbolos exportados do kernel e módulos compilados. Para cada símbolo, o valor de CRC correspondente também é armazenado. A sintaxe do arquivo Module.symvers é:

    <CRC>       <Symbol>           <module>

Por exemplo:

    0x2d036834  scsi_remove_host   drivers/scsi/scsi_mod

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 poderemos construir um módulo externo construindo este arquivo ou tomando 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 criação chamada MODPOST . Esta etapa obtém os símbolos lendo Module.symvers da árvore de origem do kernel.

Se um arquivo Module.symvers estiver presente no diretório onde o módulo externo está sendo construído, esse arquivo também será lido. Durante a etapa MODPOST , um novo arquivo Module.symvers será gravado contendo todos os símbolos exportados que não foram definidos no kernel.

se o arquivo Module.symvers não estiver presente, um módulo externo pode estar usando símbolos exportados de outro módulo externo, kbuild precisa ter total conhecimento de todos os símbolos para evitar avisos sobre símbolos indefinidos.

Para esta situação, existem três soluções:

1) Use um arquivo kbuild de nível superior: se você tiver dois módulos, foo.ko e bar.ko , em que foo.ko precisa de símbolos de bar.ko , você pode usar um nível superior comum co_de % file para que ambos os módulos sejam compilados na mesma construção. Considere o seguinte layout de diretório:

    ./foo/ <= contains foo.ko
    ./bar/ <= contains bar.ko

    The top-level kbuild file would then look like:

    #./Kbuild (or ./Makefile):
        obj-y := foo/ bar/

    And executing

        $ make -C $KDIR M=$PWD

    will then do the expected and compile both modules with
    full knowledge of symbols from either module.

2) Use um arquivo kbuild extra: Quando um módulo externo é construído, um arquivo Module.symvers é gerado contendo todos os símbolos exportados que não estão definidos no kernel. Para obter acesso aos símbolos de Module.symvers , copie o arquivo Module.symvers da compilação de bar.ko para o diretório onde o foo.ko é construído. Durante a compilação do módulo, bar.ko lerá o arquivo kbuild no diretório do módulo externo, e quando a compilação estiver concluída, um novo arquivo Module.symvers será criado contendo a soma de todos os símbolos definidos e não parte do arquivo. kernel.

3) Use a variável "make" Module.symvers : Se for impraticável copiar KBUILD_EXTRA_SYMBOLS de outro módulo, você pode atribuir uma lista separada por espaço de arquivos a Module.symvers em seu arquivo de construção. Esses arquivos serão carregados por KBUILD_EXTRA_SYMBOLS durante a inicialização de suas tabelas de símbolos.

Mais detalhes 1

    
por 16.10.2018 / 03:08