Depende. Algo compilado para IA-32 (Intel de 32 bits) pode ser executado no amd64, pois o Linux na Intel mantém a compatibilidade retroativa com aplicativos de 32 bits (com o software adequado instalado). Aqui está o seu code
compilado no sistema RedHat 7.3 de 32 bits (por volta de 2002, gcc versão 2.96) e o binário copiado para e executado em um sistema Centos 7.4 de 64 bits (por volta de 2017):
-bash-4.2$ file code
code: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
-bash-4.2$ ./code
-bash: ./code: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
-bash-4.2$ sudo yum -y install glibc.i686
...
-bash-4.2$ ./code ; echo $?
99
O RedHat 7.3 antigo para o Centos 7.4 (essencialmente RedHat Enterprise Linux 7.4) permanece na mesma família "distribuição", portanto, provavelmente terá portabilidade melhor do que passar de uma instalação aleatória do "Linux a partir do zero" de 2002 para outra distribuição aleatória do Linux em 2018 .
Algo compilado para amd64 não seria executado apenas em versões de 32 bits do Linux (o hardware antigo não sabe sobre o novo hardware). Isso também é válido para novos softwares compilados em sistemas modernos destinados a serem executados em coisas antigas, já que bibliotecas e até chamadas de sistema podem não ser portáveis para trás, portanto podem exigir truques de compilação ou obter um compilador antigo e assim por diante, ou possivelmente em vez disso. compilando no sistema antigo. (Esse é um bom motivo para manter as máquinas virtuais antigas e antigas).
Arquitetura importa; O amd64 (ou IA-32) é muito diferente do ARM ou MIPS, portanto, não se espera que o binário de um deles seja executado em outro. No nível do assembly, a main
seção do seu código no IA-32 compila via gcc -S code.c
para
main:
pushl %ebp
movl %esp,%ebp
movl $99,%eax
popl %ebp
ret
com o qual um sistema amd64 pode lidar (em um sistema Linux - o OpenBSD, por outro lado, no amd64 não suporta binários de 32 bits; a compatibilidade retroativa com arcos antigos oferece aos atacantes espaço de manobra, por exemplo, CVE-2014-8866 e amigos). Enquanto isso, em um sistema MIPS big endian, main
compila para:
main:
.frame $fp,8,$31
.mask 0x40000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-8
sw $fp,4($sp)
move $fp,$sp
li $2,99
move $sp,$fp
lw $fp,4($sp)
addiu $sp,$sp,8
j $31
nop
com o qual um processador Intel não tem idéia do que fazer e da mesma forma para o conjunto Intel no MIPS.
Você poderia usar o QEMU ou algum outro emulador para executar código estrangeiro (talvez muito, muito lentamente).
Contudo! Seu código é muito simples, portanto, haverá menos problemas de portabilidade do que qualquer outra coisa; programas normalmente fazem uso de bibliotecas que foram alteradas ao longo do tempo (glibc, openssl, ...); para aqueles que também precisam instalar versões mais antigas de várias bibliotecas (o RedHat, por exemplo, geralmente coloca "compat" em algum lugar do nome do pacote)
compat-glibc.x86_64 1:2.12-4.el7.centos
ou possivelmente se preocupe com as alterações ABI (Application Binary Interface) para coisas antigas que usam glibc ou alterações mais recentes devido ao C ++ 11 ou a outras versões do C ++. Também se pode compilar estático (aumentando muito o tamanho do binário no disco) para tentar evitar problemas de biblioteca, embora se algum binário antigo fizesse isso dependesse se a distribuição antiga do Linux estava compilando quase tudo dinâmico (RedHat: yes) ou não. Por outro lado, coisas como patchelf
podem reativar a.out
binários dinâmicos (ELF, mas provavelmente não formatados) para usar outras bibliotecas.
Contudo! Ser capaz de executar um programa é uma coisa e, na verdade, fazer algo útil com outra. Os binários antigos da Intel de 32 bits podem ter problemas de segurança se dependerem de uma versão do OpenSSL que contenha algum problema de segurança horrível e não suportado, ou o programa talvez não consiga negociar com os servidores da Web modernos (como os modernos servidores rejeitam os antigos protocolos e cifras do programa antigo), ou o protocolo SSH versão 1 não é mais suportado ou ...