Tidak dapat menjalankan program 32-bit pada VM 64-bit

12

Saya mengkompilasi program C "hello world" kecil di mesin Ubuntu 10,04 32 bit. Lalu saya meletakkan executable (a.out) di Ubuntu 12.10 (64 bit) mesin virtual VMWare dan mencoba untuk mengeksekusinya (./ a.out). OS tidak mengidentifikasi file dan mengatakan 'Tidak ada file atau direktori'. Tetapi ketika saya meletakkan executable yang sama pada Ubuntu 12.10 (64 bit) berjalan pada laptop 64 bit, itu berjalan dengan baik dan saya mendapatkan output yang diinginkan. VM berjalan pada Server Blade IBM. Saya ingin tahu mengapa hasil untuk VM?

Jay
sumber

Jawaban:

20

Pesan No such file or directorytidak mengacu ke file executable Anda: a.out. Sebaliknya itu mengacu pada program pembantu yang diperlukan untuk menjalankan executable 32 bit yang terhubung secara dinamisa.out .

Sekarang, saya menemukan semua ini dijelaskan dengan sangat baik dalam artikel yang bagus ini:

Hubungan statis dan dinamis

Ada dua jenis executable biner: yang terhubung secara statis dan yang terhubung secara dinamis. Pertama tentang yang terhubung secara statis : Ketika suatu program ingin memanggil fungsi pustaka, itu merujuknya dengan nama. Saat membangun program dari sumber, semua fungsi perpustakaan yang digunakan dalam program disalin dari perpustakaan ke dalam program. Program kemudian berisi kode sendiri serta kode fungsi perpustakaan yang digunakannya. Kemudian di tempat panggilan nama diubah ke alamat fungsi yang sesuai dalam program. Proses ini disebut penghubungan karena menghubungkan nama suatu fungsi dengan fungsi itu sendiri, implementasinya. Disebut statis , karena tautannya tidak dapat diubah setelah program dibuat.

Program yang terhubung secara dinamis bekerja secara berbeda: Program ini juga merujuk ke fungsi perpustakaan berdasarkan nama. Saat membangun program, dua daftar disusun dan disimpan bersama dengan program: daftar fungsi perpustakaan mana yang digunakan di tempat mana, dan daftar perpustakaan yang berisi fungsi yang digunakan oleh program. Itu semua untuk membangun program.

Kemudian, pada waktu eksekusi , program pembantu khusus, yang disebut penghubung dinamis, mencari tempat-tempat tertentu dalam sistem file untuk setiap pustaka pada daftar pustaka dan memuatnya ke dalam memori. Sekarang penghubung dinamis tahu di alamat memori apa fungsi perpustakaan tersedia. Ini menggunakan daftar pertama untuk menulis alamat yang benar di semua tempat yang memanggil fungsi perpustakaan. Kemudian program yang terhubung secara dinamis dapat dijalankan.

Radu Rădeanu
sumber
3
Pesan kesalahan "Tidak ada file yang ditemukan" ini membingungkan saya juga saat pertama kali, °, maka saya mengerti artinya beberapa file yang diperlukan oleh aplikasi tersebut hilang.
Ramchandra Apte
@Radu Rădeanu, apa yang Anda sebut program pembantu ? Saya kira perpustakaan yang terhubung secara dinamis. Jika demikian, menyebutnya program pembantu hanya membingungkan penjelasan.
golem
Berikut adalah tautan yang saya temukan berguna untuk memahami masalah ini - Mendapatkan pesan "Tidak ditemukan" ketika menjalankan biner 32-bit pada sistem 64-bit
golem