Es hängt davon ab, ob. Ein für IA-32 kompiliertes Produkt (Intel 32-Bit) kann unter amd64 ausgeführt werden, da Linux unter Intel die Abwärtskompatibilität mit 32-Bit-Anwendungen (mit geeigneter installierter Software) beibehält. Hier ist Ihr code
auf RedHat 7.3 32-Bit-System (ca. 2002, gcc-Version 2.96) kompiliertes und dann das Binärprogramm, das auf ein Centos 7.4 64-Bit-System (ca. 2017) kopiert und ausgeführt wird:
-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
Die alten Versionen von RedHat 7.3 bis Centos 7.4 (im Wesentlichen RedHat Enterprise Linux 7.4) gehören weiterhin zur selben "Distributions" -Familie, weshalb sie wahrscheinlich besser portiert werden können, als wenn sie ab 2002 von einer zufälligen "Linux from scratch" -Installation auf eine andere zufällige Linux-Distribution im Jahr 2018 umsteigen .
Etwas, das für amd64 kompiliert wurde, läuft nicht auf 32-Bit-Versionen von Linux (alte Hardware kennt keine neue Hardware). Dies gilt auch für neue Software, die auf modernen Systemen kompiliert wurde, die auf alten Dingen ausgeführt werden sollen, da Bibliotheken und sogar Systemaufrufe möglicherweise nicht rückwärts portierbar sind und daher Kompilierungstricks oder den Erwerb eines alten Compilers usw. erfordern Kompilieren auf dem alten System. (Dies ist ein guter Grund, virtuelle Maschinen mit alten Dingen in der Nähe zu halten.)
Architektur ist wichtig; amd64 (oder IA-32) unterscheidet sich stark von ARM oder MIPS, so dass nicht erwartet wird, dass die Binärdatei auf einer anderen ausgeführt wird. Auf der Assembly-Ebene wird der main
Abschnitt Ihres Codes auf IA-32 über gcc -S code.c
to kompiliert
main:
pushl %ebp
movl %esp,%ebp
movl $99,%eax
popl %ebp
ret
mit denen ein amd64-System umgehen kann (auf einem Linux-System - OpenBSD unterstützt im Gegensatz zu amd64 keine 32-Bit-Binärdateien; Abwärtskompatibilität mit alten Archs lässt Angreifern Spielraum, z. B. CVE-2014-8866 und Freunden). In der Zwischenzeit wird auf einem Big-Endian-MIPS-System main
Folgendes kompiliert:
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
Womit ein Intel-Prozessor keine Ahnung haben wird, was zu tun ist, und ebenfalls für die Intel-Baugruppe auf MIPS.
Sie könnten möglicherweise QEMU oder einen anderen Emulator verwenden, um Fremdcode auszuführen (möglicherweise sehr, sehr langsam).
Jedoch! Ihr Code ist sehr einfach und hat daher weniger Portabilitätsprobleme als alles andere. Programme verwenden normalerweise Bibliotheken, die sich im Laufe der Zeit geändert haben (glibc, openssl, ...). Für diese muss möglicherweise auch eine ältere Version verschiedener Bibliotheken installiert werden (RedHat setzt zum Beispiel typischerweise "compat" irgendwo in den Paketnamen für solche).
compat-glibc.x86_64 1:2.12-4.el7.centos
oder möglicherweise über ABI-Änderungen (Application Binary Interface) besorgt sein, die sich auf ältere Dinge beziehen, die glibc verwenden, oder auf Änderungen, die in jüngster Zeit aufgrund von C ++ 11 oder anderen C ++ - Versionen vorgenommen wurden. Man könnte auch statisch kompilieren (was die Binärgröße auf der Festplatte stark erhöht), um Bibliotheksprobleme zu vermeiden. Ob dies jedoch durch eine alte Binärdatei geschehen ist, hängt davon ab, ob die alte Linux-Distribution fast alles Dynamische kompiliert hat (RedHat: yes) oder nicht. Auf der anderen Seite können Dinge wie patchelf
dynamische (ELF, aber wahrscheinlich nicht a.out
formatierte) Binärdateien rejiggern , um andere Bibliotheken zu verwenden.
Jedoch! In der Lage zu sein, ein Programm auszuführen, ist eine Sache und damit etwas Nützliches zu tun eine andere. Alte 32-Bit-Binärdateien von Intel können Sicherheitsprobleme aufweisen, wenn sie von einer OpenSSL-Version abhängen, die ein schreckliches und nicht rückportiertes Sicherheitsproblem aufweist, oder wenn das Programm überhaupt nicht mit modernen Webservern (wie den modernen) verhandeln kann Server lehnen die alten Protokolle und Chiffren des alten Programms ab, oder SSH-Protokoll Version 1 wird nicht mehr unterstützt, oder ...