Como determinar se um arquivo binário linux é de 32 ou 64 bits?


24

Um kernel de 32 bits (x86) pode executar apenas código de 32 bits. Um kernel de 64 bits (x86_64) pode executar códigos de 32 e 64 bits.

Gostaria de saber se uma máquina pode executar um executável: em outras palavras, tenho um arquivo binário e preciso executá-lo no Ubuntu de 32 bits, mas não sei se o arquivo binário é executável de 32 bits. .

Eu usei o filecomando, especificando o executável a ser verificado e este foi o resultado retornado:

ELF executável LSB de 64 bits, x86-64, versão 1 (SYSV), vinculado dinamicamente (usa bibliotecas compartilhadas), para GNU / Linux 2.6.24, BuildID [sha1] = 0x7329fa71323a6cd64823c2594338682065cd6e07, sem remoção

Respostas:


29

A resposta para a pergunta no título está logo no início da saída:

ELF 64-bit LSB executável, x86-64

ELF é o formato executável e vinculável , o formato de arquivo executável binário mais comumente usado pelo Linux.

x86-64 é a arquitetura do binário, a versão de 64 bits do conjunto de instruções x86 originalmente introduzida pela AMD . Por motivos que estão além de mim, a Microsoft se refere a ele como "x64", mas é a mesma coisa.

Se você precisar conhecer a arquitetura do próprio kernel, poderá usá-lo uname -mpi. Por exemplo, no meu sistema, isso imprime:

x86_64 desconhecido desconhecido

o que significa que estou executando um kernel x86-64.

Se você estiver interessado na própria CPU, procure /proc/cpuinfodetalhes sobre as CPUs detectadas pelo kernel do Linux.

Um executável de 80x86 de 32 bits é identificado por file, por exemplo:

ELF executável LSB de 32 bits , Intel 80386 , versão 1 (SYSV), vinculado dinamicamente (usa bibliotecas compartilhadas), para GNU / Linux 2.6.8, despojado

que nos diz que é um executável de 32 bits usando o conjunto de instruções Intel 80386 (possivelmente com extensões).

Observe que não é tão simples quanto as arquiteturas de 32 bits e de 64 bits. Por exemplo, o kernel Linux suporta arquiteturas de 32 bits, como Intel 80386, AVR32 , S / 390 e Unicore32 . Do lado de 64 bits, o Linux é utilizável no PA-RISC , x86-64, Itanium e Alpha , entre outros. Porém, nem todas as distribuições fornecem binários para todas as arquiteturas (e duvido que haja distribuições que tenham como alvo todas as arquiteturas de CPU suportadas igualmente). Portanto, se você quiser saber se um determinado binário será executável em um determinado sistema, considere a arquitetura , em vez do tamanho da palavra nativa da CPU.


1
"razões que estão além de mim". Ainda me lembro do dia em que descobri que x64 tinha 64 bits e x86 tinha 32 bits.
Paul Draper

1
@PaulDraper O termo "x86" tem uma etimologia clara; remonta aos CPUs da série 80x86 da Intel, diferenciando-os de seus antecessores como o 8008 ou o 8080, e hoje em dia costuma se referir às variantes capazes de 32 bits (conjunto de instruções IA-32) (80386, 80486, Pentium e mais recentes) ) Esses números de modelo mais recentes costumavam ser abreviados ao se omitir o "80" no início; portanto, o x86 (implícito de 32 bits) corresponde a 386, 486 etc. No entanto, não conheço nenhuma CPU de 64 bits com número de modelo de uma estrutura semelhante que termina em "64"; certamente nem a AMD nem a Intel usam esse esquema de nomes hoje.
a CVn 27/03

Embora x64 seja um termo muito comum. Exemplo aleatório: microsoft.com/en-us/download/details.aspx?id=42482
Paul Draper

@PaulDraper É comum agora no mundo da Microsoft, mas sua etimologia permanece incerto de uma forma que que para "x86" não.
a CVn 28/03

Microsoft refere-se a x86_64 como AMD64 em seus instaladores
phuclv

7

O quinto byte de um arquivo executável binário Linux ( formato ELF, consulte Wikipedia ) é 1 para um executável de 32 bits, 2 para um executável de 64 bits.

Para ver isso em um programa chamado "foo", digite na linha de comando

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

2

Se você quiser evitar o tubo "principal", pode fazer

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

Isso imprimirá 01 se foo for um binário de 32 bits e 02 se for 64. Ainda pode incluir alguns espaços iniciais - vale a pena saber se você está fazendo comparações automatizadas nos resultados.

Se isso for útil em um contêiner básico do Ubuntu Docker onde 'arquivo' não foi instalado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.