17

32-битное ядро (x86) может выполнять только 32-битный код. 64-разрядное ядро (x86_64) может выполнять как 32-разрядный, так и 64-разрядный код.

Я хотел бы знать, может ли машина запустить исполняемый файл: другими словами, у меня есть бинарный файл, и мне нужно запустить его на 32-битной Ubuntu, но я не знаю, является ли бинарный файл 32-битным исполняемым файлом ,

Я использовал команду file , указав исполняемый файл для проверки, и это был возвращенный результат:

64-разрядный исполняемый файл LSB ELF, x86-64, версия 1 (SYSV), динамически связанный (использует общие библиотеки), для GNU/Linux 2.6.24, BuildID [sha1] = 0x7329fa71323a6cd64823c2594338682065cd6e07, не удален

3 ответа3

21

Ответ на вопрос в заголовке находится в начале вывода:

ELF 64-битный исполняемый LSB, x86-64

ELF - это исполняемый и линкованный формат, двоичный формат исполняемых файлов, наиболее часто используемый в Linux.

x86-64 - это архитектура двоичного кода, 64-битная версия набора команд x86, первоначально представленная AMD. По независящим от меня причинам Microsoft называет его "x64", но это то же самое.

Если вам нужно знать архитектуру самого ядра, вы можете использовать uname -mpi . Например, в моей системе это печатает:

x86_64 неизвестно неизвестно

это означает, что я использую ядро x86-64.

Если вас интересует сам процессор, посмотрите в /proc/cpuinfo информацию о процессорах, обнаруженных ядром Linux.

32-битный исполняемый файл 80x86 идентифицируется file как, например:

ELF 32-битный исполняемый LSB, Intel 80386, версия 1 (SYSV), динамически связанный (использует разделяемые библиотеки), для GNU/Linux 2.6.8, раздетый

это говорит нам о том, что это 32-битный исполняемый файл, использующий набор инструкций Intel 80386 (возможно, с расширениями).

Обратите внимание, что это не так просто, как 32-битные и 64-битные архитектуры. Например, ядро Linux поддерживает 32-разрядные архитектуры, такие как Intel 80386, AVR32, S/390 и Unicore32. Что касается 64-битной стороны, Linux можно использовать на PA-RISC, x86-64, Itanium и Alpha, среди других. Однако не все дистрибутивы предоставляют двоичные файлы для всех архитектур (и я сомневаюсь, что есть какие-либо дистрибутивы, которые одинаково нацелены на все поддерживаемые архитектуры ЦП). Поэтому, если вы хотите знать, будет ли данный двоичный файл выполняться в данной системе, вам нужно рассмотреть архитектуру, а не собственный размер слова ЦП.

4

5-й байт двоичного исполняемого файла Linux (формат ELF, см. Википедия) равен 1 для 32-разрядного исполняемого файла, 2 для 64-разрядного исполняемого файла.

Чтобы увидеть это для программы с именем "foo", введите в командной строке

od -t x1 -t c foo | head -n 2
1

Если вы хотите избежать "головы" трубы, вы можете сделать

od -An -t x1 -j 4 -N 1 foo

Это выведет 01, если foo является 32-битным двоичным файлом, и 02, если это 64. Он может все еще включать некоторые пробелы - стоит знать, проводите ли вы автоматические сравнения результатов.

Если это полезно в базовом контейнере Ubuntu Docker, где «файл» не был установлен.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .