Wie starte ich eine 32-Bit-App in Ubuntu 64-Bit?

132

Ich habe Ubuntu 14.04 und das aktuelle Android-Entwicklungs-SDK installiert, das ausführbare 32-Bit-Dateien enthält. Ich habe festgestellt, dass ich diese 32-Bit-Binärdateien nicht ausführen kann. Der Versuch, sie von der Bash aus zu starten, gibt mir einen Fehler:

$ ./adb
bash: ./adb: No such file or directory

Es ist jedoch da:

$ ls -al ./adb
-rwxrwxrwx 1 thomas thomas 1231255 Jan 17 13:31 ./adb
$ file ./adb
./adb: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped. Same symptom for all the other 32-bit tools in the Android SDK. 

Früher konnte man 32-Bit-Bibliotheken auf 64-Bit-Ubuntu installieren, um 32-Bit-Unterstützung zu erhalten, aber das scheint nicht mehr zu funktionieren.

Wie kann ich 32-Bit-Apps auf einem 64-Bit-Ubuntu 14.04 ausführen?

Thomas Stuefe
quelle

Antworten:

186

Um eine 32-Bit - ausführbare Datei auf einem 64-Bit Multi-Architektur Ubuntu - System ausführen, müssen Sie die Add - i386Architektur und installieren Sie die drei Bibliothekspakete libc6:i386, libncurses5:i386und libstdc++6:i386:

sudo dpkg --add-architecture i386

Wenn Sie Ubuntu 12.04 LTS (Precise Pangolin) oder niedriger verwenden, verwenden Sie Folgendes:

echo "foreign-architecture i386" > /etc/dpkg/dpkg.cfg.d/multiarch

Dann:

sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386

Wenn dies fehlschlägt, tun Sie dies auch

sudo apt-get install multiarch-support

Nach diesen Schritten sollten Sie in der Lage sein, die 32-Bit-Anwendung auszuführen:

./example32bitprogram
Avinash Raj
quelle
@AvinashRaj Das hat mir geholfen! Was soll der letzte Befehl "sudo ./adb" eigentlich tun?
Marcel
1
Es führt die 32-Bit-ADB-Binärdatei aus, die im aktuellen Verzeichnis vorhanden war.
Avinash Raj
1
Um aapt auf Ubuntu 14.04 zum Laufen zu bringen, musste ich es ebenfalls installieren lib32z1, bemerkte aber, dass es in libc6-i386 gezogen wurde (Unterscheidung, beachte den Bindestrich, nicht den Doppelpunkt).
Chris Betti
Ich habe deine Schritte, libc6:i386, libncurses5:i386, libstdc++6:i386sind neueste Version und auf manuell installiert. Aber danach heißt es: " Soma packages could not be installed.This may mean you have requested impossible situation or you are using unstable distribution ..." und nicht erfüllte Abhängigkeiten: libstdc++6-4.4-dev:i386abhängig g++-4.4:i386(wird nicht installiert). Konflikte: libstdc++6-4.4-dbg:i386... und andere Konflikte um libstdc++6-4.4/6/7etc. Was ist falsch oder soll ich es so lassen, wie es jetzt ist?
Fredrick Gauss
@FredrickGauss kommen hier rein .
Avinash Raj
9

"Keine solche Datei oder Verzeichnis" erscheint möglicherweise, wenn Sie Ihre Binärdatei haben, aber es fehlen einige Bibliotheken. Wenn Sie das build-essentialPaket installieren , steht Ihnen ein lddBefehl zur Verfügung. Dieser Befehl ldd ./adb | grep notzeigt Ihnen, welche Bibliotheken fehlen. Installieren Sie diese Bibliotheken einfach in i386 arch mit apt. So: apt-get install libmissing:i386 Vorsicht, einige Buggy-Pakete versuchen, 64-Bit-Versionen zu löschen.

Barafu Albino
quelle
Danke, das würde die seltsame Fehlermeldung erklären. Ich war zuerst verwirrt, warum Bash mir diesen Fehler geben würde (anstatt eines Fehlers, der deutlicher aus dem untergeordneten Prozess hervorgeht, der die Bibliotheken übersieht), aber jetzt schätze ich, sieht Bash nur, dass exec (3) ENOENT zurückgibt und diesen ausgibt.
Thomas Stuefe
5

Und wenn Sie "adb" verwenden möchten, gibt es ein Paket dafür:

sudo apt-get install android-tools-adb

Und etwa 32-Bit-Bibliotheken - nur:

sudo apt-add-architecture i386

wird genug sein.

aastefanov
quelle
Vielen Dank für den Tipp, aber ich wollte die von Google heruntergeladenen Android-Tools verwenden, nicht die in den Ubuntu-Repos. Ich bin mir auch nicht sicher, ob dieses Paket vollständig ist.
Thomas Stuefe
Ubuntu-Repositories müssen die neue Version haben. Das Paket enthält nur ADB. Wenn Sie Fastboot wollen - es gibt auch ein Paket dafür :)
aastefanov
3

Zusätzlich zu der hervorragenden Antwort von Zanna und Avinash Raj musste ich auch gcc-multilib installieren:

sudo apt-get install gcc-multilib

Möglicherweise liegt das daran, dass ich eine alte gcc-Version auf 64bit ausführen wollte.

user2144067
quelle