Comment éviter “erreur: ‘symbole’ non déclaré ici” malgré EXPORT_SYMBOL dans un module de kernel Linux?

J’incorpore un pilote dans un kernel Linux lorsque j’obtiens cette erreur (j’ajoute le périphérique dans le fichier forum et je l’enregistre):

error: 'kxtf9_get_slave_descr' undeclared here (not in a function) 

J’ai localisé la fonction ci-dessus dans un fichier de pilote

 struct ext_slave_descr *kxtf9_get_slave_descr(void) { return &kxtf9_descr; } EXPORT_SYMBOL(kxtf9_get_slave_descr); 

Ne devrait-il pas être rendu “visible” par EXPORT_SYMBOL? Le fichier C contenant le code ci-dessus n’a pas de fichier d’en-tête (je ne l’ai pas écrit, je viens de le trouver ici et je l’implémente. Ils disent qu’il est testé, donc je suppose qu’un en-tête n’est pas nécessaire?

Le rest du code est parfaitement compilé (il “voit” donc le code dans le dossier) et le fichier contenant le code ci-dessus est également compilé!

EXPORT_SYMBOL exporte le symbole pour la liaison dynamic. Ce que vous avez n’est pas une erreur de liaison, mais une erreur de compilation due à une déclaration de fonction manquante. Vous devez écrire un fichier d’en-tête pour le fichier C et l’inclure, ou déclarer la fonction comme le fichier C que vous comstackz.

Option 1:

kxtf9.h:

 #ifndef KXTF9_H #define KXTF9_H struct ext_slave_descr *kxtf9_get_slave_descr(void); #endif 

votre_fichier.c:

 #include "kxtf9.h" /* your code where you use the function ... */ 

Option 2:

votre_fichier.c:

 struct ext_slave_descr *kxtf9_get_slave_descr(void); /* your code where you use the function ... */ 

Notez également que EXPORT_SYMBOL dans le fichier kxtf9.c est #ifdef __KERNEL__ . Vous devez donc avoir configuré votre environnement de construction (Makefile) correctement. Sinon, vous obtiendrez une erreur de lien.