Nhận tin nhắn không tìm thấy tin nhắn trên mạng khi chạy nhị phân 32 bit trên hệ thống 64 bit


70

Tôi hiện đang có một vấn đề kỳ lạ trên debian (wheezy / amd64).

Tôi đã tạo một chroot để cài đặt một máy chủ (tôi không thể cung cấp thêm chi tiết về nó, xin lỗi). Hãy gọi con đường của nó /chr_path/. Để làm cho mọi thứ dễ dàng, tôi đã khởi tạo chroot này bằng một debootstrap (cũng là wheezy / amd64).

Tất cả dường như hoạt động tốt bên trong chroot nhưng khi tôi khởi động tập lệnh cài đặt của máy chủ thì tôi nhận được: zsh: Not found /some_path/perl(trình cài đặt bao gồm một nhị phân perl vì một số lý do)

Đương nhiên, tôi đã kiểm tra /some_path/vị trí và tôi tìm thấy nhị phân "perl". filetrong môi trường chroot trả về:

/some_path/perl ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped

Các tập tin tồn tại, có vẻ ok, có quyền chính xác. Tôi có thể sử dụng file, ls, vimtrên đó nhưng ngay sau khi tôi cố gắng thực hiện nó - ./perlví dụ - Tôi nhận được: zsh: Not found ./perl.

Tình huống này khá dễ hiểu đối với tôi. Hơn thế nữa :

  • Tôi có thể thực thi các nhị phân cơ bản khác (/ bin / ls, ...) trong chroot mà không gặp lỗi
  • Tôi có vấn đề tương tự cho các nhị phân khác đi kèm với dự án
  • Khi tôi cố gắng thực thi nhị phân từ root chính ( /chr_path/some_path/perl), nó hoạt động.
  • Tôi đã cố gắng đặt một trong những nhị phân với một bản sao của tôi ls. Tôi đã kiểm tra rằng các quyền truy cập là như nhau nhưng điều này không thay đổi bất cứ điều gì (một cái đang hoạt động và cái kia thì không)

1
Đây là vấn đề tương tự như "Không có tệp hoặc thư mục như vậy" nằm trên các tệp nhị phân được cài đặt Optware . Lưu ý rằng Perl của bạn là tệp thực thi 32 bit. Bạn đang thiếu hệ thống thời gian chạy 32 bit ( libc6-i386gói hoặc ia32-libsnếu bạn muốn có nhiều thư viện).
Gilles

@Gilles: Cảm ơn rất nhiều! Một cài đặt năng khiếu ia32-libs đã giải quyết vấn đề !! Tôi đã thấy rằng perl là 32 bit nhưng vì nó đang hoạt động trên hệ thống chính (cùng một bản phân phối) nên tôi chỉ cho rằng nó không được liên kết. Trên thực tế, tôi phải cài đặt hệ thống thời gian chạy 32 bit trên hệ thống chính tại một số điểm.
Elenaher

1
@Gilles: Tôi nghĩ rằng tôi sẽ thêm nó dưới dạng một câu trả lời ngắn gọn thay vì đánh dấu đây là một câu hỏi trùng lặp. Môi trường đủ khác biệt để mặc dù vấn đề là như nhau, nhưng mọi người tìm kiếm có nhiều khả năng gặp phải cái này hay cái khác.
Caleb

1
@Caleb Chúng tôi không xóa các bản sao vì lý do chính xác đó; Những người tìm kiếm tìm thấy cái này sẽ chỉ theo liên kết trùng lặp đến bài viết khác. Nếu đây là vấn đề tương tự thì có lẽ nên đóng cửa
Michael Mrozek

Tài khoản . Vì vậy, tôi đoán câu hỏi này thuộc về mở.
Gilles

Câu trả lời:


72

Khi bạn không thực thi được một tệp phụ thuộc vào một trình tải của bộ dữ liệu, thì lỗi bạn gặp có thể liên quan đến trình tải hơn là tệp bạn đang thực thi.

  • Trình tải của tệp thực thi gốc được liên kết động là một phần của hệ thống chịu trách nhiệm tải các thư viện động. Đó là một cái gì đó giống như /lib/ld.sohoặc /lib/ld-linux.so.2, và phải là một tập tin thực thi.
  • Trình tải của tập lệnh là chương trình được đề cập trên dòng shebang, ví dụ: /bin/shtập lệnh bắt đầu bằng #!/bin/sh. (Bash và zsh đưa ra một thông điệp, người phiên dịch xấu, thay vì lệnh không tìm thấy trong trường hợp này.

Thông báo lỗi khá sai lệch khi không chỉ ra rằng trình tải là vấn đề. Thật không may, việc sửa lỗi này sẽ khó khăn vì giao diện kernel chỉ có chỗ để báo cáo mã lỗi số, không phải cũng chỉ ra rằng lỗi trong thực tế liên quan đến một tệp khác. Một số shell tự thực hiện công việc cho các tập lệnh (đọc #!dòng trên tập lệnh và xử lý lại tình trạng lỗi), nhưng không có trình duyệt nào tôi thấy cố gắng làm điều tương tự cho các nhị phân gốc.

lddSẽ không hoạt động trên các nhị phân vì nó hoạt động bằng cách đặt một số biến môi trường đặc biệt và sau đó chạy chương trình, để trình tải thực hiện công việc. stracecũng sẽ không cung cấp bất kỳ thông tin có ý nghĩa nào, vì nó sẽ không báo cáo nhiều hơn những gì kernel báo cáo và như chúng ta đã thấy kernel không thể báo cáo mọi thứ mà nó biết.

Tình huống này thường phát sinh khi bạn cố chạy một hệ nhị phân cho đúng hệ thống (hoặc họ hệ thống) và siêu kiến ​​trúc nhưng kiến ​​trúc phụ sai. Ở đây bạn có các nhị phân ELF trên một hệ thống mong đợi các nhị phân ELF, vì vậy kernel tải chúng tốt. Chúng là các nhị phân i386 chạy trên bộ xử lý x86_64, vì vậy các hướng dẫn có ý nghĩa và đưa chương trình đến điểm mà nó có thể tìm kiếm trình tải của nó. Nhưng chương trình là chương trình 32 bit (như fileđầu ra chỉ ra), đang tìm kiếm trình tải 32 bit /lib/ld-linux.so.2và có lẽ bạn chỉ cài đặt trình tải 64 bit /lib64/ld-linux-x86-64.so.2trong chroot.

Bạn cần cài đặt hệ thống thời gian chạy 32 bit trong chroot: trình tải và tất cả các thư viện mà các chương trình cần. Từ Debian wheezy trở đi, nếu bạn muốn hỗ trợ cả i386 và x86_64, hãy bắt đầu với cài đặt amd64 và kích hoạt hỗ trợ multiarch : chạy dpkg --add-architecture i386sau đó apt-get updateapt-get install libc6:i386 zlib1g:i386 …(nếu bạn muốn tạo danh sách các phụ thuộc của gói perl của Debian, để xem thư viện nào có khả năng cần thiết, bạn có thể sử dụng aptitude search -F %p '~Rdepends:^perl$ ~ri386'). Bạn có thể lấy một bộ sưu tập các thư viện phổ biến bằng cách cài đặt ia32-libsgói (trước tiên bạn cần bật hỗ trợ multiarch). Trên Debian amd64 cho đến khi khò khè, trình tải 32 bit có trong libc6-i386gói. Bạn có thể cài đặt một bộ thư viện 32 bit lớn hơn bằng cách cài đặt ia32-libs.


Đây có phải là điều duy nhất có thể kích hoạt thông báo lỗi? Tôi đã cài đặt các thư viện 32 bit và đây là đầu ra củaldd nhưng tôi vẫn gặp lỗi tương tự.
Nathan Osman


Tôi đã thử cài đặt lsb-corenhưng điều đó dường như không giúp được gì. Tôi nghĩ rằng tôi tốt hơn nên mở một câu hỏi mới cho việc này.
Nathan Osman

Cảm ơn bạn vì điều này, bạn vừa kết thúc hai ngày gãi đầu. Tôi nghĩ rằng tất cả mọi thứ đã được biên dịch tĩnh nhưng nó đã không!
Finn O'leary

5

Chạy ldd(1)trên perlnhị phân của bạn . Thường thì Not foundlỗi có vẻ khó hiểu trên một tệp rõ ràng là do một trong những thư viện dùng chung của chương trình không được tìm thấy.

Vì vậy, có thể là chroot của bạn không đầy đủ đối với các thư viện chia sẻ cần thiết bởi các nhị phân của bạn.


Trên thực tế tôi nhận được: perl is not a dynamic executablekhi tôi ở trong chroot và tôi nhận được danh sách phụ thuộc chính xác từ bên ngoài. Tôi hiện đang kiểm tra xem có gì lạ không nhưng tôi đã sử dụng debootstrap để tránh loại thiếu này và đã có nhiều libs (có một hệ thống thực thi perl chạy trong hệ thống chroot chạy tốt nhưng đó là phiên bản khác; có lẽ tôi sẽ làm một số liên kết tượng trưng?)
Elenaher

Thành thật mà nói, tôi đã mong đợi debootstrap đã tạo ra một chroot hoàn chỉnh, vì vậy tôi không mong đợi câu trả lời của mình là chính xác trong khía cạnh đó. Nhưng tôi đã chạy qua thư viện mất tích trong vấn đề chroot trước đây vì vậy tôi nghĩ tôi sẽ xem câu trả lời của mình có bay được không.
camh

xem bình luận cho Gilles trên bài chính: Bạn đã đúng. Có một số lib bị thiếu. Ưu điểm chính của debootstrap là tôi có thể giải quyết vấn đề bằng cài đặt năng khiếu cơ bản :)
Elenaher
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.