Como executar programas de 32 bits no Fedora 17 de 64 bits?

10

Embora o pacote do Android Development Tools (ADT) esteja disponível como um pacote zip para o 'Linux 64 Bit', ele declara os seguintes requisitos :

As distribuições de 64 bits devem ser capazes de executar aplicativos de 32 bits.

E, de fato, apenas executar o eclipse empacotado em um sistema Fedora 17 de 64 bits resulta em erros, porque ele não pode 'encontrar' várias ferramentas de desenvolvimento, por exemplo, adbou aapt:

Erro ao executar o aapt: Não é possível executar o programa "/ home / juser / local / adt-bundle-linux / sdk / platform-tools / aapt": error = 2, Nenhum arquivo ou diretório: error = 2, Nenhum arquivo ou diretório

O 'arquivo inexistente' é enganoso porque está lá (em $ HOME / local):

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

Mas não posso executá-lo no shell:

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

Olhando para o arquivo

$ 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

nós vemos que é um binário 32. E parece que meu sistema (atualmente) não é capaz de executar aplicativos de 32 bits.

Como eu mudo isso? Como faço para um sistema Fedora atual de 64 bits capaz de executar aplicativos de 32 bits?

(É claro que também se pode perguntar por que alguém acaba colocando binários de 32 bits em um pacote binário chamado 'Linux 64 bits' ...)

maxschlepzig
fonte
Pergunta semelhante com resposta no AskFedora: ask.fedoraproject.org/question/365/…
gertvdijk
Para entender por que você está recebendo esta mensagem: mensagem de Primeiros “Não encontrado” ao executar um binário de 32 bits em um sistema de 64 bits
Gilles 'SO parada sendo maus'

Respostas:

9

Com relação ao eclipse não ser capaz de encontrar adb, etc, isso porque sem as bibliotecas compartilhadas de 32 bits necessárias para executá-las no sistema, elas não são executáveis.

Com relação às bibliotecas de 32 bits, a situação é bastante simples: você só precisa instalar as bibliotecas de 32 bits apropriadas. Na instalação do fedora 17 de 64 bits que tenho aqui, as bibliotecas primárias de 64 bits estão em / usr / lib64 e as bibliotecas opcionais de 32 bits estão em / usr / lib. Então, se eu chamar lddsdk / 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 estão em / lib, que é um link simbólico para / usr / lib (não / usr / lib64). Veja:

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

Uma biblioteca C padrão de 32 bits. O que você pode fazer é acessar as ferramentas sdk de 32 bits e verificar para que elas estão vinculadas ldd. Não tenho um exemplo em mãos, mas se algo estiver faltando, é lddrelatado algo como:

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

Primeiro , para o ldd funcionar, você precisará do carregador de 32 bits que acompanha o glibc de 32 bits (sem isso, o ldd o chamará de arquivo não executável e não dirá nada):

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

Isso está truncado, mas o pacote x86_64 é o que você já possui; o i686 é a versão de 32 bits. Então, basta instalar isso.

Você não precisa de nenhum dos pacotes 'devel', pois nada é compilado. Além disso, palpites e yum whatprovides/ yum searchdevem ajudar (olhando a lista de adb, também existem versões de 32 bits da biblioteca C ++ lib, ncurses, pthreads e algumas coisas que não sei).

Dica rápida sobre o uso whatprovides:

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

;)

Cachinhos Dourados
fonte
ok, vou tentar instalar as versões i686 das bibliotecas exibidas via ldd. Pelo motivo: não estou convencido, chamando filea versão de pacote de adbmonitores: executável LSF ELF de 32 bits, Intel 80386 - nada a ver com emulação de ARM - e / usr / bin / adb (do pacote fedora android-tools) está realmente disponível como executável LSF de 64 bits da ELF, x86-64 .
maxschlepzig
Se eu chamar ldd, adt-bundle-linux/sdk/platform-tools/adbele exibirá 'não é um executável dinâmico'. Em relação ao PATH - esse não é o problema - especificar completamente o caminho de, por exemplo ./adt-bundle-linux/sdk/platform-tools/adb, um terminal não funciona (resulta em 'zsh: não existe esse arquivo ou diretório [..]').
maxschlepzig
Você tem o glibc.i686 instalado ainda? Como eu disse, você (provavelmente) precisa de um carregador de 32 bits para o ldd funcionar, e isso acontecerá com o pacote glibc. Sendo o WRT adb um arco de intel de 32 bits , é porque esse é o seu sistema, algo compilado para o ARM não funcionará lá. No entanto, o mesmo material de 32 bits pode ser compilado para o ARM, e imagino que partes dele sejam usadas em dispositivos Android. Eu admito que pode estar errado sobre isso ser a necessidade, mas, em qualquer caso, é isso que está disponível, e não é realmente tão problemático.
Goldilocks
WRT o caminho, talvez não seja necessário para o eclipse, e (como você diz), você pode receber o mesmo erro na linha de comando se o arquivo não puder ser executado de qualquer maneira. Basta instalar as bibliotecas, etc, e você descobrirá.
Goldilocks
2
Não há relação entre o emulador ser um programa de 32 bits e a plataforma emulada com um processador de 32 bits. De fato, o emulador do Android é baseado no Qemu, que pode emular qualquer um dos arquivos armv7 (32 bits), armv8 (64 bits), x86, amd64, mips, mips64 e muito mais, independentemente da arquitetura do host.
Gilles 'SO- stop be evil'
8

Você precisa instalar o glibc de 32 bits:

# yum install glibc.i686

Isso remove a mensagem enganosa "não existe esse arquivo ou diretório" ao tentar executar um binário de 32 bits. Com isso, o sistema Fedora de 64 bits é capaz de executar binários de 32 bits.

Isso também remove a mensagem enganosa 'não é um executável dinâmico' lddao chamar lddum executável dinâmico de 32 bits.

Agora você deve instalar as bibliotecas ausentes de 32 bits nos quais os binários adt-bundle-linux/sdk/platform-toolsestão vinculados:

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

É isso aí.

fundo

Alguns antecedentes de como obter os nomes dos pacotes acima. Por exemplo, olhando para a saída 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 ainda faltam duas bibliotecas para adb.

Para cada 'não encontrado', precisamos procurar o nome do pacote, por exemplo:

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

Agora pegamos o nome da base do pacote e adicionamos '.i686' para obter a versão de 32 bits.

maxschlepzig
fonte
Essa resposta é ótima, especialmente a primeira parte - na verdade, a instalação glibc.i686permite lddque funcione corretamente com os binários i386.
Krystian
2

Você pode instalar o pacote necessário com:

sudo yum install redhat-lsb.i686
xwindows
fonte