Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
utiliser les fonctions de mon module
Envoyé par: aurelandco

Bonjour,
je pense que c'est une question de debutant.
J'ai pourtant bien cherché sur la doc Linux (The Linux Kernel Module Programming Guide) et sur google.

j'ai un module (liaison.c), il compile, donc a priori aucun probleme.

Je le charge, tjs aucn probleme et je vois bien la fonction que j'ai exportée dans /proc/kallsys

Maintenant je veux m'en servir, je fais un fichier de declarations pour le module et je l'inclus dans mon client.c. Ensuite, ben quelles options de gcc dois-je utiliser. le client.c et le fichier laison.h sont dans le meme repertoire.
A chaque compilation, j'ai le message d'erreur : undefined reference to envoi. Il ne peut pas l'atteindre.
Comment faire ?

Merci par avance, Aurelien

voici les codes :
liaison.c le module qui compile et se charge bien...

#include <linux/kernel.h>
#include <linux/module.h>

#include "liaison.h"

int init_module() {
printk("hello liaison.o\n");
}

void cleanup_module() {
//dev_remove_pack(&liaison_proto);
printk("Liaison unloaded\n");
}

int envoi(int msg)
{
//struct net_device *dev = d;

printk("envoi de donnees\n");
printk("message : %i\n",msg);
}

EXPORT_SYMBOL(envoi);


la declaration
liaison.h

extern int envoi(int);

le client :
#include "liaison.h"

int main(void)
{
envoi(3);
}

Poste le Wednesday 8 December 2004 14:01:00
Répondre     Citer    
Re: utiliser les fonctions de mon module
Envoyé par: Jonesy's

Bonjour,

C'est de la programmation système.
Je n'ai jamais fait de module, mais ton liaison.h doit être dans les headers du kernels /usr/include/...
Et l'include de ton client est donc un include "système".

@+


--- Marchons seul, sans faire le mal, sans rien attendre, tel l'éléphant qui traverse la forêt. ---

Poste le Wednesday 8 December 2004 15:20:59
Répondre     Citer    
Re: utiliser les fonctions de mon module
Envoyé par: aurelandco

Ca n'a pas l'air de marcher. J'ai fait :

cp liaison.h /usr/include/
le 'nouveau' code de client.c

#include <linux/liaison.h>

int main(void)
{
envoi(3);


et gcc client.c -I/usr/include -o client

et je recois :
undefined reference to envoi
ld return 1 exit status


Poste le Wednesday 8 December 2004 15:53:17
Répondre     Citer    
Re: utiliser les fonctions de mon module
Envoyé par: Jonesy's

Bonsoir,

Tu fais une petite erreur d'inattention...
tu copies le .h dans /usr/include et tu "appelles" (inclues) /usr/include/linux/liaison.h (#include <linux/liaison.h>)

Je ne garantis pas pour autant que cela marchera, mais déjà cela me semble plus "logique".

@+

--- Marchons seul, sans faire le mal, sans rien attendre, tel l'éléphant qui traverse la forêt. ---

Poste le Wednesday 8 December 2004 19:27:36
Répondre     Citer    
Re: utiliser les fonctions de mon module
Envoyé par: aurelandco

Pardon, j'ai fait la bonne manip mais je l'ai mal ecrit sur le forum.

Donc liaison.h est bien dans /usr/include/linux mais ca ne marche tjs pas

Merci pour ton interet Jonesys

Poste le Thursday 9 December 2004 08:04:39
Répondre     Citer    
Re: utiliser les fonctions de mon module
Envoyé par: nsouchon

Citation
aurelandco
Bonjour,
je pense que c'est une question de debutant.
J'ai pourtant bien cherché sur la doc Linux (The
Linux Kernel Module Programming Guide) et sur
google.

j'ai un module (liaison.c), il compile, donc a
priori aucun probleme.

Je le charge, tjs aucn probleme et je vois bien la
fonction que j'ai exportée dans /proc/kallsys

Maintenant je veux m'en servir, je fais un fichier
de declarations pour le module et je l'inclus dans
mon client.c. Ensuite, ben quelles options de gcc
dois-je utiliser. le client.c et le fichier
laison.h sont dans le meme repertoire.
A chaque compilation, j'ai le message d'erreur :
undefined reference to envoi. Il ne peut pas
l'atteindre.
Comment faire ?

Merci par avance, Aurelien

voici les codes :
liaison.c le module qui compile et se charge
bien...

#include <linux/kernel.h>
#include <linux/module.h>

#include "liaison.h"

int init_module() {
printk("hello liaison.o\n");
}

void cleanup_module() {
//dev_remove_pack(&liaison_proto);
printk("Liaison unloaded\n");
}

int envoi(int msg)
{
//struct net_device *dev = d;

printk("envoi de donnees\n");
printk("message : %i\n",msg);
}

EXPORT_SYMBOL(envoi);

la declaration
liaison.h

extern int envoi(int);

le client :
#include "liaison.h"

int main(void)
{
envoi(3);
}

Je suis allé sur ce forum en cherchant des renseignements sur l'écriture de drivers Linux suite à un changement de version et ai trouvé ta question qui ne semble pas avoir encore de réponse.

Si c'est bien le cas et que tu veux ecrire un driver, envoies moi un mail, j'enverrai un petit exemple qui fonctionne.

Si tu veux juste écrire une application

modifie ton module en supprimant les includes et appels kernel
ainsi que les fonctions init_module et cleanup_module

compile de la façon suivante:

gcc -c -Wall module.c -o module.o
gcc -c -Wall program.c -o program.o
gcc program.o module.o -o program

et execute:

./program

cela doit fonctionner

à +

Poste le Thursday 6 January 2005 16:28:26
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
utiliser les fonctions de mon module
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons