Tergantung. Sesuatu yang dikompilasi untuk IA-32 (Intel 32-bit) dapat berjalan pada amd64 karena Linux pada Intel mempertahankan kompatibilitas mundur dengan aplikasi 32-bit (dengan perangkat lunak yang sesuai diinstal). Ini adalah code
kompilasi Anda pada sistem RedHat 7.3 32-bit (sekitar 2002, gcc versi 2.96) dan kemudian biner disalin ke dan dijalankan pada sistem Centos 7.4 64-bit (sekitar 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
RedHat Kuno 7,3 hingga Centos 7.4 (pada dasarnya RedHat Enterprise Linux 7.4) tetap dalam keluarga "distribusi" yang sama, sehingga kemungkinan akan memiliki portabilitas yang lebih baik daripada menginstal dari beberapa "Linux dari awal" instal dari 2002 ke beberapa distribusi Linux acak lainnya pada 2018 .
Sesuatu yang dikompilasi untuk amd64 tidak akan berjalan pada rilis Linux 32-bit saja (perangkat keras lama tidak tahu tentang perangkat keras baru). Ini juga berlaku untuk perangkat lunak baru yang dikompilasi pada sistem modern yang dimaksudkan untuk dijalankan pada hal-hal lama kuno, karena perpustakaan dan bahkan panggilan sistem mungkin tidak mundur portabel, sehingga mungkin memerlukan trik kompilasi, atau mendapatkan kompiler lama dan sebagainya, atau mungkin sebaliknya kompilasi pada sistem lama. (Ini adalah alasan yang baik untuk menjaga mesin virtual dari barang-barang tua kuno di sekitar.)
Arsitektur memang penting; amd64 (atau IA-32) sangat berbeda dari ARM atau MIPS sehingga biner dari salah satu dari mereka tidak akan diharapkan untuk dijalankan pada yang lain. Pada tingkat perakitan, main
bagian kode Anda pada IA-32 mengkompilasi melalui gcc -S code.c
ke
main:
pushl %ebp
movl %esp,%ebp
movl $99,%eax
popl %ebp
ret
dimana sistem amd64 dapat menangani (pada sistem Linux - OpenBSD sebaliknya pada amd64 tidak mendukung binari 32-bit; kompatibilitas ke belakang dengan lengkungan lama memang memberi ruang gerak penyerang ruang gerak, misalnya CVE-2014-8866 dan teman-teman). Sementara itu pada sistem MIPS big-endian main
bukannya mengkompilasi ke:
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
dimana prosesor Intel tidak akan tahu harus melakukan apa, dan juga untuk perakitan Intel pada MIPS.
Anda mungkin dapat menggunakan QEMU atau emulator lain untuk menjalankan kode asing (mungkin sangat, sangat lambat).
Namun! Kode Anda adalah kode yang sangat sederhana, sehingga akan memiliki masalah portabilitas lebih sedikit daripada yang lain; program biasanya menggunakan perpustakaan yang telah berubah dari waktu ke waktu (glibc, openssl, ...); untuk yang satu mungkin juga perlu menginstal versi lama dari berbagai pustaka (RedHat misalnya biasanya menempatkan "compat" di suatu tempat dalam nama paket untuk itu)
compat-glibc.x86_64 1:2.12-4.el7.centos
atau mungkin khawatir tentang perubahan ABI (Application Binary Interface) untuk hal-hal lama yang menggunakan glibc, atau perubahan yang lebih baru karena C ++ 11 atau rilis C ++ lainnya. Kita juga dapat mengkompilasi statis (sangat meningkatkan ukuran biner pada disk) untuk mencoba menghindari masalah pustaka, meskipun apakah beberapa biner lama melakukan ini tergantung pada apakah distribusi Linux lama mengkompilasi sebagian besar semuanya dinamis (RedHat: ya) atau tidak. Di sisi lain, hal-hal seperti patchelf
dapat rejigger dinamis (ELF, tetapi mungkin tidak a.out
memformat) biner untuk menggunakan perpustakaan lain.
Namun! Mampu menjalankan suatu program adalah satu hal, dan benar-benar melakukan sesuatu yang bermanfaat dengannya. Binari Intel 32-bit yang lama mungkin memiliki masalah keamanan jika mereka bergantung pada versi OpenSSL yang memiliki beberapa masalah keamanan yang mengerikan dan tidak di-backport di dalamnya, atau program mungkin tidak dapat bernegosiasi sama sekali dengan server web modern (seperti yang modern server menolak protokol dan sandi lama dari program lama), atau protokol SSH versi 1 tidak lagi didukung, atau ...