J'essaie de lancer java:
$ java -version
java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
$ ldd /usr/lib/jvm/java-6-openjdk/jre/bin/java
linux-gate.so.1 => (0xb779f000)
libz.so.1 => /usr/lib/libz.so.1 (0xb7780000)
libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7767000)
libjli.so => /usr/lib/jvm/java-6-openjdk/jre/bin/../lib/i386/jli/libjli.so (0xb7762000)
libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb775e000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7603000)
/lib/ld-linux.so.2 (0xb77a0000
$ ls /usr/lib/jvm/java-6-openjdk/jre/bin/../lib/i386/jli/
libjli.so
Mais java fonctionne sous root:
$ sudo java -version
java version "1.6.0_18"
OpenJDK Runtime Environment (IcedTea6 1.8.7) (6b18-1.8.7-2~lenny1)
OpenJDK Client VM (build 14.0-b16, mixed mode, sharing)
UPD:
/ usr / lib / jvm / java-6-openjdk / jre / bin / java est en fait ma commande java:
$ type java
java is hashed (/usr/bin/java)
$ ls -l /usr/bin/java
lrwxrwxrwx 1 root root 22 Jul 14 10:15 /usr/bin/java -> /etc/alternatives/java
$ ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 40 Jul 14 10:36 /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk/jre/bin/java
UPD2:
J'ai également essayé de définir le PATH racine:
$ sudo su
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# exit
$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ java -version
java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
UPD3:
Je suis fatigué:
# comm -3 <(declare | sort) <(declare -f | sort)
sous racine. Mais il n'y a pas de variables d'environnement utilisables pour java.
UPD4:
strace -f java -version
résultat: http://dumpz.org/67368/
strace -f java -version
et publier la sortie.Réponses:
L'exécutable que vous exécutez recherche des bibliothèques dans un chemin d' accès en plus du chemin de recherche de bibliothèque normal. Le chemin est ici
$ORIGIN/../lib/i386/jli:$ORIGIN/../jre/lib/i386/jli
. Normalement,$ORIGIN
devrait être remplacé par l'emplacement de l'exécutable, ici/usr/lib/jvm/java-6-openjdk/jre/bin
.Ici,
$ORIGIN
n'est pas remplacé. La fonctionnalité est désactivée dans les exécutables exécutés avec des privilèges supplémentaires (setuid, setgid ou setpcap), car sinon vous pourriez être en mesure d'injecter une bibliothèque différente et d'exécuter ainsi du code arbitraire avec des privilèges élevés. (Voir cet article pour une explication plus détaillée.) Le problème de sécurité a été découvert relativement récemment; dans Debian, il a été corrigé dans DSA-2122-1 , donc avant de passer àlibc6-2.7-18lenny6
, votrejava
exécutable aurait probablement fonctionné.Le symptôme indique qu'il
java
s'exécute avec des privilèges supplémentaires. Ce n'est pas le cas dans une installation Debian normale. Assurez-vous qu'il/usr/lib/jvm/java-6-openjdk/jre/bin/java
s'agit du mode 755 et qu'il n'a aucune capacité (getcap /usr/lib/jvm/java-6-openjdk/jre/bin/java
, etsetcap -r …
pour supprimer les capacités le cas échéant).(Réponse originale, qui peut être utile si vous trouvez que cela
java
fonctionne en tant que root mais pas en tant que d'autres utilisateurs, et il s'avère que vous invoquez différents binaires.)Je parie que vous avez une autre
java
version plus tôt sur votrePATH
(sudo
change laPATH
). Vérifiez ce qui esttype java
dit - c'est probablement une version Java différente pour laquelle lesldd /path/to/bin/java
rapportslibjli.so => not found
.Et je spécule que la raison pour laquelle cette version Java ne peut pas trouver
libjli.so
est qu'elle la recherche via un rpath (chemin de recherche de bibliothèque stocké dans l'exécutable) qui ne correspond pas à la façon dont il est installé. Si vous avez lejava
binaire dans/some/where/bin/java
et qu'il a un chemin d'accès relatif (qui est le chemin du Sun JDK et OpenJDK), la bibliothèque devrait être dans/some/where/lib/i386/jli/libjli.so
(en supposant une architecture i386). Si le chemin d'accès est absolu, vous devez soit placerlibjli.so
à l'emplacement spécifié exact, soit définirLD_LIBRARY_PATH
pour inclure oùlibjli.so
est.la source
type java
export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk/jre/lib/i386/jli/
, mais j'ai la même erreur.J'ai téléchargé "1.7.0_60" de java.com au
.tar.gz
format et l' ai installé dans/usr/local/jre1.7.0_60
. J'ai ensuite créé un lien dur vers/usr/local/bin/java
et reçu l'erreur décrite ci-dessus.Changer le lien dur en un lien symbolique a résolu le problème.
Version courte:
Est mauvais.
Est bon.
la source
Essayez de trouver l'exécutable java dans le même chemin que
libjli.so
et utilisez-le.Par exemple, j'ai trouvé
libjli.so
dans/usr/lib/jvm/java-7-oracle/jre/lib/amd64/jli/libjli.so
, donc j'ai utiliséet a trouvé l'exécutable dans
/usr/lib/jvm/java-7-oracle/bin/java
. Ensuite, je supprimé àjava
partir/usr/bin
et juste au- dessus des liens symboliques exécutable dans/usr/bin
.la source
Si le bogue est dû à l'utilisation de setcap sur un exécutable Java, reportez-vous à
Comment faire fonctionner Oracle java 7 avec setcap cap_net_bind_service + ep et http://bugs.java.com/view_bug.do?bug_id=7157699
qui répond à cette question en détail.
ps. Dans notre projet, nous devions faire
pour autoriser le binaire java à ouvrir les ports tcp / udp en dessous de 1024. Le "bogue" java 7157699 fournit une solution rapide, en ajoutant le répertoire où libjli.so se trouve dans un fichier conf dans le chemin /etc/ld.so.conf.d, puis appeler ldconfig pour remettre en cache les bibliothèques. En supposant que Linux.
la source
Vérifiez les autorisations sur ce fichier. Ils devraient ressembler
0644/-rw-r--r--
. Sinon, réinstallezopenjdk-6-jre-headless
, car cela signifierait que quelqu'un a foiré les autorisations.la source
ldd
rapporteraitlibjli.so => not found
s'il ne pouvait pas lire le.so
(du moins c'est ce qui se passe avec GLibc 2.11).Semblable à la réponse de Tshepang, j'ai forcé
libjli.so
dans le chemin de recherche de la bibliothèque:Pour référence, mon environnement de build utilise github: flexiondotorg / oab-java6 sur Ubuntu 10.04 / 64-bit.
la source
Pour une raison étrange, je
/usr/bin/java
ne pointais plus vers l'installation java. Je ne sais pas comment cela s'est produit. J'ai confirmé cela en exécutant:Ce qui m'a donné ce qui suit
La solution a donc été de supprimer le java
/usr/local/bin
et de créer un nouveau lien symbolique:la source
J'ai eu la même erreur.
Le moyen le plus simple de le résoudre est de supprimer simplement tous les jdks et jres ainsi que l'exécutable / usr / bin / java, s'il existe.
Et puis réinstallez jdk.
Cela a résolu le problème pour moi. Alors que d'autres méthodes ne l'ont pas fait.
la source
Pour toute personne essayant de démarrer une application Java à partir d'un service systemd et obtenant la même erreur, liée à la
libjli.so
bibliothèque, lisez la suite.Il existe actuellement un bogue ouvert pour Fedora:
Bogue 1358476 - SELinux empêchant systemd d'exécuter des services basés sur java
En résumé, SELinux restreint silencieusement l'accès à cette bibliothèque. Parce qu'il n'y a pas de message refusé par AVC, vous ne pouvez pas le corriger avec le contexte ou un changement de stratégie.
J'ai constaté que l'ajout d'un fichier
/etc/ld.so.conf.d/
contenant le dossier de votrelibjli.so
fichier est une solution de contournement:Et puis exécutez
Mais c'est assez compliqué ...
Une meilleure option consiste à utiliser
/bin/bash -c
pour lancer le processus Java dans votre fichier de service:Jusqu'à ce que le problème soit résolu ...
la source
/bin/bash
? Que se passe-t-il si vous utilisez/bin/sh
?