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.symvers
lugar 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 prepare
não vai funcionar - mas qual é o comando que vai?
fonte
Module.symvers
pelozypper install kernel-source
e semelhante em outra distro linux. O arquivo está localizado emlib/modules/xxx/build
.Respostas:
O
Module.symvers
é (re) gerado quando você (re) compila módulos. Executemake modules
e você deverá obter umModule.symvers
arquivo na raiz da árvore do kernel.Observe que, se você executou apenas
make
e nãomake modules
, ainda não criou nenhum módulo. Os símbolos do próprio kernel (vmlinux
ou de um dos formatos de imagem dependentes da arquitetura) estãoSystem.map
.fonte
make modules
fato criaModule.symvers
. Agradecemos também por esclarecer a diferença entremake
emake modules
e o relacionamento comSystem.map
. Felicidades!insmod
.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.o arquivo vazio é tão bom quanto o gerado pelo gcc, que possui apenas os símbolos com o mesmo
0x00000000
valor de CRC, em um sistema sem modificações.fonte
No CentOS, e talvez em outras variantes do RedHat, basta extrair o arquivo correspondente para o seu kernel em execução:
No Ubuntu e talvez em outras variantes do Debian, o arquivo é automaticamente encontrado. No entanto, se você precisar, o arquivo está aqui:
fonte
linux-headers-$(uname -r)
pasta