Không thể chạy chương trình 32 bit trên máy ảo 64 bit


12

Tôi đã biên dịch một chương trình C "hello world" nhỏ trên máy Ubuntu 10.04 32 bit. Sau đó, tôi đặt tệp thực thi (a.out) trên máy ảo VMWare Ubuntu 12.10 (64 bit) và cố gắng thực thi nó (./ a.out). HĐH không xác định tệp và nói 'Không có tệp hoặc thư mục như vậy'. Nhưng khi tôi đặt cùng một tệp thực thi trên Ubuntu 12.10 (64 bit) chạy trên máy tính xách tay 64 bit, nó chạy tốt và tôi nhận được đầu ra mong muốn. VM đang chạy trên Máy chủ phiến IBM. Tôi muốn biết tại sao kết quả cho một VM?

Câu trả lời:


20

Thông báo No such file or directorykhông đề cập đến tập tin thực thi của bạn : a.out. Thay vào đó, nó đề cập đến một chương trình trợ giúp cần thiết để chạy chương trình thực thi được liên kết động 32 bit a.out.

Bây giờ, tôi tìm thấy tất cả những điều này được giải thích rất tốt trong bài viết tốt đẹp này:

Liên kết tĩnh và động

Có hai loại thực thi nhị phân: liên kết tĩnh và liên kết động. Đầu tiên về những cái được liên kết tĩnh : Khi một chương trình muốn gọi một hàm thư viện, nó gọi nó theo tên. Khi xây dựng chương trình từ nguồn, tất cả các chức năng thư viện được sử dụng trong chương trình được sao chép từ thư viện vào chương trình. Chương trình sau đó chứa mã riêng cũng như mã của các chức năng thư viện mà nó sử dụng. Sau đó, trong các vị trí gọi, tên được thay đổi thành địa chỉ của hàm tương ứng trong chương trình. Quá trình này được gọi là liên kết vì nó liên kết với nhau tên của một chức năng với chính chức năng đó, việc thực hiện nó. Nó được gọi là tĩnh , vì liên kết không thể thay đổi sau khi chương trình được xây dựng.

Các chương trình được liên kết động hoạt động khác nhau: Chương trình cũng đề cập đến các chức năng của thư viện theo tên. Khi xây dựng chương trình, hai danh sách được tập hợp và lưu trữ cùng với chương trình: danh sách các chức năng thư viện được sử dụng ở nơi nào và danh sách các thư viện chứa các chức năng được sử dụng bởi chương trình. Đó là tất cả để xây dựng chương trình.

Sau đó, tại thời điểm thực hiện , một chương trình trợ giúp đặc biệt, được gọi là trình liên kết động, sẽ tìm ở những vị trí cụ thể trong hệ thống tệp cho mỗi thư viện trong danh sách thư viện và tải nó vào bộ nhớ. Bây giờ trình liên kết động biết tại bộ nhớ nào có chức năng thư viện. Nó sử dụng danh sách đầu tiên để viết địa chỉ chính xác ở tất cả các nơi gọi hàm thư viện. Sau đó, chương trình liên kết động có thể được chạy.


3
Thông báo lỗi "Không tìm thấy tệp" này làm tôi bối rối ngay lần đầu tiên ° °, sau đó tôi hiểu rằng nó có nghĩa là một số tệp mà ứng dụng yêu cầu bị thiếu.
Ramowderra Apte

@Radu Rădeanu, bạn gọi chương trình trợ giúp là gì? Tôi đoán một thư viện liên kết động. Nếu vậy, gọi nó là một chương trình trợ giúp chỉ làm rối loạn lời giải thích.
golem

Đây là một liên kết mà tôi thấy hữu ích để hiểu vấn đề này - Nhận tin nhắn Không tìm thấy thông báo khi chạy một tệp nhị phân 32 bit trên hệ thống 64 bit
golem
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.