Jak uruchomić 32-bitową aplikację w Ubuntu 64-bit?

132

Zainstalowałem Ubuntu 14.04 i bieżący programisty SDK dla Androida, który zawiera 32-bitowe pliki wykonywalne. Odkryłem, że nie mogę uruchomić tych 32-bitowych plików binarnych. Próba uruchomienia ich z bash daje mi błąd:

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

Jest tam jednak:

$ 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. 

W dawnych czasach można było po prostu zainstalować 32-bitowe biblioteki na 64-bitowym Ubuntu, aby uzyskać obsługę 32-bitową, ale wydaje się, że to już nie działa.

Jak uruchomić 32-bitowe aplikacje na 64-bitowym Ubuntu 14.04?

Thomas Stuefe
źródło

Odpowiedzi:

186

Aby uruchomić plik wykonywalny 32-bitowego na 64-bitowy multi-architektura systemu Ubuntu, trzeba dodać i386architekturę i zainstalować trzy pakiety biblioteczne libc6:i386, libncurses5:i386oraz libstdc++6:i386:

sudo dpkg --add-architecture i386

Lub jeśli używasz Ubuntu 12.04 LTS (Precise Pangolin) lub niżej, użyj tego:

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

Następnie:

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

Jeśli się nie powiedzie, również

sudo apt-get install multiarch-support

Po wykonaniu tych kroków powinieneś być w stanie uruchomić aplikację 32-bitową:

./example32bitprogram
Avinash Raj
źródło
@AvinashRaj To mi pomogło! Jakie jest jednak ostatnie polecenie „sudo ./adb”?
Marcel
1
Wykonuje 32-bitowy plik binarny adb, który był obecny w bieżącym katalogu.
Avinash Raj
1
aby uzyskać aapt działający na Ubuntu 14.04, musiałem również zainstalować lib32z1, ale zauważyłem, że ściągnął libc6-i386 (rozróżnienie, zauważ myślnik, a nie dwukropek).
Chris Betti
Zrobiłem swoje kroki, libc6:i386, libncurses5:i386, libstdc++6:i386to najnowsza wersja i ustawić ręcznie zainstalowany. Ale potem mówi: „ Soma packages could not be installed.This may mean you have requested impossible situation or you are using unstable distribution ...” i niespełnione zależności: libstdc++6-4.4-dev:i386zależy g++-4.4:i386(nie zostanie zainstalowany). konflikty: libstdc++6-4.4-dbg:i386... i inne konflikty dotyczące libstdc++6-4.4/6/7itp. Co jest nie tak, czy powinienem zostawić to, co jest teraz?
Fredrick Gauss
@FredrickGauss wejdź tutaj .
Avinash Raj
9

„Brak takiego pliku lub katalogu” może pojawić się, gdy masz plik binarny, ale brakuje w nim niektórych bibliotek. Jeśli zainstalujesz build-essentialpakiet, będziesz mieć ldddostępne polecenie. To polecenie ldd ./adb | grep notpokaże, jakich bibliotek brakuje. Wystarczy zainstalować te biblioteki w i386 arch za pomocą apt. W ten sposób: apt-get install libmissing:i386 Uwaga : niektóre błędne pakiety będą próbowały usunąć jodły w wersji 64-bitowej.

Barafu Albino
źródło
Dziękuję, to wyjaśnia dziwny komunikat o błędzie. Najpierw byłem zdezorientowany, dlaczego bash dałby mi ten błąd (zamiast jakiegoś błędu wynikającego z procesu potomnego, który pomija biblioteki), ale teraz wydaje mi się, że bash po prostu widzi, że exec (3) zwraca ENOENT i drukuje to.
Thomas Stuefe
5

A jeśli chcesz użyć „adb”, jest do tego pakiet:

sudo apt-get install android-tools-adb

Oraz o bibliotekach 32-bitowych - tylko:

sudo apt-add-architecture i386

to wystarczy.

Aastefanov
źródło
Dzięki za podpowiedź, ale chciałem użyć narzędzi Androida pobranych z Google, a nie tych z repozytoriów Ubuntu. Nie jestem również pewien co do kompletności tego pakietu.
Thomas Stuefe
Repozytoria Ubuntu muszą mieć nową wersję. Pakiet zawiera tylko adb. Jeśli chcesz Fastboot - jest też pakiet :)
aastefanov
3

Oprócz doskonałej odpowiedzi Zanny i Avinash Raj musiałem również zainstalować gcc-multilib:

sudo apt-get install gcc-multilib

Możliwe, że dlatego, że chciałem uruchomić starą wersję gcc na 64-bit.

użytkownik2144067
źródło