O objetivo deste post como é executar um programa 32 bits no Debian x86_64. Não tenho idéia de como outras distribuições lidam com essa compatibilidade. Explicarei, então, como o Debian faz, para ver se o método é compatível. Se só quiser saber como instalar o (ou pelo) caso de exemplo, vá para a seção Gens-GS no Debian-AMD64 (x86_64) deste post.
Devido ao suporte nativo da arquitetura x86_64 (desenvolvida pela AMD) à arquitetura x86 (criada pela Intel), o Debian utiliza um método que ele considera uma emulação 32 bits. No diretório raiz do sistema, criou uma pasta /emul onde lá estariam as arquiteturas emuladas: no caso /emul/ia32-linux/.
Nesse diretório, fica “toda” a árvore do sistema de arquivos para aplicativos 32 bits. “Toda” porque, na verdade, só a pasta usr/ e lib/ ficam lá. Os aplicativos 32 bits usarão as pastas nativas para arquivos de configuração, registro etc (/etc/ e /var/, por exemplo).
Além disso, dentro da pasta /usr/ “oficial” do sistema, criou duas novas pastas: lib32/ e lib64/. A pasta /usr/lib/ é uma ligação para /usr/lib64/, diretório no qual residem todas as bibliotecas 64 bits, como o própio nome sugere.
Ao se executar um programa que se vale de bibliotecas dinâmicas (ou seja, quase todos), conforme a arquitetura do aplicativo, ele vai procurar primeiro a biblioteca compatível no pasta das de 32 bits; caso não encontre, recai nas de 64 bits. Contudo, não adianta tentar fazer a ligação dinâmica de programas 32 bits com bibliotecas 64 bits, ocorre erro na quase totalidade dos casos. Então, o que se deve fazer é instalar as bibliotecas 32 bits faltantes.
Primeiramente, para poder rodar os aplicativos 32 bits menos exigentes em bibliotecas, o mínimo que se deve instalar é o pacote ia32-libs. Para aplicativos com interface gráfica que utilizam GTK+, deve se instalar ia32-libs-gtk. O pacote lib32nss-mdns, por sua vez, é para auxiliar nas conexões com a internet (relativos a DNS).
Passemos a um exemplo de caso, agora, em que essas bibliotecas não são o suficiente:
———————————————————————-
Gens-GS no Debian-AMD64 (x86_64)
———————————————————————-
Esse aplicativo citei em outro post, referente a emuladores de sistemas SEGA. No caso, é um emulador de Mega Drive.
Esse Gens modificado ainda não terminou de reescrever o código para que possa ser portado enfim para 64bits. No entanto, dá para executá-lo no Debian instalando as bibliotecas 32 bits que ele disponibiliza.
Como é um aplicativo 32 bits, e usa a interface GTK+, é necessário instalar dois pacotes:
- ia32-libs
- ia32-libs-gtk
Como gosto do aptitude pela memória que ele tem para remoção das dependências depois que o pacote que as convocou é removido, sempre o uso:
# aptitude install ia32-libs ia32-libs-gtk
Quem não gosta, ou prefere o apt-get:
# apt-get install ia32-libs ia32-libs-gtk
Ou utilize synaptic para fazer com uma amigável GUI. Os programas devem ser executados como super-usuário (root) ou via sudo.
Feito isso, podemos instalar o pacote pré-compilado do Gens-GS para Ubuntu 32 bits. Para tal feito, é preciso obrigar o utilitário dpkg a instalar o pacote ignorando o problema de arquitetura…
# dpkg --force-architecture -i meu-diretório/Gens_2.15.5-gs-m6-1_i386.deb
Instalado com sucesso, é o momento de executarmos o emulador:
$ gens
E então ocorre o momento que todos “queriam”: o erro.
$ gens
gens: error while loading shared libraries: libGL.so.1: cannot open shared object file: No such file or directory
Ou, em português,
$ gens
gens: erro ao carregar as bibliotecas dinâmicas: libGL.so.1: não é possível abrir o arquivo objeto compatilhado: O arquivo ou o diretório não existe
Ou seja, o sistema não encontrou as bibliotecas 32 bits do OpenGL que o Gens-gs precisa (na verdade, na execução, você pode optar por usar SDL). O que é preciso fazer, então, é instalá-las. Suponhamos que você não saiba em que pacote que elas vêm. É possível usar o site de pacotes do Debian para pesquisar. No caso, é preciso buscar pelo conteúdo do pacote: libGL.so.1. Na página do resultado da pesquisa para a versão debian/lenny, observa-se alguns pacotes possíveis:
- fglrx-glx-ia32 [amd64] : para placas de vídeo AMD/ATI
- nvidia-glx-ia32 [amd64] ou nvidia-glx-legacy-96xx-ia32 [amd64]: para placas de vídeo da NVIDIA
- libgl1-mesa-glx [i386, amd64]: para renderização direta ou indireta
“Tanto faz” qual utilizar. Óbvio que para melhor desempenho, deveria utilizar o apropriado para sua placa de vídeo.
Para generalizar a solução, vou escolher o pacote libgl1-mesa-glx. Embora tenha a versão própria para AMD64, nós precisamos é da versão 32 bits (repare que os demais pacotes citados já são para isso – 32 bits em máquinas 64 bits, o que é bem melhor).
O que se deve fazer é baixar o pacote para i386 do site do Debian:
http://packages.debian.org/lenny/libgl1-mesa-glx
E fazer o dpkg, em vez de instalar de fato no sistema, apenas extrair para a pasta de emulação de 32 bits…
# dpkg --extract meu-diretório/libgl1-mesa-glx_7.0.3-7_i386.deb /emul/ia32-linux/
Et voilà! Gens/GS funciona enfim.
Lembro que deve isso ser feito como super-usuário, que o que deve ficar na pasta /emul/ia32-linux/ são apenas as lib/ e usr/, as demais, se criadas, devem ser apagadas ou ter seu conteúdo movido para as equivalentes do sistema.
Destaco aqui que é/seria muito melhor instalar os pacotes *-ia32. Essa solução é para quando não estão disponíveis. Esse método pode ser melhorado modificando o pacote já para fazer a instalação nas pastas adequadas e modificando a arquitetura de instalação: isso permite remover o conteúdo do pacote depois com apt-get, aptitude, synaptic etc. Contudo, foi feito assim por simplicidade.
Filed under: debian, megadrive | Leave a Comment
Tags: 32bits, debian, emulador, gens, megadrive
No Responses Yet to “Instalando bibliotecas 32 bits ausentes no Debian x86_64 – caso: Gens/GS”