Як запустити 32-бітні програми на 64-бітній Fedora 17?


10

Хоча комплект засобів розробки Android (ADT) доступний у вигляді пакету zip для "Linux 64 Bit", він визначає такі вимоги :

64-розрядні дистрибутиви повинні працювати з 32-бітними програмами.

Дійсно, просто запущене пакування затемнення на 64 64-бітній системі Fedora призводить до помилок, оскільки воно не може «знайти» декілька інструментів розробки, наприклад, adbабо aapt:

Помилка при виконанні aapt: Неможливо запустити програму "/ home / juser / local / adt-bundle-linux / sdk / platform-tools / aapt": error = 2, Файлу чи каталогу немає: error = 2, немає такого файлу чи каталогу

Файл "немає такого файлу" вводить в оману, оскільки він є там (під $ HOME / local):

adt-bundle-linux/sdk/platform-tools/aapt

Але я не можу виконати його на оболонці:

~/local $ ./adt-bundle-linux/sdk/platform-tools/aapt 
zsh: no such file or directory: ./adt-bundle-linux/sdk/platform-tools/aapt

Дивлячись на файл

$ file adt-bundle-linux/sdk/platform-tools/aapt
adt-bundle-linux/sdk/platform-tools/aapt: ELF 32-bit LSB executable, Intel 80386,
 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8,
 not stripped

ми бачимо, що це 32 двійкові. І, схоже, моя система (наразі) не здатна запускати 32-бітні програми.

Як це змінити? Як зробити поточну 64-бітну систему Fedora, здатну запускати 32-бітні програми?

(Звичайно, можна також запитати, чому хтось закінчує введення 32-бітових бінарних файлів у двійковий пакет під назвою "Linux 64 bit" ...)


Аналогічне запитання з відповіддю на AskFedora: ask.fedoraproject.org/question/365/…
gertvdijk

Щоб зрозуміти, чому ви отримуєте це повідомлення: Отримання
Жил "SO- перестаньте бути злим"

Відповіді:


9

Що стосується затемнення, яке неможливо знайти adbтощо, це тому, що без 32-бітових спільних бібліотек, необхідних для запуску їх у системі, вони не виконуються.

Що стосується 32-бітових бібліотек, ситуація є досить простою: вам просто потрібно встановити відповідні 32-бітові бібліотеки. У 64-бітної Fedora 17, яку я тут встановив, основні 64-бітні бібліотеки знаходяться в / usr / lib64, а необов'язкові 32-бітні lib - у / usr / lib. Отже, якщо я закликаю lddна sdk / platform-tools / adb:

linux-gate.so.1 =>  (0xf7791000)
librt.so.1 => /lib/librt.so.1 (0xf776c000)
libncurses.so.5 => /lib/libncurses.so.5 (0xf7747000)
libpthread.so.0 => /lib/libpthread.so.0 (0xf772d000)
libstdc++.so.6 => /lib/libstdc++.so.6 (0xf7644000)
libm.so.6 => /lib/libm.so.6 (0xf7618000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xf75fb000)
libc.so.6 => /lib/libc.so.6 (0xf7449000)
/lib/ld-linux.so.2 (0xf7792000)
libdl.so.2 => /lib/libdl.so.2 (0xf7444000)
libtinfo.so.5 => /lib/libtinfo.so.5 (0xf7424000)

Зверніть увагу, це все в / lib, що є символьним посиланням на / usr / lib (не / usr / lib64). Подивіться:

»file /lib/libc.so.6
/lib/libc.so.6: symbolic link to `libc-2.15.so'
»file /lib/libc-2.15.so
/lib/libc-2.15.so: ELF 32-bit LSB shared object [...]

32-бітна стандартна бібліотека С. Що можна зробити, - пройти 32-бітні інструменти sdk і перевірити, з чим вони пов’язані ldd. У мене немає прикладу під рукою, але якщо щось не вистачає, lddповідомляється щось на зразок:

libc.so.6 => ??????

По-перше , для роботи ldd вам знадобиться 32-розрядний завантажувач, який постачається разом з 32-розрядним glibc (без цього ldd називатиме його невиконаним файлом і нічого не скаже):

»yum search glibc
glibc.i686 : The GNU libc libraries
glibc.x86_64 : The GNU libc libraries

Це усічено, але пакет x86_64 - це те, що ви вже маєте; i686 - це 32-розрядна версія. Тому просто встановіть це.

Вам не потрібен жоден пакет «devel», оскільки нічого не збирається. Крім цього, освічені здогадки та yum whatprovides/ yum searchповинні допомогти (дивлячись на список adb, є також 32-бітні версії C ++ lib, ncurses, pthreads та ще декілька речей, яких я не знаю).

Коротка порада щодо використання whatprovides:

»yum whatprovides libtinfo
No matches found.
»yum whatprovides libtinfo.so.5
[2 matches]
»yum whatprovides "*/libtinfo.so.5"
[4 matches]

;)


Ок, я спробую встановити i686 версії бібліотек, що відображаються через ldd. Причина: я не переконаний, закликаючи fileпакетну версію adbдисплеїв: 32-розрядний виконуваний файл LSB, EL 80386 , Intel 80386 - нічого спільного з емуляцією ARM - та / usr / bin / adb (з пакета fedora для android-tools) насправді доступний як 64-розрядний виконуваний файл LSB, x86-64 .
maxschlepzig

Якщо я називаю ldd, adt-bundle-linux/sdk/platform-tools/adbвін відображає "не динамічний виконуваний файл". Щодо PATH - це не проблема - повністю вказати шлях, наприклад, ./adt-bundle-linux/sdk/platform-tools/adbу терміналі не працює (призводить до 'zsh: такого файлу чи каталогу [..]') немає.
maxschlepzig

У вас ще встановлено glibc.i686? Як я вже сказав, вам (швидше за все, потрібен 32-розрядний завантажувач для роботи ldd, і це буде з пакетом glibc. WRT adb - це 32-розрядна арка Intel , це тому, що це ваша система, щось, складене для ARM, там не працюватиме. Однак ті ж 32-розрядні речі можна було б скласти для ARM, і я думаю, частини цього є, коли вони використовуються на пристроях Android. Зізнаюся, може бути не так у тому, що це є необхідністю, але в будь-якому випадку, саме це є, і це насправді не так багато клопоту.
золотинки

WRT шлях, можливо, це не потрібно для затемнення, і (як ви говорите) ви можете отримати ту ж помилку в командному рядку, якщо файл все-таки не вдасться виконати. Просто встановіть губки тощо, і ви дізнаєтесь.
золотинок

2
Немає зв'язку між емулятором, який є 32-бітною програмою, та емуляційною платформою, що має 32-бітний процесор. Емулятор Android насправді заснований на Qemu, який може імітувати будь-який з armv7 (32-розрядний), armv8 (64-розрядний), x86, amd64, mips, mips64 та багато іншого, незалежно від архітектури хоста.
Жил "ТАК - перестань бути злим"

8

Вам потрібно встановити 32-бітний glibc:

# yum install glibc.i686

Це видаляє оманливе повідомлення "немає такого файлу чи каталогу" при спробі виконання 32-бітного двійкового файлу. Завдяки цьому 64-розрядна система Fedora здатна виконувати 32 бітні бінарні файли.

Це також видаляє оманливе повідомлення "не динамічний виконуваний файл" під lddчас виклику ldd32-бітного динамічного виконуваного файлу.

Тепер ви повинні встановити відсутні 32-бітні бібліотеки, під adt-bundle-linux/sdk/platform-toolsякими посилання пов'язані:

# yum install zlib.i686 libstdc++.i686 ncurses-libs.i686 libgcc.i686

Це воно.

Фон

Деякі відомості про те, як отримати вищенаведені назви пакунків Наприклад, дивлячись на вихід

$ ldd adb
linux-gate.so.1 =>  (0xf774f000)
librt.so.1 => /lib/librt.so.1 (0xf7725000)
libncurses.so.5 => not found
libpthread.so.0 => /lib/libpthread.so.0 (0xf770b000)
libstdc++.so.6 => not found
libm.so.6 => /lib/libm.so.6 (0xf76df000)
    [..]

означає, що 2 бібліотеки досі відсутні для adb.

Для кожного "не знайдено" ми повинні шукати назву пакета, наприклад:

$ yum whatprovides '*libstdc++.so.6'
[..]
libstdc++-4.7.2-2.fc17.i686 : GNU Standard C++ Library
[..]

Тепер ми беремо назву базового пакету і додаємо до нього .I686, щоб отримати 32-бітну версію.


Ця відповідь чудова, особливо перша частина - адже встановлення glibc.i686дозволяє lddправильно працювати з бінарними файлами i386.
Крістіян

2

Ви можете встановити необхідний пакет за допомогою:

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