"aucune version de symbole pour module_layout" lors du chargement de usbhid.ko

25

J'essaie de construire mon propre module pour usbhid.ko , mais après avoir compilé, je ne peux pas charger le module. dmesg dit no symbol version for module_layout . Je me demande quel est le problème? J'ai déjà utilisé les sources du noyau fournies par Ubuntu et je m'assure également que la version du noyau est la même.

    
posée SpecC 24.11.2010 - 00:08
la source

3 réponses

18

En particulier, le problème est que lorsque vous avez construit votre module, le fichier Modules.symvers manquait probablement dans l’arborescence des sources du noyau. Le système kbuild vous avertit de cela lorsque vous construisez votre module. Si Modules.symvers est manquant, vous verrez:

  

Avertissement: Version du symbole dump /usr/src/linux-2.6.34-12/Modules.symvers            est manquant; les modules n'auront pas de dépendances et de modifications.

Si CONFIG_MODVERSIONS est activé sur votre noyau, alors pendant la phase de construction de votre pilote, il exécutera scripts / mod / modpost avec l'option -m. Si vous êtes courageux et que vous regardez 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 manières 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 recréez votre module. [http://www.mjmwired.net/kernel/Documentation/kbuild/modules.txt] [1]

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 de simplement ignorer tout ce qui ne va pas et de charger votre module quand même:

modprobe -f <module>

J'ai tendance à privilégier l'option 2:)

    
réponse donnée Dan Gora 07.02.2012 - 01:08
la source
15

Installez les deux packages linux-headers et linux-source correspondant à votre noyau. Par exemple, pour le noyau 3.2.0-27-generic-pae , vous avez besoin de:

  1. linux-headers-3.2.0-27-generic-pae et
  2. linux-source-3.2.0-27-generic-pae .

Si la version des packages ci-dessus ne correspond pas à la version de votre noyau, vous devez remplacer $(uname -r) par la chaîne de version du 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écutez uname -r et que sa sortie est différente de 3.2.0-27-generic-pae , vous devez remplacer chaque $(uname -r) ci-dessous par la chaîne de version des packages installés.

  1. 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à fait
  2. cp /boot/config-$(uname -r) .config dans le répertoire source du noyau
  3. cp /usr/src/linux-headers-$(uname -r)/Module.symvers . dans le répertoire source du noyau

Après avoir fait cela, dans le répertoire source du noyau, procédez comme suit:

  1. make prepare
  2. make scripts
  3. make M=drivers/usb/serial - changez le chemin après M= pour répondre à vos besoins

Malheureusement, je ne sais pas comment construire un module spécifique tout en maintenant Module.symvers intact. Faire make drivers/usb/serial/option.ko , par exemple, tue le fichier Module.symvers et vous vous retrouvez avec votre problème d'origine. Utiliser le paramètre M= ne le tue pas, mais vous devez construire tous les modules dans le chemin spécifié - et je n'ai pas encore trouvé le moyen de le contourner.

    
réponse donnée Radu C 03.08.2012 - 19:07
la source
1

Vous devez utiliser la configuration de noyau exactement identique avant d’exécuter make prepare . De plus, si vous le construisez hors-arbre, vous devez le construire avec les en-têtes de noyau exactement identiques à votre noyau en cours d'exécution (ou le noyau cible si vous ne l'exécutez pas au moment de la compilation). / p>     

réponse donnée Daniel T Chen 24.11.2010 - 05:04
la source

Lire d'autres questions sur les étiquettes