Bonjour,
j'ai réalisé un projet sous linux utilisant l'API Jpcap, jusque là pas de problème.
j'ai du migré ce projet sur du solaris 2.8, cela a impliqué
recompilation du projet
recompilation de la librairie de capture libpcap
voici l'erreur rencontré :
PacketCapture: loading native library jpcap.. ok Using device 'lo0' Exception in thread "main" java.lang.UnsatisfiedLinkError: open at net.sourceforge.jpcap.capture.PacketCapture.open(Native Method) at net.sourceforge.jpcap.capture.PacketCapture.open(PacketCapture.java:63) at Sniffer.<init>(Sniffer.java:50) at Sniffer.main(Sniffer.java:278)
je n'utilise pas le java.library.path mais la variable d'environnement LD_LIBRARY_PATH, le librairie libjpcap.so est bien chargé :
PacketCapture: loading native library jpcap.. ok
mais toutes les méthodes proposé par l'API génère des erreurs, ici open
manque t'il quelque chose ?
Peut être...
Tel qu'est décrit le phénomène, celui-ci se produit quand une librairie native n'est pas compilée "comme il faut" et que les fonctions ne peuvent être chargée dynamiquement.
Quand au "comme il faut" ça peut être bien des choses. Tout dépend comme le code est écrit et la librairie compilée
Ah oui j 'oubliais.
Ce ne sont pas forcément les fonctions de la librairie natives qui sont en cause.
Il se peut sous Solaris que par exemple une simple fonction printf ne soit pas trouvée. Du coup toutes les fonctions de la librairie native qui appellent printf vont lever l'exception UnsatisfiedLink error. Voir par exemple ici:
http://www.labo-sun.com/resource-FR-articles-615-0-java-autre-j2se-les-methodes-natives.htm
effectivement j'ai des doutes sur la librairie libjpcap.so malgré que la compilation c'est bien déroulé.
j'ai téléchargé le package lpcap_shared-0.9.5-sol8-sparc-local.gz de
sunfreeware.com, Freeware List for SPARC and Solaris 8
qui m'a fourni la librairie pré compilé comme on peut la trouvé pour linux mais rien y fait.
Je garde bon espoir
Hum...
Et avec java.library.path qu'est-ce que ça donne ?
Si ça ne marche pas avec java.library.path non plus,il faudrait que tu regardes les dépendances de cette librairie précompilée.
Peut être qu'elle a besoin d'une librairie absente de ton système, ou plus problablement que la librairie requise est bien présente, mais qu'il manque sur ton système un lien symbolique avec le bon numéro de version.
même resultat avec le -Dlibrary.path=
A priori la solution se trouve dans ton précédent post, le jar fournit par sourceforge pour windows et linux contiennent les fichiers .def et .h, utilisé lors d'un appel à une fonction native, le mien non
je creuse cette idée
Non, -Djava.library.path=
Et puis que mets tu à droite de = ?
Possible mais... ->
... -> Non, rien à voir.
C'est une éventuelle absence de librairie ou de lien symbolique qu'il faut rechercher. C'est très différent de ce que tu dis.
oui effetivement, je rectifie -Djava.library.path="le path de libjpcap.so"
Commenet puis-je trouver la librairie manquante ?
j'ai testé ma librairie avec les sources de jpcap et j'ai la même erreur :
c'est bien ma librairie qui est pourrie
voici ce que me donne ldd
Oui mais moi je vouloir le vrai "le path de libjpcap.so" de mes petits yeux porcins :)
Pas sur...
Je n'aime pas ta sortie de ldd, avec aucune adresse mémoire, comme si la librairie socket.so.1 n'était pas chargée en mémoire, alors qu'elle aurait du l'être.
Tu as vérifié qu'elle est présente sur le système celle-là ? Et si oui en version 1 ? Si tu n'as pas exactement cette version tu vas devoir créer un lien symbolique pour aller pointer sur ce que tu as.
Voici mes variables
SNIF_PATH=/usr/snif
LD_LIBRARY_PATH=$SNIF_PATH/lib
avec dans SNIF_PATH :
lib/ les librairies sql/ les scripts sql pour les creations de bases
avec dans lib/src/ les sources du projet
classes/ les sources compilées
bin/ les scripts de compilation, lancement, deployement
conf/ les fichiers de conf
mysql-connector-java-5.0.5-bin.jar libjpcap.so
pour plus de facilité à trouver cette erreur, j'ai ajouté directement les sources de jpcap à mon projet, par conséquent je n'ai plus besoin du jar net.sourceforge.jpcap-0.01.16.jarje n'ai pas de socket.so.1 mais libsocket.so.1 est la même chose ?
un peu plus de détails sur
pour chaque librairie on a :
find object et find version sauf pour le dernier ou on a seulement libc_psr.so.1 sans la version. Cela a t il un impact ?
Oui c'est bien la même chose. J'aurais du écrire libsock, etc...
Je suis parfois un peu paresseux. :oops:
si libc_psr.so.1 est bien présente physiquement cela ne doit pas avoir d'impact.
Si c'est un lien symbolique orphelin alors ça en a un évidemment.
Mais j'ai du mal à imaginer que ton système tourne amputé d'un bout de libc, alors... :?:
C'est curieux ton affaire. Je dois dire que ça m'intrigue, mais je n'ai malheureusement pas beaucoup le temps d'y penser. Peut être plus tard dans la journée.
en tout cas merci de chercher à m'aider
voici un complément d'information sur le déroulement du programme :
Ce semble être là:
Peut être ton fichier ld.config est corrompu ou ne contient pas ce qu'il devrait ou peut être aussi que LD_LIBRARY_PATH surcharge quelque chose quelle ne devrait pas.
Au vu de cela, à ta place je:
- vérifirais ld.config
- enleverais LD_LIBRARY_PATH complètement du système ou sinon au moins pour lancer l'appli.
- et bien sûr utiliserais exclusivement -Djava.library.path en attendant d'y voir plus clair.
Je sais que tu as déjà essayé -Djava.library.path mais LD_LIBRARY_PATH est prioritaire dessus (ce me semble)
le fichier libgen.so.1 est bien présent
dans un premier temps, il est chercher dans :
"/usr/snif/lib/libgen.so.1" Err#2 ENOENT
il n'est pas trouvé dans ce répertoire puis dans un deuxième temps dans
"/usr/lib/libgen.so.1" = 0
là il est touvé
quant à ld.config il n'existe pas. bon je test tout çà
Au fait cette librairie native, elle est écrite en quoi, C ou C++ ?
Je me demande si tu as la même erreur dans le cas où tu as compilé et dans le cas où tu utilises celle précompilée.
Mêmes symptômes oui, mais même erreur, je commence à me demander.
la librairie libpcap.so est écrite en C
lorsque j'utilise la librairie pré-compilé pour linux, j'ai l'erreur :
lorque j'utilise la librairie pré-compile (installé par un package) ou celle que j'ai compilé moi même, là j'ai la même erreur du genre :
Normal..
J'appelle ça les mêmes symptômes. Peut être que la raison est différente pour chacune.