Como gerar Module.symvers?

14

Recentemente, passei por Descompactar o kernel-source rpm fora do sistema (OpenSuse)? ; e como demorou mais de 10 horas na minha máquina, imagine minha surpresa que, depois de executar o processo descrito lá, não encontre Module.symverslugar nenhum !

Quando procuro "gerar Module.symvers", recebo o seguinte:

NOTA: "modules_prepare" não criará Module.symvers, mesmo que
CONFIG_MODVERSIONS esteja definido; portanto, uma compilação completa do kernel precisa ser
executada para fazer a versão do módulo funcionar.
( Documentação do kernel do Linux :: kbuild: modules.txt )

... mas eu realmente não entendi - o kernel não foi construído na etapa anterior (descrita no link acima? Eu sei que demorou> 10 h para o CC gerar um monte de * .o arquivos e LD para vinculá-los, então algo deve ter sido construído, mas, se sim, onde está Module.symvers?

Em termos mais explícitos, exatamente qual comando devo chamar para gerar Module.symvers? Eu sei que make preparenão vai funcionar - mas qual é o comando que vai?

sdaau
fonte
FYI, no openSUSE, você pode obter Module.symverspelo zypper install kernel-sourcee semelhante em outra distro linux. O arquivo está localizado em lib/modules/xxx/build.
Syrtis Major

Respostas:

16

O Module.symversé (re) gerado quando você (re) compila módulos. Execute make modulese você deverá obter um Module.symversarquivo na raiz da árvore do kernel.

Observe que, se você executou apenas makee não make modules, ainda não criou nenhum módulo. Os símbolos do próprio kernel ( vmlinuxou de um dos formatos de imagem dependentes da arquitetura) estão System.map.

Gilles 'SO- parar de ser mau'
fonte
Muito obrigado por isso, @Gilles - desde então eu também encontrei o arquivo Answer: Module.symvers ; e pode confirmar que de make modulesfato cria Module.symvers. Agradecemos também por esclarecer a diferença entre makee make modulese o relacionamento com System.map. Felicidades!
Sdaau
E se "make" não estiver disponível na máquina?
bzupnick
3
@bzupnick Instale-o. É uma das ferramentas necessárias para construir os módulos do kernel do Linux. Um monte de software requer make para construir.
Gilles 'SO- stop be evil'
Estou tentando compilar um LKM de outra máquina. Instalar coisas na primeira caixa não é possível.
bzupnick
@bzupnick Você precisa ter o make para construir o módulo de qualquer maneira. Tudo está acontecendo na máquina de construção, não há nada a fazer na máquina de destino, exceto insmod.
Gilles 'SO- stop be evil'
3

para as pessoas que encontraram essa pergunta pesquisando o aviso ao compilar um dos LKMs de amostra de Derek Molloy: basta criar um vazio touch Modules.symvers. se seu kernel não usa modversões (CRCs usados ​​pelo sistema operacional para ajudar a garantir que os módulos correspondam ao kernel) e seu módulo não possui nenhuma dependência de outros módulos, isso será suficiente para suprimir o aviso.

WARNING: Symbol version dump ./Module.symvers
         is missing; modules will have no dependencies and modversions.

o arquivo vazio é tão bom quanto o gerado pelo gcc, que possui apenas os símbolos com o mesmo 0x00000000valor de CRC, em um sistema sem modificações.

jcomeau_ictx
fonte
1

No CentOS, e talvez em outras variantes do RedHat, basta extrair o arquivo correspondente para o seu kernel em execução:

zcat /boot/symvers-$(uname -r).gz > ./Module.symvers

No Ubuntu e talvez em outras variantes do Debian, o arquivo é automaticamente encontrado. No entanto, se você precisar, o arquivo está aqui:

/usr/src/linux-headers-$(uname -r)/Module.symvers
Id2ndR
fonte
Não consigo encontrar a linux-headers-$(uname -r)pasta
King Stone