Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  1. #1
    Invité de passage
    Femme Profil pro ahlem Nm
    Étudiant
    Inscrit en
    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.

  2. #2
    Responsable Modération

    Avatar de ok.Idriss
    Homme Profil pro Idriss Neumann
    Consultant en SSII et ingénieur CNAM Paris (spécialité SI)
    Inscrit en
    février 2009
    Messages
    5 029
    Détails du profil
    Informations personnelles :
    Nom : Homme Idriss Neumann
    Âge : 23
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant en SSII et ingénieur CNAM Paris (spécialité SI)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2009
    Messages : 5 029
    Points : 17 554
    Points
    17 554

    Par défaut

    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.

    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
    mes cours sur DVP | initiation aux bases de données relationnelles | FAQ Linux | FAQ tests
    la programmation Shell | bonnes pratiques Bash | exercices shells scripts & Bash corrigés
    Merci aussi de lire les règles du club

    "Forgiveness does not change the past, but it does enlarge the future." (Paul Boese)
    Traduction approximative : le pardon ne change pas le passé mais élargit l'horizon de l'avenir.

  3. #3
    Invité de passage
    Femme Profil pro ahlem Nm
    Étudiant
    Inscrit en
    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

    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

  4. #4
    Responsable Modération

    Avatar de ok.Idriss
    Homme Profil pro Idriss Neumann
    Consultant en SSII et ingénieur CNAM Paris (spécialité SI)
    Inscrit en
    février 2009
    Messages
    5 029
    Détails du profil
    Informations personnelles :
    Nom : Homme Idriss Neumann
    Âge : 23
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant en SSII et ingénieur CNAM Paris (spécialité SI)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2009
    Messages : 5 029
    Points : 17 554
    Points
    17 554

    Par défaut

    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
    mes cours sur DVP | initiation aux bases de données relationnelles | FAQ Linux | FAQ tests
    la programmation Shell | bonnes pratiques Bash | exercices shells scripts & Bash corrigés
    Merci aussi de lire les règles du club

    "Forgiveness does not change the past, but it does enlarge the future." (Paul Boese)
    Traduction approximative : le pardon ne change pas le passé mais élargit l'horizon de l'avenir.

  5. #5
    Invité de passage
    Femme Profil pro ahlem Nm
    Étudiant
    Inscrit en
    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

    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 !!

  6. #6
    Membre éprouvé
    Inscrit en
    mai 2006
    Messages
    289
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 289
    Points : 426
    Points
    426

    Par défaut

    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...)

  7. #7
    Invité de passage
    Femme Profil pro ahlem Nm
    Étudiant
    Inscrit en
    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

    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

  8. #8
    Membre éprouvé
    Inscrit en
    mai 2006
    Messages
    289
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 289
    Points : 426
    Points
    426

    Par défaut

    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...

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •