open("$ORIGIN/../lib/i386/jli/tls/i686/sse2/cmov/libz.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
O executável que você está executando procura por bibliotecas em um rpath , além do caminho de pesquisa normal da biblioteca. O caminho aqui é $ORIGIN/../lib/i386/jli:$ORIGIN/../jre/lib/i386/jli
. Normalmente, $ORIGIN
deve ser substituído pela localização do executável, aqui /usr/lib/jvm/java-6-openjdk/jre/bin
.
Aqui, $ORIGIN
não está sendo substituído. O recurso está desativado em executáveis executando com privilégios extras (setuid, setgid ou setpcap), porque senão você poderá injetar uma biblioteca diferente e, portanto, executar código arbitrário com privilégios elevados. (Veja este artigo para uma explicação mais detalhada.) A questão da segurança foi descoberta há relativamente pouco tempo; no Debian foi corrigido em DSA-2122-1 , então antes de você atualizar para libc6-2.7-18lenny6
, seu executável java
presumivelmente teria funcionado.
O sintoma indica que java
está sendo executado com privilégios adicionais. Este não é o caso em uma instalação Debian normal. Certifique-se de que /usr/lib/jvm/java-6-openjdk/jre/bin/java
seja o modo 755 e não tenha recursos ( getcap /usr/lib/jvm/java-6-openjdk/jre/bin/java
e setcap -r …
para remover os recursos, se houver).
(Resposta original, que pode ser útil se você achar que java
funciona como root, mas não como outros usuários, e acontece que você está invocando binários diferentes.)
Minha aposta é que você tenha outros java
versão anterior em seu PATH
( sudo
altera o PATH
). Verifique o que o type java
diz - provavelmente é uma versão de Java diferente para a qual ldd /path/to/bin/java
reporta libjli.so => not found
.
E especulo que a razão pela qual essa versão do Java não pode encontrar libjli.so
é que ela está procurando por um rpath (caminho de pesquisa de biblioteca armazenado no executável) que não corresponde à maneira como é instalado. Se você tiver o java
binário em /some/where/bin/java
e ele tiver um rpath relativo (que é o caminho do Sun JDK e OpenJDK), a biblioteca deve estar em /some/where/lib/i386/jli/libjli.so
(assumindo uma arquitetura i386). Se o rpath for absoluto, será necessário colocar libjli.so
no local especificado exato ou definir LD_LIBRARY_PATH
para incluir onde libjli.so
é.