Как запустить 32-битные программы на 64-битной Fedora 17?


10

Хотя пакет «Инструменты разработки Android» (ADT) доступен в виде zip-пакета для «Linux 64 Bit», он содержит следующие требования :

64-разрядные дистрибутивы должны поддерживать 32-разрядные приложения.

И действительно, простое выполнение упакованного затмения в 64-битной системе Fedora 17 приводит к ошибкам, потому что он не может «найти» несколько инструментов разработки, например 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

Ответы:


9

Что касается невозможности найти затмение и adbт. Д., То это потому, что без 32-битных разделяемых библиотек, необходимых для их запуска в системе, они не являются исполняемыми.

Что касается 32-битных библиотек, ситуация довольно проста: вам просто нужно установить соответствующие 32-битные библиотеки. На 64-битной установке fedora 17, которую я имею здесь, основные 64-битные библиотеки находятся в / usr / lib64, а дополнительные 32-битные библиотеки находятся в / 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-битная стандартная библиотека C. Что вы можете сделать, так это просмотреть 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дисплеев: ELF 32-битный исполняемый LSB, Intel 80386 - не имеет ничего общего с эмуляцией ARM - и / usr / bin / adb (из пакета andora-tools fedora) на самом деле доступен как ELF 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.