Tue, 25 Nov 2025 00:00:00 +0100
linux, software, sysadmin, troubleshoot

32bit-Programme auf 64bit-Linux

Es ist noch gar nicht lange her, dass ich auf meinen Linux-Rechnern ausschließlich 32bit-Programme verwendete. Ich hab auch noch ein paar Geräte, deren Prozessor nur mit 32bit arbeitet.

Und doch laufen heutzutage auf den meisten Geräten, mit denen ich zu tun habe, fast ausschließlich 64bit-Programme. Zwar kann Linux noch immer mit dem kleineren Format umgehen, doch das ist selten nötig und meist muss ich dafür zunächst ein paar zusätzliche Bibliotheken installieren.

Doch erstmal muss ich wissen, dass ich es mit einem 32bit-Programm zu tun habe. Im konkreten Fall ging es um ein Binärprogramm, das aus mehr oder weniger vertrauenswürdiger Quelle stammte (der VPN-Client von Checkpoint für Linux) und partout nicht in der dafür bereitgestellten Linux-VM laufen wollte.

Die Fehlermeldungen waren etwas missverständlich, so dass ich nicht gleich erkannte, was los war:

$ ./launcher
sh: 1: ./launcher: not found
$ strace -f ./launcher
execve("./launcher", ["./launcher"], 0x7ffc6b8b0a08 /* 31 vars */) = -1 ENOENT (No such file or directory)
strace: exec: No such file or directory
+++ exited with 1 +++
$ ls -l ./launcher
-rwxrwxr-x 1 vboxuser vboxuser 39144 Nov 16 15:57 ./launcher

Mit file wurde es dann offensichtlich:

$ file ./launcher
./launcher: ELF 32-bit LSB pie executable, Intel 80386, version 1 (SYSV), ...

Das ist ein 32bit-Binärprogramm. Natürlich läuft es auf Linux, mit den entsprechenden Bibliotheken:

$ sudo apt install libc6-i386
$ ./launcher
...

Wie kann ich sonst noch herausbekommen, was mit einem Binärprogramm los ist, welches partout nicht starten will, wenn file nicht installiert ist.

Das Programm ldd aus libc-bin, das normalerweise anzeigt, welche dynamischen Bibliotheken ein Programm benötigt, hilft hier leider nicht. Abgesehen davon, dass man ldd nur auf Programme aus vertrauenswürdigen Quellen ansetzen sollte. Die Handbuchseite erklärt den Grund dafür.

$ ldd main.out
    not a dynamic executable

Das Programm objdump aus 'binutils' hingegen kann hier weiterhelfen:

$ objdump -p ./launcher

./launcher:     file format elf32-i386
...

Ein 32bit Binärprogramm kompilieren

Normalerweise will ich auf einem 64bit-System keine 32bit-Programme haben, weil diese zusätzliche Bibliotheken benötigen und die Vorteile der 64bit-CPU nicht ausnutzen können.

Bin ich jedoch auf ein Programm angewiesen, das mit 64bit nicht korrekt läuft, weil es nicht dafür ausgelegt ist und der Aufwand für die Portierung zu groß ist, kann ich es mit den passenden Bibliotheken für 32bit übersetzen:

$ sudo apt-get install build-essential libc6-dev-i386
$ cat > main.c <<EOF
#include <stdio.h>

int main(void) {
    puts("hello world");
    return 0;
}
EOF
$ gcc main.c -o main.out -m32
$ ./main.out
hello world
$ file main.out
./main.out: ELF 32-bit LSB pie executable, Intel 80386, version 1 (SYSV), ...

Benötigt das Programm zusätzliche Bibliotheken, außer den in Libc vorhandenen, muss ich diese ebenfalls aus den Quellen übersetzen.

Will ich dann so ein Programm auf anderen 64bit-Systemen einsetzen, muss ich daran denken, auch dort die passenden Laufzeitbibliotheken zu installieren.