IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème de compilation/utilisation - LIBNET version 1.0.2a


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Problème de compilation/utilisation - LIBNET version 1.0.2a
    Bonsoir,

    Je dois utiliser libnet pour un projet personnel afin de tester les capacités d'un serveur que j'ai créé. J'ai donc écris un code en C qui importe la librairie libnet de cette manière :

    Cependant, lorsque je compile (avec cette commande : gcc $(libnet-config --defines) -o synflood synflood.c -lnet ) j'obtiens les erreurs suivantes :

    /tmp/cc5IlBWg.o: dans la fonction « main »:
    synflood.c:(.text+0x7f): référence indéfinie vers « libnet_name_resolve »
    synflood.c:(.text+0xa5): référence indéfinie vers « libnet_open_raw_sock »
    synflood.c:(.text+0xc4): référence indéfinie vers « libnet_error »
    synflood.c:(.text+0xd8): référence indéfinie vers « libnet_init_packet »
    synflood.c:(.text+0xf4): référence indéfinie vers « libnet_error »
    synflood.c:(.text+0x1a2): référence indéfinie vers « libnet_build_ip »
    synflood.c:(.text+0x269): référence indéfinie vers « libnet_error »
    synflood.c:(.text+0x285): référence indéfinie vers « libnet_write_ip »
    synflood.c:(.text+0x2b7): référence indéfinie vers « libnet_error »
    collect2: error: ld returned 1 exit status
    A quoi cela est-il dû? J'ai essayé de voir du côté des headers (principalement dans libnet.h et libnet-functions.h) pour tenter de trouver des erreurs de prototypes mais je n'en ai pas trouvé. De plus certaines fonctions qui sont décrites dans libnet-functions.h fonctionnent parfaitement dans mon code! Enfin, "fonctionnent parfaitement", disons plutôt que je ne reçois pas de message d'erreur lors de la compilation alors que d'autres fonctions qui sont présentes dans le même header vont m'afficher "référence indéfinie vers « trucbidule »).

    Merci pour votre aide

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Bonjour,

    Citation Envoyé par EtienneLndr Voir le message
    Bonsoir,

    Je dois utiliser libnet pour un projet personnel afin de tester les capacités d'un serveur que j'ai créé. J'ai donc écris un code en C qui importe la librairie libnet de cette manière :
    Non, « #include » n'importe pas une bibliothèque. Ce n'est pas tout-à-fait l'équivalent d'un import Java ou Python.

    #include insère le contenu d'un fichier au milieu du code source, à l'endroit où il est spécifié, et le compilateur lit le tout linéairement, comme si le tout avait été d'emblée contenu dans un même fichier source. Les fichiers « *.h », maintenant, est un fichier source C ordinaire mais fait pour ne contenir que les entêtes de fonctions (leur prototype), les déclarations de types, les déclarations de variables externes et les macros spécifiques à une bibliothèque ou un projet.

    Autrement dit, le fichier « *.h » explique au compilateur comment il faut appeler la bibliothèque, qui peut alors générer du code qui en dépend même si cette bibliothèque n'est pas forcément disponible sur le moment. Ce n'est qu'une fois généré le fichier objet, contenant le code en langage machine, que celui-ci est associé à la bibliothèque dont il a besoin et que les références à cette bibliothèque jusque là laissées « dans le vide » sont associées aux vrais points d'entrée dans le fichier objet de la bibliothèque concernée. Si tu ne fais pas cette association, alors le compilateur se plaint parce qu'il reste des références « dans le vide », ou « références indéfinies à… ».

    Cependant, lorsque je compile (avec cette commande : gcc $(libnet-config --defines) -o synflood synflood.c -lnet ) j'obtiens les erreurs suivantes :
    Je ne retrouve pas ces fonctions dans ma propre bibliothèque, mais j'en trouve parfois référence sur le web. Il est donc fort probable que tu développes pour la mauvaise version de la bibliothèque. Quelle est ta version de libnet et de quand date la documentation sur laquelle tu t'appuies pour utiliser ces appels ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Exact c'est une petite erreur de ma part (j'espère que mon prof d'info ne va pas voir ça sinon il va me taper sur les doigts...), j'ai un peu de mal parfois entre Python et le C! Mais merci des explications, je ne savais pas tout ça! Je vais noter tout ça quelque part

    Bah dans le bouquin que j'ai ils disent d'utiliser la version 1.0 de libnet. Cependant sur le site officiel de libnet on ne trouve que la dernière version (à ma connaissance) qui est la 1.1. Du coup j'ai tenté de trouver une version 1.0, et je suis tombé sur la 1.0.2a.
    Le livre que j'utilise date de 2012!

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Personne n'aurait une idée? Parce que je ne trouve pas de solution...

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Le bouquin date peut-être de 2012 mais les fonctions auxquelles il se réfère ont visiblement cessé d'être utilisées dix ans auparavant !

    Après plusieurs recherches, en essayant d'éviter les bibliothèques homonymes (« libnet » étant un nom relativement neutre, on tombe sur des projets n'ayant rien à voir entre eux), il semblerait que les auteurs aient décidé de faire comme beaucoup de monde à une certaine époque : migrer de Sourceforge à Github à cause du changement de politique du premier. En outre, la page associée est libnet-dev et n'a rien à voir avec http://sourceforge.net/projects/libnet/ qui est un autre projet. À ce jour, il semblerait que le compte en charge de la bibliothèque soit sam-github et que les infos les plus récentes (dans le README du projet et repris dans les packages des distributions) soit https://github.com/sam-github/libnet...ter/README.txt.

    Comme c'est un problème récurrent mais pas fréquent, que la bibliothèque existe mais est dure à trouver et que les deux versions sont incompatibles, il semblerait qu'au moins chez Red Hat, on ait fourni deux packages différents : libnet et libnet10, c'est à dire deux noms distincts et pas une simple variation de version. Ceux-ci sont disponibles au moins sur Fedora. Ils doivent l'être a priori aussi sur RHEL et CentOS. Sur Ubuntu, il y a sûrement quelque chose de similaire (je n'ai pas cherché). C'est le second package qu'il faut utiliser :

    Code Shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ sudo dnf install libnet libnet10
    $ rpm -ql libnet | grep libnet.*so
    /usr/lib64/libnet.so.1
    /usr/lib64/libnet.so.1.7.0
    $ rpm -ql libnet10 | grep libnet.*so
    /usr/lib64/libnet10.so.0
    /usr/lib64/libnet10.so.0.0.0
    $ nm -D /usr/lib64/libnet.so.1 | grep open_raw_sock
    $ nm -D /usr/lib64/libnet10.so.0 | grep open_raw_sock
    00000000000026a0 T libnet_open_raw_sock

    Il faudra donc remplacer libnet-config par libnet10-config et -lnet par -lnet10 dans ta ligne de commande.

    Puisque ces packages sont disponibles sur ces distributions, c'est qu'ils doivent fonctionner, mais libnet10 est hors d'âge et appelée à disparaître du jour au lendemain. Je ne saurais trop te conseiller de t'investir soit dans la dernière version en date de la bibliothèque si tu tiens à t'appuyer dessus, soit directement dans la programmation système POSIX et dans les sockets si tu veux faire simplement un peu de programmation réseau.

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/05/2014, 15h50
  2. Réponses: 14
    Dernier message: 12/04/2011, 10h34
  3. Réponses: 7
    Dernier message: 04/03/2010, 13h16
  4. problème de compilation wrong version 49 -48
    Par Tanebisse dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 18/03/2009, 14h39
  5. Réponses: 2
    Dernier message: 15/03/2006, 10h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo