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

24

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, не удален

enzom83
источник

Ответы:

29

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

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

CVn
источник
1
«причины, которые за мной». Я до сих пор помню день, когда я узнал, что x64 был 64-битным, а x86 - 32-битным.
Пол Дрэйпер
1
@PaulDraper Термин «x86» имеет четкую этимологию; он восходит к процессорам Intel серии 80x86, отличая их от своих предшественников, таких как 8008 или 8080, и в наши дни чаще всего относится к 32-битным (набор команд IA-32) вариантам (80386, 80486, Pentium и новее). ). Эти более свежие номера моделей часто сокращали, пропуская «80» в начале, поэтому (подразумевается 32-разрядный) x86 соответствует 386, 486 и т. Д. Однако я не знаю ни одного 64-разрядного ЦП с номерами моделей аналогичная структура, оканчивающаяся на «64»; конечно, ни AMD, ни Intel не используют такую ​​схему именования сегодня.
CVn
Хотя x64 - это очень распространенный термин. Случайный пример: microsoft.com/en-us/download/details.aspx?id=42482
Пол Дрейпер,
@PaulDraper В настоящее время это обычное явление в мире Microsoft, но их этимология остается неясной, так что это не так для «x86».
CVn
Microsoft ссылается на x86_64 как AMD64 в своих установщиках
phuclv
7

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

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

od -t x1 -t c foo | head -n 2
Крис Мэйпл
источник
2

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

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

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

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

Квентин Стаффорд-Фрейзер
источник