Почему 64-разрядный исполняемый файл, построенный на 64-разрядной ОС, не запускается на втором 64-разрядном процессоре с 32-разрядной ОС
У меня есть два компьютера с 64-разрядными процессорами Intel. Один компьютер (A) имеет 64-разрядную версию Ubuntu 10.04, а второй (B) - 32-разрядные операционные системы Ubuntu 11.04 (проверено с помощью команд на этом сайте).
Мой компилятор по умолчанию - gcc на обеих машинах. Из того, что я знаю, во время компиляции gcc определяет, на какой тип ОС (32-битная /64-битная) она компилируется, и, соответственно, делает 32-битную или 64-битную исполняемой.
Теперь я написал простую программу Hello World на C++ для A, а затем попытался выполнить ее на B.
Сообщение, которое я получил, было
zsh: exec format error: ./hello
Почему это так? Будучи 64-битным процессором, он должен выполнять 64-битный исполняемый файл независимо от типа операционной системы.
Однако исполняемый файл hello world, построенный на B, работает на A. Это ожидаемо, поскольку предполагается, что 64-битные процессоры будут работать с 32-битными исполняемыми файлами.
Есть ли какая-то концептуальная ошибка, которую я здесь делаю?
1 ответ
Работа программы заключается в запуске программы, а 32-битная ОС не распознает 64-битный исполняемый файл. Также программа будет вызывать некоторые системные библиотеки и искать 64-битные библиотеки. Но в этом случае это 64-битный (ELF?) Двоичный файл, и 32-битное ядро не будет знать, что с ним делать.
Может быть написана 32-битная ОС, которая может запускать 64-битные программы. Они не.