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