Як визначити, чи є бінарний файл Linux 32-розрядним чи 64-розрядним?


24

32-бітове ядро ​​(x86) може запускати лише 32-бітний код. 64-бітове ядро ​​(x86_64) може запускати як 32-бітний, так і 64-бітний код.

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

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

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

Відповіді:


29

Відповідь на запитання в заголовку є прямо на початку виходу:

64-бітний LSB - версію ELF , 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), динамічно пов'язані (використання спільно LIBS), для 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 , серед інших. Однак, не всі дистрибутиви надають бінарні файли для всіх архітектур (але, я сумніваюся, існують дистрибутиви, які однаково орієнтовані на всі підтримувані архітектури CPU). Отже, якщо ви хочете знати, чи буде виконаний даний бінарний файл у даній системі, вам потрібно врахувати архітектуру , а не розмір рідного слова процесора.


1
"причини, які поза мною". Я все ще пам’ятаю день, коли я дізнався, що x64 - 64 біт, а x86 - 32 біт.
Пол Дрейпер

1
@PaulDraper Термін "x86" має чітку етимологію; він датується процесорами серії 80x86 від Intel, відрізняючи їх від своїх попередників, таких як 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, де файл не був встановлений.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.