O problema é que o binário é um executável de 32 bits e você está executando um Ubuntu de 64 bits. Isso não é um problema, já que o Ubuntu oferece suporte a múltiplas arquiteturas.
Em caso de dúvida sobre a natureza de um executável ou de qualquer arquivo em geral, o comando
file <filename>
oferece informações valiosas. Se o comando não estiver disponível, pode ser instalado através de
sudo apt-get install file
Neste caso, nos informa, entre outras informações
ac3d: ELF 32-bit LSB executable[...]
interpreter /lib/ld-linux.so.2
O interpretador é o software responsável por carregar todas as bibliotecas compartilhadas que um binário precisa executar. Se estiver faltando, um aplicativo não pode ser executado.
Os executáveis de 32 e 64 bits precisam de interpretadores diferentes e versões diferentes de bibliotecas compartilhadas. Felizmente o Ubuntu (ou mais precisamente o Debian) introduziu um suporte multi-arquitetura muito sofisticado há algum tempo [cit. necessário]
Para garantir que o sistema de pacotes esteja preparado para outra arquitetura, é possível visualizar a arquitetura padrão do sistema com
dpkg --print-architecture
Em um Ubuntu de 64 bits, o padrão será amd64
.
dpkg --print-foreign-architectures
imprime todas as outras arquiteturas que o sistema de pacotes está ciente. Para suporte a 32 bits, a saída deve conter i386
. Se isso não acontecer, pode-se adicionar suporte com
sudo dpkg --add-architecture i386
É necessário atualizar a lista de pacotes depois
sudo apt-get update
As bibliotecas ou pacotes necessários em seu sabor i386 agora podem ser instalados com
sudo apt-get install <package>:i386
Mais especificamente, para instalar o interpretador necessário, a instalação do GNU C Shared Library
é indicada:
sudo apt-get install libc6:i386
Isso, em muitos casos, fará com que o binário em questão seja executado, mas é claro que existem muitas bibliotecas nas quais um aplicativo pode ser dinamicamente vinculado, de que depende. Estes precisam ser instalados da mesma maneira. Se uma biblioteca estiver faltando, o vinculador dará um erro na execução
./ac3d: error while loading shared libraries: libGLU.so.1: \
cannot open shared object file: No such file or directory
Neste ponto, é preciso encontrar, qual pacote contém esse arquivo ausente.
Se o pacote correspondente na arquitetura nativa já estiver instalado, é possível procurar um dpkg
dpkg -S libGLU.so.1
libglu1-mesa:amd64: /usr/lib/x86_64-linux-gnu/libGLU.so.1
Portanto, precisaríamos instalar o libglu1-mesa:i386
. Repita até que todas as dependências sejam satisfeitas.
Mas muitas vezes uma biblioteca está completamente ausente do sistema. Nesse caso, pode-se pesquisar o banco de dados do pacote on-line do Ubuntu ou instalar o utilitário apt-file
e fazer
apt-file search <filename>
Um HOWTO muito bom sobre suporte multi-arch no Debian (o mesmo vale para o Ubuntu) pode ser encontrado aqui .
Extra: O pacote binutils
contém algumas ferramentas muito bacanas para examinar binários. Em particular, ele contém o utilitário ldd
(List Dynamic Dependencies). Ele lista todas as bibliotecas dinâmicas que um binário precisa executar.
Exemplo:
ldd ac3d
produz
linux-gate.so.1 (0xf77b7000)
libfreetype.so.6 => /usr/lib/i386-linux-gnu/libfreetype.so.6 (0xf76ee000)
libGLU.so.1 => not found
libGL.so.1 => not found
libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0xf76c0000)
libXmu.so.6 => not found
libXext.so.6 => not found
libX11.so.6 => not found
libdl.so.2 => /lib/i386-linux-gnu/i686/cmov/libdl.so.2 (0xf76ba000)
libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xf769e000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xf75ac000)
libm.so.6 => /lib/i386-linux-gnu/i686/cmov/libm.so.6 (0xf7566000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf7549000)
libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xf739e000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xf7381000)
/lib/ld-linux.so.2 (0xf77ba000)
Desta forma, pode-se descobrir rapidamente quais bibliotecas estão faltando no sistema.