No se puede ejecutar binario en NixOS - No existe tal archivo o directorio

11

Intenté instalar el oráculo jre actual en una máquina virtual que ejecuta NixOS.

Ahora sucede lo siguiente:

[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? El archivo nombrado está obviamente allí. Que esta pasando?

Tratando de analizar más a fondo:

[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, la salida de un archivo realmente perdido se ve 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

Este último es un pequeño binario autocompilado que se ejecuta sin problemas. Ambos se ven muy similares. Por lo tanto, el formato del binario en sí parece estar bien.

[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 hay un problema con respecto a las bibliotecas compartidas necesarias.

¿Qué está pasando y cómo puedo solucionarlo?

michas
fuente

Respuestas:

10

Por lo general, no puede ejecutar archivos binarios en NixOS, ya que necesitarán algunas variables de entorno establecidas o parchearse con patchElf. Supongo que puede instalar y ejecutar Java utilizando el administrador de paquetes nix. Probablemente también pueda crear un entorno adecuado para ejecutarlo con myEnvFun.

goibhniu
fuente
2
Quizás, un ejemplo de uso patchelfpara ejecutar un binario en un entorno nix puede ser de alguna utilidad para aquellos que buscan una solución. Pero ese caso es el entorno de nix "activo" del usuario en una instalación de nix de un solo usuario bajo CentOS, sus necesidades pueden ser diferentes (IIC, el enfoque más nixy sería referirse no al entorno de enlaces simbólicos "activos", sino a un entorno específico versionado, hash one en la tienda nix).
imz - Ivan Zakharyaschev