Come eseguire programmi a 32 bit su Fedora 17 a 64 bit?


10

Sebbene il bundle Android Development Tools (ADT) sia disponibile come pacchetto zip per "Linux 64 Bit", afferma i seguenti requisiti :

Le distribuzioni a 64 bit devono essere in grado di eseguire applicazioni a 32 bit.

E infatti, semplicemente eseguendo l'eclissi in pacchetto su un sistema Fedora 17 a 64 bit si ottengono errori, perché non riesce a "trovare" diversi strumenti di sviluppo, ad esempio adbo aapt:

Errore durante l'esecuzione di aapt: impossibile eseguire il programma "/ home / juser / local / adt-bundle-linux / sdk / platform-tools / aapt": errore = 2, nessun file o directory: errore = 2, nessun file o directory

Il "nessun file di questo tipo" è fuorviante perché è lì (sotto $ HOME / local):

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

Ma non posso eseguirlo sulla shell:

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

Guardando il file

$ 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

vediamo che è un 32 binario. E sembra che il mio sistema (attualmente) non sia in grado di eseguire applicazioni a 32 bit.

Come lo cambio? Come posso rendere un attuale sistema Fedora a 64 bit in grado di eseguire applicazioni a 32 bit?

(Naturalmente si potrebbe anche chiedere perché qualcuno finisce per mettere i binari a 32 bit in un pacchetto binario chiamato 'Linux 64 bit' ...)


Domanda simile con risposta su AskFedora: ask.fedoraproject.org/question/365/…
gertvdijk

Per capire perché stai ricevendo questo messaggio: Ricevi il
Gilles 'SO- smetti di essere malvagio' il

Risposte:


9

Per quanto riguarda l'eclissi che non è in grado di trovare adb, ecc. Questo perché senza le librerie condivise a 32 bit necessarie per eseguirle sul sistema, non sono eseguibili.

Per quanto riguarda le librerie a 32 bit, la situazione è abbastanza semplice: è sufficiente installare le librerie a 32 bit appropriate. Sull'installazione fedora 17 a 64 bit che ho qui, le librerie primarie a 64 bit sono in / usr / lib64 e le librerie opzionali a 32 bit sono in / usr / lib. Quindi, se invito lddsu 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)

Si noti che sono tutti in / lib, che è un collegamento simbolico a / usr / lib (non / usr / lib64). Guarda:

»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 libreria C standard a 32 bit. Quello che puoi fare è passare attraverso gli strumenti SDK a 32 bit e controllare per vedere a cosa sono collegati ldd. Non ho un esempio a portata di mano, ma se manca lddqualcosa riporta qualcosa come:

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

Per prima cosa , però, affinché ldd funzioni, è necessario il caricatore a 32 bit fornito con glibc a 32 bit (senza questo, ldd lo chiamerà un file non eseguibile e non ti dirà nulla):

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

È troncato, ma il pacchetto x86_64 è quello che hai già; l'i686 è la versione a 32 bit. Quindi basta installarlo.

Non hai bisogno di nessuno dei pacchetti 'devel', poiché nulla viene compilato. Oltre a ciò, ipotesi istruite e yum whatprovides/ yum searchdovrebbero aiutare (guardando l'elenco per adb, ci sono anche versioni a 32 bit della libreria C ++, ncurses, pthreads e alcune cose che non conosco).

Suggerimento rapido sull'uso di whatprovides:

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

;)


ok, proverò a installare le versioni i686 delle librerie visualizzate tramite ldd. Per il motivo: non ne sono convinto, invocando filela versione bundle di adbdisplay: eseguibile LSB ELF a 32 bit, Intel 80386 - niente a che fare con l'emulazione ARM - e / usr / bin / adb (dal pacchetto fedora di android-tools) è attualmente disponibile come eseguibile LSB ELF a 64 bit, x86-64 .
Maxschlepzig,

Se chiamo ldd su, adt-bundle-linux/sdk/platform-tools/adbviene visualizzato "non un eseguibile dinamico". Per quanto riguarda il PERCORSO - questo non è il problema - la specifica completa del percorso di es. ./adt-bundle-linux/sdk/platform-tools/adbIn un terminale non funziona (risulta in 'zsh: nessun file o directory [..]').
Maxschlepzig,

Hai già installato glibc.i686? Come ho detto, probabilmente avrai bisogno di un caricatore a 32 bit per far funzionare ldd, e questo avverrà con il pacchetto glibc. L'Adb WRT è un arco Intel a 32 bit , perché è il tuo sistema, qualcosa compilato per ARM non funzionerà lì. Tuttavia, lo stesso materiale a 32 bit potrebbe essere compilato per ARM, e immagino che parti di esso vengano utilizzate su dispositivi Android. Ammetto che potrebbe essere sbagliato sul fatto che questa sia la necessità, ma in ogni caso, questo è ciò che è disponibile, e non è poi così tanto una seccatura.
Riccioli d'oro

WRT il percorso, forse non è necessario per l'eclissi e (come dici tu) potresti ottenere lo stesso errore sulla riga di comando se il file non può essere eseguito comunque. Basta installare le librerie, ecc., E lo scoprirai.
Riccioli d'oro

2
Non esiste alcuna relazione tra l'emulatore che è un programma a 32 bit e la piattaforma emulata con un processore a 32 bit. L'emulatore Android si basa infatti su Qemu, che può emulare qualsiasi armv7 (32 bit), armv8 (64 bit), x86, amd64, mips, mips64 e molti altri, indipendentemente dall'architettura host.
Gilles 'SO- smetti di essere cattivo' il

8

Devi installare glibc a 32 bit:

# yum install glibc.i686

Ciò rimuove il messaggio fuorviante "nessun file o directory" quando si tenta di eseguire un file binario a 32 bit. Con ciò il sistema Fedora a 64 bit è in grado di eseguire binari a 32 bit.

Ciò rimuove anche il messaggio fuorviante "non un eseguibile dinamico" di lddquando si chiama lddun eseguibile dinamico a 32 bit.

Ora devi installare le librerie a 32 bit mancanti a cui adt-bundle-linux/sdk/platform-toolssono collegati i binari :

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

Questo è tutto.

sfondo

Alcuni retroscena su come derivare i nomi dei pacchetti sopra. Ad esempio, guardando l'output di

$ 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 che mancano ancora 2 librerie per adb.

Per ogni "non trovato" dobbiamo cercare il nome del pacchetto, ad esempio:

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

Ora prendiamo il nome della base del pacchetto e aggiungiamo '.i686' per ottenere la versione a 32 bit.


Questa risposta è ottima, in particolare la prima parte: l'installazione infatti glibc.i686consente ldddi funzionare correttamente con i binari i386.
Krystian,

2

È possibile installare il pacchetto necessario con:

sudo yum install redhat-lsb.i686
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.