Không thể thực thi nhị phân trong NixOS - Không có tệp hoặc thư mục như vậy


11

Tôi đã cố gắng cài đặt oracle jre hiện tại trên máy ảo chạy NixOS.

Bây giờ điều sau đây xảy ra:

[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? Các tập tin được đặt tên rõ ràng là có. Chuyện gì đang xảy ra vậy?

Đang cố gắng phân tích thêm:

[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, đầu ra của một tập tin thực sự thiếu có vẻ khác nhau.

[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

Thứ hai là một nhị phân tự biên dịch nhỏ chạy mà không có vấn đề. Cả hai trông rất giống nhau. Do đó định dạng nhị phân dường như là tốt.

[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

Có vẻ như có một vấn đề liên quan đến các thư viện chia sẻ cần thiết.

Điều gì đang xảy ra và làm thế nào tôi có thể sửa chữa nó?


Câu trả lời:


10

Bạn thường không thể chạy các tệp nhị phân trong NixOS, chúng sẽ cần một số biến môi trường được đặt hoặc được vá bằng patchElf. Tôi giả sử bạn có thể cài đặt và chạy java bằng trình quản lý gói nix. Bạn cũng có thể tạo một môi trường phù hợp để chạy nó bằng myEnvFun.


2
Có lẽ, một ví dụ về việc sử dụng patchelfđể chạy nhị phân trong môi trường nix có thể được sử dụng cho những người tìm kiếm giải pháp. Nhưng trường hợp đó là môi trường nix "hoạt động" của người dùng trong cài đặt nix một người dùng trong CentOS, nhu cầu của bạn có thể khác (IIC cách tiếp cận nixy hơn sẽ không đề cập đến môi trường liên kết "hoạt động", mà là cụ thể phiên bản, băm một trong cửa hàng nix).
imz - Ivan Zakharyaschev

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.