2012-03-23 24 views
32

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

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

No estoy recibiendo cuál es el significado de la misma y por eso que se utiliza. Traté de buscar sobre eso pero no entendí el significado de eso.

+1

http://stackoverflow.com/questions/6670589/use-of-export-symbol podría ser de utilidad – Bart

+0

Se puede encontrar excelente información sobre esto [escuchar] (http://tuxthink.blogspot.in/2011/ 07/exporting-symbols-from-module.html) –

+0

Ejemplo ejecutable mínimo: https://stackoverflow.com/a/44614246/895245 –

Respuesta

33

Se hace un símbolo accesible para módulos cargados dinámicamente (a condición de que dichos módulos añada una declaración extern).

No hace mucho tiempo, someone asked how to use it.

+1

¿Dónde está definido? ¿Como funciona? –

+0

@cirosantilli Se define en 'include/linux/export.h'. Busque 'ksymtab' y' kstrtab'. – cnicutar

+0

¿Alguien sabe bajo qué versión del kernel /include/linux/export.h se agregó? (O una forma fácil de verificar sin pasar por todos los árboles fuente del núcleo) No lo estoy viendo en 2.6.39.4. – sager89

3

No es una respuesta per se, sino una demostración, como prometí de mi comentario, que los símbolos exportados no son necesarios para no ser estáticos. 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 & 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.

+1

¿Funciona si las funciones no son estáticas? Porque traté de hacer las funciones no estáticas y mientras uno de los archivos estaba presente en un subdirectorio, hacer que el módulo lanzara una advertencia diciendo que las funciones exportadas no están definidas en el módulo presente en el subdirectorio. Y cuando hice las definiciones estáticas, funcionó. –

Cuestiones relacionadas