Quelle est la signification de “EXPORT_SYMBOL” dans le code du kernel Linux?

d’ ici

48 struct snd_card *snd_cards[SNDRV_CARDS]; 49 EXPORT_SYMBOL(snd_cards); 

Je ne comprends pas ce que cela signifie et pourquoi. J’ai essayé de chercher à ce sujet mais sans comprendre la signification de cela.

Il rend un symbole accessible aux modules chargés dynamicment (à condition que lesdits 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 doivent pas nécessairement être statiques. Les 2 modules ci-dessous démontrent ceci:

 /* mod1.c */ #include  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  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: respectivement les kernelx 2.6.32 et 3.10. Si vous chargez mod1.ko, puis mod2.ko, la valeur transmise à mod1_exp_func () sera imprimée dans les tampons du journal du kernel.