de ici
48 struct snd_card *snd_cards[SNDRV_CARDS];
49 EXPORT_SYMBOL(snd_cards);
Je ne sais pas quel est son sens et pourquoi il est utilisé. J'ai essayé de chercher à ce sujet mais sans comprendre le sens de cela.
Il rend un symbole accessible aux modules chargés dynamiquement (à condition que ces modules ajoutent une déclaration extern
).
Il n'y a pas longtemps, quelqu'un a demandé comment l'utiliser .
Pas une réponse en soi mais une démonstration, comme promis de mon commentaire, que les symboles exportés ne le sont pas devaient être non statiques. Les 2 modules ci-dessous en témoignent:
/* mod1.c */
#include <linux/module.h>
static int mod1_exp_func(int i)
{
pr_info("%s:%d the value passed in is %d\n",
__func__, __LINE__, i);
return i;
}
EXPORT_SYMBOL(mod1_exp_func); /* export static symbol */
static int __init mod1_init(void)
{
pr_info("Initializing simple mod\n");
return 0;
}
static void __exit mod1_exit(void)
{
pr_info("This module is exiting\n");
}
module_init(mod1_init);
module_exit(mod1_exit);
MODULE_LICENSE("GPL v2");
Et le deuxième module
/* mod2.c */
#include <linux/module.h>
extern int mod1_exp_func(int);
static int __init mod2_init(void)
{
pr_info("Initializing mod2\n");
pr_info("Calling exported function in mod1\n");
mod1_exp_func(3);
return 0;
}
static void __exit mod2_exit(void)
{
pr_info("mod2 exiting\n");
}
module_init(mod2_init);
module_exit(mod2_exit);
MODULE_LICENSE("GPL v2");
Ceux-ci ont été testés sur CentOS 6 et CentOS 7: noyaux 2.6.32 et 3.10 (respectivement). Le chargement de mod1.ko puis de mod2.ko entraînera l'impression de la valeur transmise à mod1_exp_func () dans les tampons de journal du noyau.