Не вдається запустити 32-бітну програму на 64-розрядному VM


12

Я склав невелику програму C "привіт світ" на Ubuntu 10.04 32-бітної машини. Потім я поставив виконуваний файл (a.out) на віртуальну машину VMWare Ubuntu 12.10 (64 біт) і спробував виконати його (./ a.out). ОС не ідентифікує файл та каже: "Немає такого файлу чи каталогу". Але коли я ставлю той же виконуваний файл на Ubuntu 12.10 (64 біт), який працює на 64-бітовому ноутбуці, він працює нормально, і я отримую потрібний вихід. ВМ працює на серверах IBM Blade. Я хотів знати, чому результати для ВМ?

Відповіді:


20

Повідомлення No such file or directoryне відноситься до виконуваного файлу: a.out. Натомість це стосується допоміжної програми , необхідної для запуску 32-бітного динамічно пов'язаного виконуваного файлу a.out.

Тепер я знайшов усе це дуже добре пояснено в цій приємній статті:

Статична та динамічна зв'язок

Існує два типи бінарних виконуваних файлів: статично пов'язані та динамічно пов'язані. Спочатку про статично пов'язані між собою : Коли програма хоче викликати функцію бібліотеки, вона посилається на неї по імені. При побудові програми з джерела всі функції бібліотеки, що використовуються в програмі, копіюються з бібліотеки в програму. Потім програма містить власний код, а також код функцій бібліотеки, яку вона використовує. Потім в місцях виклику ім'я змінюється на адресу відповідної функції в програмі. Цей процес називається зв'язуванням, оскільки він пов'язує назву функції з самою функцією, її реалізацію. Це називається статичним , оскільки посилання неможливо змінити після побудови програми.

Динамічно пов'язані програми працюють по-різному: програма також посилається на бібліотечні функції за назвою. При побудові програми збираються та зберігаються разом із програмою два списки: список функцій бібліотеки, в яких місцях використовується, та список бібліотек, які містять функції, які використовує програма. Це все для побудови програми.

Пізніше, під час виконання , спеціальна програма-помічник, так званий динамічний лінкер, шукає у певних місцях файлової системи для кожної бібліотеки зі списку бібліотек і завантажує її в пам'ять. Тепер динамічний лінкер знає, за якими адресами пам'яті доступні функції бібліотеки. Він використовує перший список, щоб записати правильну адресу у всіх місцях, які викликають функції бібліотеки. Тоді динамічно пов'язану програму можна запустити.


3
Це повідомлення про помилку "Не знайдено жодного файлу" мене також вперше збентежило ° ͜ °, тоді я зрозумів, що це означає, що якийсь файл, потрібний додатку, відсутній.
Рамчандра Апте

@Radu Rădeanu, що ти називаєш програмою-помічником ? Я здогадуюсь про динамічно пов'язану бібліотеку. Якщо це так, називаючи це програмою-помічником, просто заплутано пояснення.
голем

Ось посилання, яке мені здалося корисним для розуміння цього питання - отримання повідомлення "Не знайдено" під час запуску 32-розрядного бінарного файлу в 64-бітній системі
Голем
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.