Plus précisément, le problème est que lorsque vous avez créé votre module, l'arborescence des sources du noyau manquait probablement le fichier Modules.symvers. Le système kbuild vous en avertit lorsque vous créez votre module. Si Modules.symvers est manquant, vous verrez:
Avertissement: le vidage de la version du symbole /usr/src/linux-2.6.34-12/Modules.symvers est manquant; les modules n'auront ni dépendances ni modifications.
Si votre noyau est CONFIG_MODVERSIONS
activé, alors pendant la phase modpost de construction de votre pilote, il exécutera scripts / mod / modpost avec l'option -m. Si vous êtes courageux et jetez un oeil à la source scripts / mod / modpost.c , vous verrez que l'option -m ajoute le symbole _module_layout_ de vmlinux, cependant si vous n'avez pas Modules.symvers de votre noyau, vous n'obtiendrez pas la valeur CRC pour ce symbole et vous vous retrouverez avec ce message d'erreur.
Il y a donc deux façons de contourner cela.
1) exécutez une version complète de votre noyau en cours d'exécution pour générer Modules.symvers, puis reconstruisez votre module. [http://www.mjmwired.net/kernel/Documentation/kbuild/modules.txt 3/10]
51 === 2. How to Build External Modules
52
53 To build external modules, you must have a prebuilt kernel available
54 that contains the configuration and header files used in the build.
55 Also, the kernel must have been built with modules enabled. If you are
56 using a distribution kernel, there will be a package for the kernel you
57 are running provided by your distribution.
58
59 An alternative is to use the "make" target "modules_prepare." This will
60 make sure the kernel contains the information required. The target
61 exists solely as a simple way to prepare a kernel source tree for
62 building external modules.
63
64 NOTE: "modules_prepare" will not build Module.symvers even if
65 CONFIG_MODVERSIONS is set; therefore, a full kernel build needs to be
66 executed to make module versioning work.
2) L'autre option est de dire à stupide modprobe d'ignorer toutes ces conneries et de charger votre module de toute façon:
modprobe -f <module>
J'ai tendance à privilégier l'option 2 :)
Faites installer à la fois les packages
linux-headers
etlinux-source
correspondant à votre noyau. Par exemple, pour le noyau,3.2.0-27-generic-pae
vous avez besoin de:linux-headers-3.2.0-27-generic-pae
etlinux-source-3.2.0-27-generic-pae
.Dans le cas où la version des packages ci-dessus ne correspond pas à votre version de noyau en cours d'exécution, vous devez remplacer
$(uname -r)
par la chaîne de version de votre package de noyau installé ci-dessus.Pour l'exemple ci-dessus, la version du package est
3.2.0-27-generic-pae
. Lorsque vous exécutezuname -r
et que sa sortie est différente,3.2.0-27-generic-pae
vous devez remplacer chacun$(uname -r)
ci-dessous pour faire correspondre la chaîne de version des packages installés.cd /usr/src/linux-source-$Version
et décompressez l'archive .tar.bz2 en place et cd dans le répertoire extrait - je suppose que vous l'avez déjà faitcp /boot/config-$(uname -r) .config
dans le répertoire source du noyaucp /usr/src/linux-headers-$(uname -r)/Module.symvers .
dans le répertoire source du noyauAprès cela, dans le répertoire source du noyau, procédez comme suit:
make prepare
make scripts
make M=drivers/usb/serial
- changez le chemin aprèsM=
pour l'adapter à vos besoinsMalheureusement, je ne sais pas comment construire un module spécifique tout en restant
Module.symvers
intact. Fairemake drivers/usb/serial/option.ko
, par exemple, tue leModule.symvers
fichier et vous vous retrouvez avec votre problème d'origine. L'utilisation duM=
paramètre ne le tue pas, mais vous devez créer tous les modules dans le chemin spécifié - et je n'ai pas encore trouvé de solution.la source
Vous devez utiliser la configuration du noyau exactement identique avant de lancer
make prepare
. De plus, si vous le construisez à partir de l'arborescence, vous devez le construire par rapport aux en-têtes de noyau exactement identiques correspondant à votre noyau en cours d'exécution (ou à celui cible si vous ne l'exécutez pas au moment de la compilation).la source