Как определить, является ли бинарный файл Linux 32-разрядным или 64-разрядным?

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 ответа

Решение

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

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, среди других. Однако не все дистрибутивы предоставляют двоичные файлы для всех архитектур (и я сомневаюсь, что есть какие-либо дистрибутивы, которые одинаково нацелены на все поддерживаемые архитектуры ЦП). Поэтому, если вы хотите знать, будет ли данный двоичный файл выполняться в данной системе, вам нужно рассмотреть архитектуру, а не собственный размер слова ЦП.

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

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

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

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

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

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

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

Другие вопросы по тегам