Como o Module.symvers é gerado?

0

Eu tenho um problema ao tentar criar o kernel e módulos para um sistema embarcado. O Module.symvers resultante tem algumas (algumas dúzias) entradas com entradas de CRC inválidas (0x00000000).

Eu estou tentando descobrir o processo pelo qual Module.symvers é gerado para que eu possa começar a depurar as entradas problemáticas. No entanto, depois de examinar o processo de compilação por algumas horas, ainda não consigo descobrir o que gera Module.symvers.

N.B. - Eu estou procurando o código que realmente cria o conteúdo de Module.symvers, não de instruções para "fazer módulos"; -)

Eu suspeito que a quebra se deva à construção do Linux 3.4.12 com o GCC 6.3, mas preciso fazê-lo funcionar com essa configuração. Desativar modvers não é uma opção, porque preciso carregar módulos de blob binários de terceiros.

    
por peteru 26.07.2017 / 08:12

2 respostas

0

A criação de Module.symvers tem várias etapas. Essas etapas usam MODVERDIR (geralmente .tmp_versions no diretório de compilação) que contém .mod files,

Depois que os módulos são compilados e os arquivos .o correspondentes são gerados, a origem é enviada pelo pré-processador C com -D__GENKSYMS__ e a saída resultante é canalizada para scripts/genksyms . genksyms implementa seu próprio analisador de código (relativamente simples) para gerar assinaturas de símbolos e seus CRCs correspondentes. Foram as limitações deste analisador que impediram que genksyms analisasse corretamente a fonte ao usar o gcc 6.3 no kernel 3.4. (Eu resolvi meu problema retrocedendo o kernel 4.12 genksyms ). genksyms produzirá um arquivo .mod.c para cada módulo que contenha todos os CRCs de símbolo. Isso é então compilado para produzir .mod.o arquivos.

A etapa final envolve a análise de todos os arquivos *.mod em MODVERDIR , examinando-os para todos os arquivos .ko que compõem os módulos e passando a lista correspondente de .mod.o arquivos, juntamente com vmlinux para %código%. scripts/modpost analisa os arquivos de objeto e gera scripts/modposts .

    
por 27.07.2017 / 15:14
1

O arquivo Module.symvers é gerado por scripts/modpost . Veja os comentários no início de Makefile.modpost , aqueles no meio de Makefile.build e o próprio programa modpost.c que é executado com opções -m -i .

Usar make modules KBUILD_VERBOSE=1 deve permitir que você veja o comando sendo usado.

    
por 26.07.2017 / 18:25