Comment générer Module.symvers?

14

J'ai récemment parcouru le décompression du rpm hors du noyau (OpenSuse)? ; et comme il a fallu> 10 h sur ma machine, imaginez ma surprise qu'après avoir fait le processus décrit ici, je ne trouve nulle Module.symverspart!

Lorsque je recherche "générer Module.symvers", j'obtiens ceci:

REMARQUE: "modules_prepare" ne construira pas Module.symvers même si
CONFIG_MODVERSIONS est défini; par conséquent, une construction complète du noyau doit être
exécutée pour que le contrôle de version des modules fonctionne.
( Documentation du noyau Linux :: kbuild: modules.txt )

... mais je ne comprends pas vraiment - le noyau n'a-t-il pas été construit à l'étape précédente (décrit dans le lien donné ci-dessus? Je sais bien qu'il a fallu plus de 10 h à CC pour générer un tas de * .o et LD pour les lier, donc quelque chose doit avoir été construit. Mais si oui, où est-il alors Module.symvers?

En termes plus explicites, quelle commande dois-je appeler pour générer Module.symvers? Je sais que make preparecela ne fonctionnera pas - mais quelle est la commande qui fonctionnera?

sdaau
la source
Pour votre information, sur openSUSE, vous pouvez obtenir Module.symverspar zypper install kernel-source, et similaire sur d' autres distro linux. Le fichier se trouve dans lib/modules/xxx/build.
Syrtis Major

Réponses:

16

Il Module.symversest (re) généré lorsque vous (re) compilez des modules. Exécutez make moduleset vous devriez obtenir un Module.symversfichier à la racine de l'arborescence du noyau.

Notez que si vous avez seulement exécuté makeet non make modules, vous n'avez pas encore construit de modules. Les symboles du noyau lui-même ( vmlinuxou l'un des formats d'image dépendants de l'architecture) sont dans System.map.

Gilles 'SO- arrête d'être méchant'
la source
Merci beaucoup pour cela, @ Gilles - depuis, j'ai également trouvé la réponse: fichier Module.symvers ; et peut confirmer que make modulescela crée effectivement Module.symvers. Merci également d'avoir clarifié la différence entre makeet make moduleset la relation avec System.map. À votre santé!
sdaau
Que faire si "make" n'est pas disponible sur la machine?
bzupnick
3
@bzupnick Installez-le. C'est l'un des outils nécessaires pour construire des modules du noyau Linux. Beaucoup de logiciels nécessitent une construction.
Gilles 'SO- arrête d'être méchant'
J'essaie de compiler de manière croisée un LKM à partir d'une autre machine. L'installation des choses sur la première boîte n'est pas possible.
bzupnick
@bzupnick Vous devez quand même avoir make pour construire le module. Tout se passe sur la machine de construction, il n'y a rien à faire sur la machine cible à l'exception de insmod.
Gilles 'SO- arrête d'être méchant'
3

pour les personnes qui ont trouvé cette question en recherchant sur Google l'avertissement que vous obtenez lors de la compilation d'un exemple de LKM de Derek Molloy: vous pouvez simplement en créer un vide avec touch Modules.symvers. si votre noyau n'utilise pas de modversions (CRC utilisés par le système d'exploitation pour garantir que les modules correspondent au noyau) et que votre module n'a pas de dépendances avec les autres modules, ce sera suffisant pour supprimer l'avertissement.

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

le fichier vide est tout aussi bon que celui généré par gcc, qui a juste les symboles tous avec la même 0x00000000valeur CRC, sur un système sans modifications.

jcomeau_ictx
la source
1

Sur CentOS, et peut-être d'autres variantes de RedHat, extrayez simplement le fichier correspondant pour votre noyau en cours d'exécution:

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

Sur Ubuntu et peut-être d'autres variantes de Debian, les fichiers se retrouvent automatiquement. Cependant, si vous en avez besoin, le fichier est ici:

/usr/src/linux-headers-$(uname -r)/Module.symvers
Id2ndR
la source
Je ne trouve pas de linux-headers-$(uname -r)dossier
King Stone