Як запустити 32-розрядну програму в 64-розрядному Ubuntu?


132

Я встановив Ubuntu 14.04 та поточний SDK для розробки Android, який містить 32-бітні виконувані файли. Я виявив, що не можу запускати ці 32-бітні бінарні файли. Спроба запустити їх з bash дає мені помилку:

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

Це все-таки:

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

За старих часів можна було просто встановити 32-бітні бібліотеки на 64-бітній Ubuntu, щоб отримати 32-бітну підтримку, але, схоже, це вже не працює.

Як запустити 32-розрядні програми на 64-розрядному Ubuntu 14.04?


Відповіді:


186

Для того, щоб запустити 32-бітний виконуваний файл на 64-бітну мультіархітектурной системі Ubuntu, ви повинні додати i386архітектуру і встановити три бібліотеку пакетів libc6:i386, libncurses5:i386і libstdc++6:i386:

sudo dpkg --add-architecture i386

Або якщо ви використовуєте Ubuntu 12.04 LTS (Precision Pangolin) або нижче, використовуйте це:

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

Тоді:

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

Якщо не вдалося, зробіть і те

sudo apt-get install multiarch-support

Після цих кроків ви зможете запустити 32-розрядний додаток:

./example32bitprogram

@AvinashRaj Це мені допомогло! Однак яка остання команда "sudo ./adb" повинна зробити насправді?
Марсель

1
Він виконує 32-бітний adb бінарний файл, який був присутній у поточному каталозі.
Авінаш Радж

1
щоб почати працювати над Ubuntu 14.04, мені довелося також встановити lib32z1, але помітив, що він потягнувся в libc6-i386 (відмінність, помічайте дефіс, а не двокрапка).
Кріс Бетті

Я зробив свої кроки, libc6:i386, libncurses5:i386, libstdc++6:i386найновіша версія і встановити вручну встановити. Але після цього він говорить: " Soma packages could not be installed.This may mean you have requested impossible situation or you are using unstable distribution ..." і невиконані залежності: libstdc++6-4.4-dev:i386залежить g++-4.4:i386(не буде встановлено). конфлікти: libstdc++6-4.4-dbg:i386... та інші конфлікти з приводу libstdc++6-4.4/6/7тощо. Що не так чи слід залишити його таким, яким він є?
Фредрік Гаус

@FredrickGauss потрапляє сюди .
Авінаш Радж

9

"Немає такого файлу чи каталогу" може з'являтися, коли у вас є свій двійковий файл, але у ньому відсутні деякі бібліотеки. Якщо ви встановите build-essentialпакет, у вас буде lddдоступна команда. Ця команда ldd ./adb | grep notпокаже, які бібліотеки відсутні. Просто встановіть ці бібліотеки в арку i386 з apt. Ось так: apt-get install libmissing:i386 Остерігайтеся, деякі пакети з помилками намагаються видалити 64-бітову елі версії.


Дякую, це пояснило б дивне повідомлення про помилку. Мене спочатку збентежило, чому bash дасть мені цю помилку (замість того, щоб якась помилка виходила з дочірнього процесу, який пропускає бібліотеки), але тепер я здогадуюсь, що bash просто бачить exec (3), що повертається ENOENT, і роздруковує це.
Thomas Stuefe

5

І якщо ви хочете використовувати "adb", є пакет для нього:

sudo apt-get install android-tools-adb

А про 32-бітні бібліотеки - лише:

sudo apt-add-architecture i386

буде достатньо


Дякую за пораду, але я хотів використовувати інструменти для Android, завантажені з google, а не ті, які використовуються в репості Ubuntu. Я також не впевнений у повноті цього пакету.
Thomas Stuefe

У сховищах Ubuntu повинна бути нова версія. Пакет містить лише adb. Якщо ви хочете швидкої завантаження - є і пакет для цього :)
aastefanov

3

Крім відмінної відповіді Занни та Авінаша Радж, мені довелося також встановити gcc-multilib:

sudo apt-get install gcc-multilib

Можливо, це тому, що я хотів запустити стару версію gcc на 64-бітній.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.