Précédent   Forum du club des développeurs et IT Pro > Général Développement > Programmation système > Linux
Linux Forum d'entraide sur la programmation Linux : shell, système, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/06/2012, 01h55   #1
ahlem1900
Invité de passage
 
Femme ahlem Nm
Étudiant
Inscription : juin 2012
Messages : 25
Détails du profil
Informations personnelles :
Nom : Femme ahlem Nm
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2012
Messages : 25
Points : 4
Points : 4
Par défaut [CentOS] problème de reconnaissance de la lib C standard

Salut tout le monde.

J'ai récement installer Centos et je suis débutante sur linux

J'ai un problème de reconnaissance des bibliothèque C avec mon programme, sachant que j'utilise make comme compilateur.

Voici mon code :

Code c :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <linux/module.h>
#include <linux/kernel.h>
# include <linux/sched.h>
# include <linux/netlink.h>
# include <net/sock.h>
# include <net/net_namespace.h>
# include <stdlib.h>
#include <stdio.h>
#include <sys/sendfile.h> 
# define NETLINK_NITRO 17
 
MODULE_LICENSE("GPL");
 
static struct sock *nl_sk = NULL;
 
static void nl_data_ready (struct sk_buff *skb)
{
 
   struct nlmsghdr *nlh = NULL;
   if(skb == NULL) {
   printk("skb is NULL \n");
   return ;
   }
   nlh = (struct nlmsghdr *)skb->data;
   printk(KERN_INFO "%s: received netlink message payload: %s\n", __FUNCTION__,
              (char *) NLMSG_DATA(nlh));
 
}
 
static void netlink_test()
{
 
nl_sk = netlink_kernel_create(&init_net,NETLINK_NITRO,0, nl_data_ready,NULL, THIS_MODULE);
 
}
 
static int __init my_module_init(void)
{
printk(KERN_INFO "Initializing Netlink Socket");
netlink_test();
return 0;
}
 
static void __exit my_module_exit(void)
{
ssize_t sendfile(int fichier , int sock_fd , off_t * offset, size_t count);
{
 FILE* fichier = NULL;
 
    fichier = fopen("/home/ahlem/GPL.odt" , "r+");
 
    if (fichier != NULL)
           return 0 ;// On lit et on écrit dans le fichier
 
     fclose(fichier) ; //le fichier doit être fermé si l'ouverture a réussi ie si fichier != NULL
     return ;
}
}
 
module_init(my_module_init);
module_exit(my_module_exit);

Et voilà les erreurs :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@Ahlem bin]# make
make -C /lib/modules/2.6.32-220.7.1.el6.x86_64/build M=/home/ahlem/bin modules
make[1]: entrant dans le répertoire « /usr/src/kernels/2.6.32-220.13.1.el6.centos.plus.x86_64 »
  CC [M]  /home/ahlem/bin/prgfile.o
/home/ahlem/bin/prgfile.c:8:21: erreur: stdlib.h : Aucun fichier ou dossier de ce type
/home/ahlem/bin/prgfile.c:9:19: erreur: stdio.h : Aucun fichier ou dossier de ce type
/home/ahlem/bin/prgfile.c:10:27: erreur: sys/sendfile.h : Aucun fichier ou dossier de ce type
/home/ahlem/bin/prgfile.c:32: attention : function declaration isn’t a prototype
/home/ahlem/bin/prgfile.c: In function ‘my_module_exit’:
/home/ahlem/bin/prgfile.c:49: erreur: ‘FILE’ undeclared (first use in this function)
/home/ahlem/bin/prgfile.c:49: erreur: (Each undeclared identifier is reported only once
/home/ahlem/bin/prgfile.c:49: erreur: for each function it appears in.)
/home/ahlem/bin/prgfile.c:49: erreur: ‘fichier’ undeclared (first use in this function)
/home/ahlem/bin/prgfile.c:51: erreur: implicit declaration of function ‘fopen’
/home/ahlem/bin/prgfile.c:54: attention : ‘return’ with a value, in function returning void
/home/ahlem/bin/prgfile.c:56: erreur: implicit declaration of function ‘fclose’
make[2]: *** [/home/ahlem/bin/prgfile.o] Erreur 1
make[1]: *** [_module_/home/ahlem/bin] Erreur 2
make[1]: quittant le répertoire « /usr/src/kernels/2.6.32-220.13.1.el6.centos.plus.x86_64 »
make: *** [all] Erreur 2
Il n'arrive pas à trouver les bibliothèques malgré qu'ils sont déjà installer, je suis sur, car j'ai déjà les utilisé dans un autre programme et ça marche bien sans erreurs mais avec le compilateur gcc.

Quelqu'un peut m'informer s'il vous plaît ? Merci d'avance.
ahlem1900 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2012, 07h02   #2
ok.Idriss
Responsable Modération

 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et auditeur au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 3 831
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 22
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et auditeur au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 3 831
Points : 12 004
Points : 12 004
Bonjour.

Alors pour commencer, make ce n'est pas un compilateur mais un outil permettant d'automatiser les taches de compilation. Pour commencer, tu pourrais nous fournir le contenu du Makefile, ça pourrait toujours être utile.

Citation:
Il n'arrive pas à trouver les bibliothèques malgré qu'ils sont déjà installer, je suis sur, car j'ai déjà les utilisé dans un autre programme et ça marche bien sans erreurs mais avec le compilateur gcc.
As-tu essayé de compiler ce fichier en particulier via GCC seulement ? Si c'est pas le cas, essayes. As-tu installé un package du type : glibc ou libc-6.i386 etc ?

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2012, 14h33   #3
ahlem1900
Invité de passage
 
Femme ahlem Nm
Étudiant
Inscription : juin 2012
Messages : 25
Détails du profil
Informations personnelles :
Nom : Femme ahlem Nm
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2012
Messages : 25
Points : 4
Points : 4
voici mon Makefile : ( sachant que j'ai dejà l'utilser avec un autre programme et ça marche bien)
Code :
1
2
3
4
5
6
obj-m += prgfile.o
KVERSION = $(shell uname -r)
all:
	make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
	make -C /lib/modules/$(KVERSION)/build M=$(PWD) clea

oui, j'essaye avec GCC mais il m'a fourni plus des erreurs que le make. ( remarque: c'est un programme de noyau donc c'est presque un module que je doit l'installer alors ils m'ont informer d'utilser le make que j'ai dejà l'utiliser dans autre programme qui ne diffère qu'un peu de ça et il a été bien executé)
oui, j'ai installé un package de type libstdc++-devel.i686 car j'utilise Centos6.
merci
ahlem1900 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2012, 14h46   #4
ok.Idriss
Responsable Modération

 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et auditeur au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 3 831
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 22
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et auditeur au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 3 831
Points : 12 004
Points : 12 004
Bonjour.

La libstdc++ à priori c'est pour le C++, pas le même package que pour la libc (glibc sur CentOS je crois, à vérifier) ... ce n'est pas le bon package. Les erreurs fournie par gcc, il serait bon de nous les fournir.

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2012, 15h50   #5
ahlem1900
Invité de passage
 
Femme ahlem Nm
Étudiant
Inscription : juin 2012
Messages : 25
Détails du profil
Informations personnelles :
Nom : Femme ahlem Nm
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2012
Messages : 25
Points : 4
Points : 4
j'installe le glibc mais ils ont resté les memes erreurs .
le but de mon programme est d'envoyer un ficheir de l'espace utilisateur vers le noyau. le programme de l'utilisateur a été bien compilé et executé avec gcc. alors que celui de noyau ne va plus.
voilà le programme qui j'ai déjà executé avec le make et qui consiste d'ouvrir la socket et de recevoir un message de l'utilsateur.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
# include <linux/sched.h>
# include <linux/netlink.h>
# include <net/sock.h>
# include <net/net_namespace.h>
# define NETLINK_NITRO 17
 
MODULE_LICENSE("GPL");
 
static struct sock *nl_sk = NULL;
 
static void nl_data_ready (struct sk_buff *skb)
{
 
   struct nlmsghdr *nlh = NULL;
   if(skb == NULL) {
   printk("skb is NULL \n");
   return ;
   }
   nlh = (struct nlmsghdr *)skb->data;
   printk(KERN_INFO "%s: received netlink message payload: %s\n", __FUNCTION__,
              (char *) NLMSG_DATA(nlh));
 
}
 
static void netlink_test()
{
 
nl_sk = netlink_kernel_create(&init_net,NETLINK_NITRO,0, nl_data_ready,NULL, THIS_MODULE);
 
}
 
static int __init my_module_init(void)
{
printk(KERN_INFO "Initializing Netlink Socket");
netlink_test();
return 0;
}
 
static void __exit my_module_exit(void)
{
printk(KERN_INFO "Goodbye");
sock_release(nl_sk->sk_socket);
}
 
module_init(my_module_init);
module_exit(my_module_exit);
on n'a pas une garnde différence. je juste l'ajoute la partie du réception et de lecture de fichier ainsi que les trois bibliothèques nécessaires ( <stdlib.h> <stdio.h <sys/sendfile.h> )
j'espère que t'a bien compris mon problème !!
ahlem1900 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2012, 22h36   #6
Drawingrom
Membre éclairé
 
Inscription : mai 2006
Messages : 258
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 258
Points : 348
Points : 348
Bonjour,

Si vos .h ne sont effectivement pas dans /usr/include, il faut que vous installiez les packages de "dev" qui contiennent les fichiers d'en-tête (sur Debian, ils sont suffixés par -dev, sur RHEL ou CentOS, il me semble qu'il y a dev dans le nom mais je ne me rappelle pas exactement...)
Drawingrom est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2012, 00h11   #7
ahlem1900
Invité de passage
 
Femme ahlem Nm
Étudiant
Inscription : juin 2012
Messages : 25
Détails du profil
Informations personnelles :
Nom : Femme ahlem Nm
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2012
Messages : 25
Points : 4
Points : 4
bonsoir :
mes .h sont tous dans "include". voilà
Code :
1
2
3
4
5
6
7
8
9
10
11
12
[root@Ahlem ahlem]# find / -name "stdlib.h"
/usr/src/linux-2.6.32/arch/powerpc/boot/stdlib.h
/usr/include/bits/stdlib.h
/usr/include/c++/4.4.4/tr1/stdlib.h
/usr/include/stdlib.h
[root@Ahlem ahlem]# find / -name "stdio.h"
/usr/src/linux-2.6.32/arch/powerpc/boot/stdio.h
/usr/include/bits/stdio.h
/usr/include/c++/4.4.4/tr1/stdio.h
/usr/include/stdio.h
[root@Ahlem ahlem]# find / -name "sendfile.h"
/usr/include/sys/sendfile.h
je ne comprend pas vraiment où l'erreur exactement dont il ne trouve pas ces bibliothèques
ahlem1900 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2012, 20h38   #8
Drawingrom
Membre éclairé
 
Inscription : mai 2006
Messages : 258
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 258
Points : 348
Points : 348
En y réfléchissant, vous êtes en programmation kernel (ce que je ne pratique pas). Une petite recherche m'a donné ça : http://tldp.org/LDP/lkmpg/2.6/html/x1352.html

Vous ne pouvez pas utiliser la library standard, donc pas de stdio

Vous pouvez par contre utiliser

Code :
#include <linux/string.h>
Mais pour écrire dans un fichier, il va falloir chercher...
Drawingrom est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h23.


 
 
 
 
Partenaires

Hébergement Web