To zależy. Coś skompilowanego dla IA-32 (Intel 32-bit) może działać na amd64, ponieważ Linux na Intel zachowuje zgodność wsteczną z aplikacjami 32-bitowymi (z zainstalowanym odpowiednim oprogramowaniem). Oto twoja code
kompilowana na 32-bitowym systemie RedHat 7.3 (około 2002, gcc wersja 2.96), a następnie plik binarny skopiowany i uruchomiony na 64-bitowym systemie Centos 7.4 (około 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
Starożytny RedHat 7.3 do Centos 7.4 (zasadniczo RedHat Enterprise Linux 7.4) pozostaje w tej samej rodzinie „dystrybucji”, więc prawdopodobnie będzie miał lepszą przenośność niż przejście z jakiejś losowej instalacji „Linux od zera” od 2002 r. Do innej losowej dystrybucji Linuksa w 2018 r. .
Coś skompilowanego dla amd64 nie działałoby na 32-bitowych wersjach systemu Linux (stary sprzęt nie wie o nowym sprzęcie). Odnosi się to również do nowego oprogramowania skompilowanego na nowoczesnych systemach, które mają być uruchamiane na starych, starych rzeczach, ponieważ biblioteki, a nawet wywołania systemowe mogą nie być przenośne wstecz, więc mogą wymagać sztuczek kompilacyjnych lub uzyskania starego kompilatora i tak dalej, a może zamiast tego kompilacja na starym systemie. (To dobry powód, aby trzymać maszyny wirtualne starych, starych rzeczy).
Architektura ma znaczenie; amd64 (lub IA-32) znacznie różni się od ARM lub MIPS, więc nie można oczekiwać, że binarny jeden z nich będzie działał na innym. Na poziomie montażowego main
sekcji kodu na IA-32 poprzez kompiluje gcc -S code.c
się
main:
pushl %ebp
movl %esp,%ebp
movl $99,%eax
popl %ebp
ret
z którymi system amd64 może sobie poradzić (w systemie Linux - w przeciwieństwie do OpenBSD na amd64 nie obsługuje 32-bitowych plików binarnych; wsteczna kompatybilność ze starymi architekturami daje atakującym swobodę , np. CVE-2014-8866 i przyjaciele). Tymczasem w systemie big-endian MIPS main
zamiast tego kompiluje się w celu:
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
z którym procesor Intel nie będzie miał pojęcia, co z tym zrobić, a także w przypadku zestawu Intel na platformie MIPS.
Możesz użyć QEMU lub innego emulatora do uruchomienia obcego kodu (być może bardzo, bardzo powoli).
Jednak! Twój kod jest bardzo prostym kodem, więc będzie mniej problemów z przenośnością niż cokolwiek innego; programy zwykle korzystają z bibliotek, które zmieniły się w czasie (glibc, openssl, ...); dla tych może być również konieczne zainstalowanie starszych wersji różnych bibliotek (na przykład RedHat zazwyczaj umieszcza „kompatybilność” gdzieś w nazwie pakietu dla takich)
compat-glibc.x86_64 1:2.12-4.el7.centos
lub ewentualnie martwić się zmianami ABI (Application Binary Interface) o stare sposoby używające glibc lub nowszymi zmianami spowodowanymi C ++ 11 lub innymi wydaniami C ++. Można również skompilować statyczne (znacznie zwiększając rozmiar pliku binarnego na dysku), aby uniknąć problemów z biblioteką, chociaż to, czy zrobił to jakiś stary plik binarny, zależy od tego, czy stara dystrybucja Linuksa kompiluje większość wszystkiego dynamicznie (RedHat: tak), czy nie. Z drugiej strony, takie rzeczy jak patchelf
ponowne uruchamianie dynamicznych a.out
plików binarnych (ELF, ale prawdopodobnie nie formatowanie) w celu korzystania z innych bibliotek.
Jednak! Możliwość uruchomienia programu to jedno, a właściwie robienie z nim czegoś pożytecznego. Stare 32-bitowe pliki binarne Intela mogą mieć problemy z bezpieczeństwem, jeśli zależą od wersji OpenSSL, która zawiera jakieś okropne i nieobsługiwane problemy bezpieczeństwa, lub program może nie być w stanie negocjować z nowoczesnymi serwerami WWW (jako nowoczesne serwery odrzucają stare protokoły i szyfry starego programu) lub protokół SSH wersja 1 nie jest już obsługiwany lub ...