Bonjour,
J'ai enfin trouve le temps de revenir sur ce probleme.
Vos informations deja tres completes m'ont permis de traiter le probleme comme
vous l'avez detaille.
Je joins juste ces quelques lignes pour finir de decrire la chose.
Dans le noyau : (ksyms.c)
=========================
(la fonction creuse)
int dummy_buzzer(int arg) {
printk("dummy_buzzer() called but buzzer module not loaded\n");
return 0;
}
int(*simple_buzzer)(int)=dummy_buzzer;
(export pour retrouver simple_buzzer dans /proc/ksyms)
EXPORT_SYMBOL(simple_buzzer);
(les appels utiles)
+ divers appels
extern int(*simple_buzzer)(int);
simple_buzzer(arg);
Dans le driver : (buzzer.c)
===========================
extern int(*simple_buzzer)(int);
static int (* dummy_simple_buzzer)(int);
(la veritable fonction)
int real_simple_buzzer(int arg)
{
.../...
return 0;
}
(a l'enregistrement du driver)
static int __init buzzer_init(void)
{
int ret; /* Driver status */
/* Register driver */
.../...
dummy_simple_buzzer = simple_buzzer;
simple_buzzer = real_simple_buzzer;
return 0;
}
(au d'enregistrement du driver)
static void __exit buzzer_exit(void)
{
/* Unregister driver */
.../...
simple_buzzer = dummy_simple_buzzer;
}
Encore merci a tous et plus particulierement a Edgar.
Cordialement
Olivier
Quoting Edgar Bonet <guilde@???>:
> Le mercredi 26 janvier, olivier.eribon@??? a écrit :
> > Je recherche un moyen de faire appel a une fonction presente dans un module
> > maison (non realise pour etre integre statiquement au kernel) a partir du
> > kernel.
> >
> > Comment faire pour que le linker ne s'arrete pas sur
> > kernel/kernel.o(__ksymtab+0xc88): undefined reference to xxxxxx
> > et que lors du chargement du module la liaison a cette fonction soit
> resolue.
>
> J'ai jamais essayé la programmation noyau, mais voici toujours une idée,
> souvenir d'une ancienne lecture du module howto :
>
> Dans ton noyau tu définis une fonction bidon de même prototype, et un
> pointeur vers cette fonction. Par exemple, si tu prends et tu rends un
> int :
>
> int dummy_foobar(int arg)
> {
> printk("foobar() called but foobar module not loaded\n");
> return 0;
> }
>
> int (*foobar)(int) = dummy_foobar;
>
> Ensuite tu l'utilises via ce pointeur :
>
> ...
> foo = foobar(bar);
> ...
>
> Dans ton module tu définis la vraie fonction :
>
> int real_foobar(int arg)
> {
> ...
> }
>
> Dans l'initialisation du module tu changes le pointeur :
>
> foobar = real_foobar;
>
> et dans le cleanup tu remets l'ancien :
>
> foobar = dummy_foobar;
>
> Tiens-nous au courant !
>
> Edgar.
>
> --
> Edgar Bonet Maison : 04 76 21 29 16 Bureau : 04 76 88 10 96
> 3 rue Jean Prévost Mobile : 06 77 19 79 39 Fax : 04 76 88 11 91
> 38000 Grenoble guilde@??? www.edgar-bonet.org
>