¿Cómo ejecutar programas de 32 bits en Fedora 17 de 64 bits?

10

Aunque el paquete de herramientas de desarrollo de Android (ADT) está disponible como un paquete zip para 'Linux 64 Bit', establece los siguientes requisitos :

Las distribuciones de 64 bits deben ser capaces de ejecutar aplicaciones de 32 bits.

Y de hecho, solo ejecutar el eclipse empaquetado en un sistema Fedora 17 de 64 bits produce errores, porque no puede 'encontrar' varias herramientas de desarrollo, por ejemplo adbo aapt:

Error al ejecutar aapt: no se puede ejecutar el programa "/ home / juser / local / adt-bundle-linux / sdk / platform-tools / aapt": error = 2, No existe tal archivo o directorio: error = 2, No existe dicho archivo o directorio

El 'no existe ese archivo' es engañoso porque está allí (debajo de $ HOME / local):

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

Pero no puedo ejecutarlo en el shell:

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

Mirando el archivo

$ 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

vemos que es un binario 32. Y parece que mi sistema (actualmente) no es capaz de ejecutar aplicaciones de 32 bits.

¿Cómo cambio eso? ¿Cómo hago para que un sistema Fedora de 64 bits actual pueda ejecutar aplicaciones de 32 bits?

(Por supuesto, también se podría preguntar por qué alguien termina colocando binarios de 32 bits en un paquete binario llamado 'Linux 64 bit' ...)

maxschlepzig
fuente
Pregunta similar con respuesta en AskFedora: ask.fedoraproject.org/question/365/…
gertvdijk
Para entender por qué recibe este mensaje: Recibe el
Gilles 'SO- deja de ser malvado'

Respuestas:

9

Con respecto a que eclipse no puede encontrar adb, etc., esto se debe a que sin las bibliotecas compartidas de 32 bits necesarias para ejecutarlas en el sistema, no son ejecutables.

Con respecto a las bibliotecas de 32 bits, la situación es bastante simple: solo necesita instalar las bibliotecas de 32 bits adecuadas. En la instalación de fedora 17 de 64 bits que tengo aquí, las bibliotecas principales de 64 bits están en / usr / lib64 y las bibliotecas opcionales de 32 bits están en / usr / lib. Entonces, si llamo ldda 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)

Observe que todos estos están en / lib, que es un enlace simbólico a / usr / lib (no / usr / lib64). Mira:

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

Una biblioteca de C estándar de 32 bits. Lo que puede hacer es revisar las herramientas SDK de 32 bits y verificar para ver con qué están vinculadas ldd. No tengo un ejemplo a mano, pero si falta lddalgo, informa algo como:

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

Primero , para que ldd funcione, necesitará el cargador de 32 bits que viene con el glibc de 32 bits (sin esto, ldd lo llamará un archivo no ejecutable y no le dirá nada):

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

Eso está truncado, pero el paquete x86_64 es lo que ya tiene; El i686 es la versión de 32 bits. Así que solo instale eso.

No necesita ninguno de los paquetes 'devel', ya que nada se compila. Más allá de eso, las suposiciones educadas y yum whatprovides/ yum searchdeberían ayudar (mirando la lista de adb, también hay versiones de 32 bits de C ++ lib, ncurses, pthreads y algunas cosas que no sé).

Consejo rápido sobre el uso whatprovides:

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

;)

encerrada dorada
fuente
ok, intentaré instalar las versiones i686 de las bibliotecas que se muestran a través de ldd. Por la razón: no estoy convencido, llamando filea la versión de paquete de adbpantallas: ELF ejecutable LSB de 32 bits, Intel 80386 - nada que ver con la emulación ARM - y / usr / bin / adb (del paquete fedora android-tools) en realidad está disponible como ELF ejecutable LSB de 64 bits, x86-64 .
maxschlepzig
Si llamo a ldd adt-bundle-linux/sdk/platform-tools/adb, muestra 'no es un ejecutable dinámico'. Con respecto a la RUTA, este no es el problema, especificar completamente la ruta de, por ejemplo, ./adt-bundle-linux/sdk/platform-tools/adben un terminal no funciona (da como resultado 'zsh: no existe dicho archivo o directorio [..]').
maxschlepzig
¿Ya tiene instalado glibc.i686? Como dije, es probable que necesite un cargador de 32 bits para que ldd funcione, y eso será con el paquete glibc. WRT adb es un arco de inteligencia de 32 bits , eso es porque ese es su sistema, algo compilado para ARM no funcionará allí. Sin embargo, las mismas cosas de 32 bits podrían compilarse para ARM, e imagino que algunas partes se usan cuando se usan en dispositivos Android. Admito que podría estar equivocado acerca de que esa es la necesidad, pero en cualquier caso, eso es lo que está disponible, y no es realmente una molestia.
Ricitos de oro
WRT la ruta, tal vez no sea necesario para eclipse, y (como usted dice) puede obtener el mismo error en la línea de comando si el archivo no se puede ejecutar de todos modos. Simplemente instale las bibliotecas, etc., y lo descubrirá.
Ricitos de oro
2
No hay relación entre el emulador que es un programa de 32 bits y la plataforma emulada que tiene un procesador de 32 bits. De hecho, el emulador de Android se basa en Qemu, que puede emular cualquiera de armv7 (32 bits), armv8 (64 bits), x86, amd64, mips, mips64 y muchos más, independientemente de la arquitectura del host.
Gilles 'SO- deja de ser malvado'
8

Tienes que instalar el glibc de 32 bits:

# yum install glibc.i686

Esto elimina el mensaje engañoso 'no existe tal archivo o directorio' cuando se intenta ejecutar un binario de 32 bits. Con eso, el sistema Fedora de 64 bits es capaz de ejecutar binarios de 32 bits.

Esto también elimina el mensaje engañoso de "no un ejecutable dinámico" lddcuando se llama ldda un ejecutable dinámico de 32 bits.

Ahora debe instalar las bibliotecas faltantes de 32 bits con las que adt-bundle-linux/sdk/platform-toolsestán vinculados los binarios :

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

Eso es.

Antecedentes

Algunos antecedentes sobre cómo derivar los nombres de paquetes anteriores. Por ejemplo, mirando la salida 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)
    [..]

significa que todavía faltan 2 bibliotecas para adb.

Para cada 'no encontrado' tenemos que buscar el nombre del paquete, por ejemplo:

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

Ahora tomamos el nombre base del paquete y le agregamos '.i686' para obtener la versión de 32 bits.

maxschlepzig
fuente
Esta respuesta es excelente, especialmente la primera parte: de hecho, la instalación glibc.i686permite lddtrabajar correctamente con los binarios i386.
Krystian
2

Puede instalar el paquete necesario con:

sudo yum install redhat-lsb.i686
xwindows
fuente