Değişir. IA-32 (Intel 32-bit) için derlenen bir şey amd64'te çalışabilir çünkü Linux on Intel, 32-bit uygulamalarla (uygun bir yazılım yüklüyken) geriye dönük uyumluluğu korur. İşte code
RedHat 7.3 32-bit sistemde derlenmiş (yaklaşık 2002, gcc versiyon 2.96) ve sonra binary bir Centos 7.4 64-bit sisteme (2017 yaklaşık) kopyalandı ve çalıştırıldı:
-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
Eski RedHat 7.3 - Centos 7.4 (aslında RedHat Enterprise Linux 7.4) aynı "dağıtım" ailesinde kalıyor, bu yüzden muhtemelen 2002'den 2018'deki bazı rasgele "Linux sıfırdan" yüklemelerine göre daha iyi bir taşınabilirliğe sahip olacak .
Amd64 için derlenen bir şey 32 bit sadece Linux sürümlerinde yayınlanmaz (eski donanım yeni donanım hakkında bir şey bilmiyor). Bu aynı zamanda eski eski şeylerde çalıştırılması amaçlanan modern sistemlerde derlenen yeni yazılımlar için de geçerlidir, çünkü kütüphaneler ve hatta sistem çağrıları geriye doğru taşınabilir olmayabilir, bu nedenle derleme hileleri gerektirebilir veya eski bir derleyici vb. eski sistemde derleme. (Bu, eski eski şeylerin sanal makinelerini etrafta tutmak için iyi bir nedendir.)
Mimarlık önemli; amd64 (veya IA-32), ARM veya MIPS'den büyük ölçüde farklıdır, bu nedenle bunlardan birinden birinin ikili olarak çalıştırılması beklenmez. Montaj düzeyinde main
IA-32 üzerinde kod bölümü aracılığıyla derler gcc -S code.c
için
main:
pushl %ebp
movl %esp,%ebp
movl $99,%eax
popl %ebp
ret
hangi bir amd64 sistemi (Linux sisteminde - OpenBSD amd64 üzerinde tersine başa çıkabilirim değil 32 bitlik ikililer destekler; eski archs ile geriye dönük uyumluluk saldırganlar odası, örneğin deniyordum veriyor CVE-2014-8866 ve arkadaşları). Bu arada büyük bir endian MIPS sisteminde main
bunun yerine aşağıdakileri derler:
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
Hangi bir Intel işlemcisinin ne yapılacağı konusunda hiçbir fikri olmayacak ve aynı şekilde MIPS'deki Intel montajı için de.
Yabancı kodu çalıştırmak için muhtemelen QEMU veya başka bir emülatör kullanabilirsiniz (belki de çok yavaş).
Ancak! Kodunuz çok basit bir koddur, bu nedenle her şeyden daha az taşınabilirlik sorunu olacaktır; programlar genellikle zaman içinde değişen kütüphaneleri kullanır (glibc, openssl, ...); onlar için ayrıca çeşitli kütüphanelerin eski sürümlerini kurmaları gerekebilir (örneğin RedHat, genellikle bunun için paket adında bir yere "uygunluk" koyar)
compat-glibc.x86_64 1:2.12-4.el7.centos
veya muhtemelen glibc kullanan eski usuller için ABI değişiklikleri (Uygulama İkili Arayüzü) veya C ++ 11 veya diğer C ++ sürümleri nedeniyle daha yakın zamanda meydana gelen değişiklikler hakkında endişelenebilirsiniz. Biri aynı zamanda, bazı eski ikili dosyaların eski Linux dağıtımının dinamik olan her şeyi (RedHat: evet) derleyip derlememesine bağlı olmasına bağlı olarak, kütüphane sorunlarından kaçınmaya çalışmak için statik (derleyicideki disk büyüklüğünün artması) derlenebilir. Öte yandan, gibi şeyler diğer kitaplıkları kullanmak için patchelf
dinamik (ELF, ancak muhtemelen a.out
biçimlendirmeyen) ikili olarak kabul edebilir.
Ancak! Bir programı çalıştırabilmek bir şeydir ve aslında onunla birlikte yararlı bir şeyler yapmaktır. Eski 32-bit Intel ikili dosyalarında, bazı korkunç ve desteklenmeyen bir güvenlik sorunu olan OpenSSL sürümüne bağlı olmaları durumunda güvenlik sorunları olabilir veya program, modern web sunucuları ile (örneğin, modern sunucular eski protokolleri ve eski programın şifrelerini reddeder), veya SSH protokolü sürüm 1 artık desteklenmiyor veya ...