Comment exécuter des programmes 32 bits sur Fedora 17 64 bits?

10

Bien que l'ensemble d'outils de développement Android (ADT) soit disponible sous forme de package zip pour «Linux 64 bits», il énonce les exigences suivantes :

Les distributions 64 bits doivent être capables d'exécuter des applications 32 bits.

Et en effet, le simple fait d'exécuter l'éclipse packagée sur un système Fedora 17 64 bits entraîne des erreurs, car il ne peut pas «trouver» plusieurs outils de développement, par exemple adbou aapt:

Erreur lors de l'exécution de aapt: impossible d'exécuter le programme "/ home / juser / local / adt-bundle-linux / sdk / platform-tools / aapt": error = 2, No such file or directory: error = 2, No such file or directory

Le 'no such file' est trompeur car il est là (sous $ HOME / local):

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

Mais je ne peux pas l'exécuter sur le shell:

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

Regarder le fichier

$ 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

on voit que c'est un 32 binaire. Et il semble que mon système (actuellement) ne soit pas capable d'exécuter des applications 32 bits.

Comment puis-je changer cela? Comment créer un système Fedora 64 bits actuel capable d'exécuter des applications 32 bits?

(Bien sûr, on pourrait aussi se demander pourquoi quelqu'un finit par mettre des binaires 32 bits dans un paquet binaire appelé 'Linux 64 bits' ...)

maxschlepzig
la source
Question similaire avec réponse sur AskFedora: ask.fedoraproject.org/question/365/…
gertvdijk
Pour comprendre pourquoi vous obtenez ce message: Obtenir un
Gilles «SO- arrête d'être mauvais»

Réponses:

9

En ce qui concerne eclipse ne pouvant pas trouver adb, etc., cela parce que sans les bibliothèques partagées 32 bits nécessaires pour les exécuter sur le système, elles ne sont pas exécutables.

En ce qui concerne les bibliothèques 32 bits, la situation est assez simple: il vous suffit d'installer les bibliothèques 32 bits appropriées. Sur l'installation de fedora 17 64 bits que j'ai ici, les bibliothèques primaires 64 bits sont dans / usr / lib64 et les bibliothèques 32 bits facultatives sont dans / usr / lib. Donc, si j'appelle lddsur 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)

Notez qu'ils sont tous dans / lib, qui est un lien symbolique vers / usr / lib (pas / usr / lib64). Regardez:

»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 [...]

Une bibliothèque C standard 32 bits. Ce que vous pouvez faire, c'est passer par les outils sdk 32 bits et vérifier pour voir avec quoi ils sont liés ldd. Je n'ai pas d'exemple sous la main, mais s'il manque lddquelque chose, quelque chose comme:

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

Tout d'abord , pour que ldd fonctionne, vous aurez besoin du chargeur 32 bits fourni avec la glibc 32 bits (sans cela, ldd l'appellera un fichier non exécutable et ne vous dira rien):

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

C'est tronqué, mais le package x86_64 est ce que vous avez déjà; l'i686 est la version 32 bits. Il suffit donc d'installer cela.

Vous n'avez besoin d'aucun des packages 'devel', car rien n'est compilé. Au-delà de cela, des suppositions éclairées et yum whatprovides/yum search devraient aider (en consultant la liste pour adb, il existe également des versions 32 bits de la bibliothèque C ++, ncurses, pthreads et quelques petites choses que je ne sais pas).

Petit conseil sur l'utilisation whatprovides:

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

;)

boucle d'or
la source
ok, je vais essayer d'installer les versions i686 des bibliothèques affichées via ldd. Pour la raison: je ne suis pas convaincu, faisant appel fileà la version bundle des adbécrans: exécutable ELF 32 bits LSB, Intel 80386 - rien à voir avec l'émulation ARM - et / usr / bin / adb (du package fedora android-tools) est actuellement disponible en tant qu'exécutable ELF 64 bits LSB, x86-64 .
maxschlepzig
Si j'appelle ldd, adt-bundle-linux/sdk/platform-tools/adbil affiche «pas un exécutable dynamique». Concernant le PATH - ce n'est pas le problème - spécifier complètement le chemin par exemple ./adt-bundle-linux/sdk/platform-tools/adbdans un terminal ne fonctionne pas (résulte en 'zsh: aucun fichier ou répertoire [..]').
maxschlepzig
Avez-vous déjà glibc.i686 installé? Comme je l'ai dit, vous avez (probablement) besoin d'un chargeur 32 bits pour que ldd fonctionne, et ce sera avec le paquet glibc. WRT adb étant une arche Intel 32 bits , c'est parce que c'est votre système, quelque chose compilé pour ARM ne fonctionnera pas là-bas. Cependant, les mêmes choses 32 bits pourraient être compilées pour ARM, et j'imagine que certaines parties le sont lorsqu'elles sont utilisées sur des appareils Android. J'avoue que c'est peut-être faux de dire que c'est la nécessité, mais en tout cas, c'est ce qui est disponible, et ce n'est vraiment pas si compliqué.
goldilocks
WRT le chemin d'accès, il n'est peut-être pas nécessaire pour l'éclipse et (comme vous le dites), vous pouvez obtenir la même erreur sur la ligne de commande si le fichier ne peut pas être exécuté de toute façon. Installez simplement les bibliothèques, etc., et vous le découvrirez.
goldilocks
2
Il n'y a aucune relation entre l'émulateur étant un programme 32 bits et la plate-forme émulée ayant un processeur 32 bits. L'émulateur Android est en fait basé sur Qemu, qui peut émuler n'importe lequel des armv7 (32 bits), armv8 (64 bits), x86, amd64, mips, mips64 et bien d'autres, quelle que soit l'architecture de l'hôte.
Gilles 'SO- arrête d'être méchant'
8

Vous devez installer la glibc 32 bits:

# yum install glibc.i686

Cela supprime le message trompeur «aucun fichier ou répertoire» lorsque vous essayez d'exécuter un binaire 32 bits. Avec cela, le système Fedora 64 bits est capable d'exécuter des binaires 32 bits.

Cela supprime également le message trompeur «pas un exécutable dynamique» lddlors de l'appel lddà un exécutable dynamique 32 bits.

Maintenant, vous devez installer les bibliothèques 32 bits manquantes avec lesquelles les binaires adt-bundle-linux/sdk/platform-toolssont liés:

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

C'est tout.

Contexte

Quelques informations sur la façon de dériver les noms de package ci-dessus. Par exemple, en regardant la sortie de

$ 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)
    [..]

signifie que 2 bibliothèques sont toujours manquantes pour adb.

Pour chaque «non trouvé», nous devons rechercher le nom du package, par exemple:

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

Maintenant, nous prenons le nom de base du package et y ajoutons «.i686» pour obtenir la version 32 bits.

maxschlepzig
la source
Cette réponse est excellente, en particulier la première partie - en effet l'installation glibc.i686 permet lddde fonctionner correctement avec les binaires i386.
Krystian
2

Vous pouvez installer le package nécessaire avec:

sudo yum install redhat-lsb.i686
xwindows
la source