symbole inconnu __class_create (err 0)

C’est probablement une question stupide, mais j’ai cherché pendant des heures en ligne et je n’ai pas trouvé de réponse …

J’écris un module de kernel qui crée également un périphérique de caractère. Il comstack sans erreurs ni avertissements, mais lorsque j’essaie sudo insmod my_mod.ko je reçois:

insmod: error inserting 'my_mod.ko': -1 Unknown symbol in module

et quand j’essaie de regarder dmesg je vois:

 my_mod: Unknown symbol __class_create (err 0) my_mod: Unknown symbol device_create_file (err 0) my_mod: Unknown symbol device_create (err 0) 

Je suppose que j’ai raté un include mais je ne trouve pas lequel …

Quels sont les inclus nécessaires?

Mes inclus sont actuellement:

 #include  #include  #include  #include  #include  #include  #include  

La fonction __class_create est exscope uniquement pour les modules GPL (exscope avec EXPORT_SYMBOL_GPL ). Vous devez donc utiliser une licence GPL avec la macro MODULE_LICENSE pour pouvoir utiliser cette fonction. Il en va de même pour les autres fonctions.

Cela devrait faire l’affaire:

 MODULE_LICENSE("GPL"); 

Pour en savoir plus sur l’exportation, jetez un coup d’œil ici . Fondamentalement, les modules dynamics n’ont pas access aux variables et aux fonctions du kernel, et le kernel doit spécifier les éléments à exporter pour permettre l’access. C’est le but des macros EXPORT_SYMBOL et EXPORT_SYMBOL_GPL , qui sont utilisées partout.

Et la différence entre EXPORT_SYMBOL et EXPORT_SYMBOL_GPL est que ce dernier ne révèle la fonction ou la variable que si le module est sous licence GPL.