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

40737
enzom83

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

15

3 ответа на вопрос

18
a CVn

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

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

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

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

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

od -t x1 -t c foo | head -n 2 
1
Quentin Stafford-Fraser

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

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

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

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

Похожие вопросы