web-dev-qa-db-fra.com

Quelle est la signification de "EXPORT_SYMBOL" dans le code du noyau Linux?

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.

36
Jeegar Patel

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 .

40
cnicutar

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.

5
Andrew Falanga