Pregunta ¿Qué significa "EXPORT_SYMBOL" en el código del kernel de Linux?


de aquí

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

No entiendo cuál es su significado y por qué se usa. Traté de buscar sobre eso pero no entendí el significado de eso.


32
2018-03-23 09:08


origen


Respuestas:


Hace que un símbolo sea accesible para los módulos cargados dinámicamente (a condición de que dichos módulos agreguen un extern declaración).

No hace mucho tiempo, alguien le preguntó cómo usarlo.


35
2018-03-23 09:10



No es una respuesta per se, sino una demostración, como prometí de mi comentario, de que los símbolos exportados no son requiere ser no estático Los siguientes 2 módulos demuestran esto:

/* 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");

Y el segundo módulo

/* 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");

Estos fueron probados en CentOS 6 y CentOS 7: núcleos 2.6.32 y 3.10 (respectivamente). Cargar mod1.ko y luego mod2.ko dará como resultado que el valor pasado a mod1_exp_func () se imprima en los búferes de registro del kernel.


3
2017-08-18 15:11