Não é possível executar o binário no NixOS - Esse arquivo ou diretório não existe


11

Tentei instalar o oracle jre atual em uma VM executando o NixOS.

Agora acontece o seguinte:

[michas@cc:~]$ tar xvzf jre-7u40-linux-x64.tar.gz |grep bin/java
jre1.7.0_40/bin/javaws
jre1.7.0_40/bin/java_vm
jre1.7.0_40/bin/java

[michas@cc:~]$ ls -l ./jre1.7.0_40/bin/java
-rwxr-xr-x 1 michas nogroup 7750 Aug 27 09:17 ./jre1.7.0_40/bin/java

[michas@cc:~]$ ./jre1.7.0_40/bin/java
bash: ./jre1.7.0_40/bin/java: No such file or directory

WTF? O arquivo nomeado está obviamente lá. O que está acontecendo?

Tentando analisar mais:

[michas@cc:~]$ strace ./jre1.7.0_40/bin/java
execve("./jre1.7.0_40/bin/java", ["./jre1.7.0_40/bin/java"], [/* 53 vars */]) = -1 ENOENT (No such file or directory)
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory
) = 40
exit_group(1)                           = ?
+++ exited with 1 +++

[michas@cc:~]$ strace ./jre1.7.0_40/bin/jav
strace: Can't stat './jre1.7.0_40/bin/jav': No such file or directory

Ok, a saída de um arquivo realmente ausente parece diferente.

[michas@cc:~]$ file ./jre1.7.0_40/bin/java
./jre1.7.0_40/bin/java: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, BuildID[sha1]=a558f547fe0b95fdc6a109cb7d9692d6d7969794, not stripped

[michas@cc:~]$ file ~/t
/home/michas/t: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, not stripped

O último é um pequeno binário auto-compilado rodando sem problemas. Ambos parecem muito semelhantes. Portanto, o formato do próprio binário parece estar bem.

[michas@cc:~]$ ldd ./jre1.7.0_40/bin/java
/run/current-system/sw/bin/ldd: line 116: ./jre1.7.0_40/bin/java: No such file or directory

Parece que há um problema em relação às bibliotecas compartilhadas necessárias.

O que está acontecendo e como posso corrigi-lo?


Respostas:


10

Normalmente, você não pode executar arquivos binários no NixOS, pois eles precisam de algumas variáveis ​​de ambiente definidas ou para serem corrigidos com patchElf. Presumo que você possa instalar e executar o java usando o gerenciador de pacotes nix. Provavelmente, você também pode criar um ambiente adequado para executá-lo usando myEnvFun.


2
Talvez um exemplo de uso patchelfpara executar um binário em um ambiente nix possa ser útil para quem procura uma solução. Porém, nesse caso, o ambiente nix "ativo" do usuário em uma instalação nix de usuário único no CentOS, suas necessidades podem ser diferentes (IIC, a abordagem mais nixy seria não se referir ao ambiente simbólico "ativo", mas a um ambiente específico versão, hash um na loja nix).
IMZ - Ivan Zakharyaschev

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.