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.
http://stackoverflow.com/questions/6670589/use-of-export-symbol podría ser de utilidad – Bart
Se puede encontrar excelente información sobre esto [escuchar] (http://tuxthink.blogspot.in/2011/ 07/exporting-symbols-from-module.html) –
Ejemplo ejecutable mínimo: https://stackoverflow.com/a/44614246/895245 –