Невозможно запустить 32-разрядную программу на 64-разрядной виртуальной машине

12

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

сойка
источник

Ответы:

20

Сообщение No such file or directoryне относится к исполняемому файлу: a.out. Вместо этого это относится к вспомогательной программе, которая необходима для запуска 32-битного динамически связанного исполняемого файла a.out.

Теперь я нашел все это очень хорошо объясненным в этой хорошей статье:

Статическая и динамическая связь

Существует два типа двоичных исполняемых файлов: статически связанные и динамически связанные. Сначала о статически связанных : когда программа хочет вызвать библиотечную функцию, она обращается к ней по имени. При сборке программы из исходного кода все библиотечные функции, используемые в программе, копируются из библиотеки в программу. Затем программа содержит свой собственный код, а также код библиотечных функций, которые она использует. Затем в вызывающих местах имя меняется на адрес соответствующей функции в программе. Этот процесс называется связыванием, потому что он связывает вместе имя функции с самой функцией, ее реализацию. Это называется статическим , потому что ссылка не может быть изменена после сборки программы.

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

Позже, во время выполнения , специальная вспомогательная программа, так называемый динамический компоновщик, ищет в определенных местах файловой системы каждую библиотеку в списке библиотек и загружает ее в память. Теперь динамический компоновщик знает, по каким адресам памяти доступны функции библиотеки. Он использует первый список для записи правильного адреса во всех местах, которые вызывают функции библиотеки. Тогда динамически связанная программа может быть запущена.

Раду Рэдяну
источник
3
Это сообщение об ошибке «Файл не найден» смутило меня тоже в первый раз, когда я понял, что это означает, что какой-то файл, требуемый приложением, отсутствует.
Рамчандра Апте
@Radu Rădeanu, что вы называете вспомогательной программой ? Я думаю, динамически связанная библиотека. Если это так, то, если вы называете это вспомогательной программой, это просто запутывает объяснение.
Голем
Вот ссылка, которую я нашел полезной для понимания этой проблемы - сообщение «Не найдено» при запуске 32-разрядного двоичного файла в 64-разрядной системе
голем