AC3D - Nenhum arquivo ou diretório

3

Acabei de baixar o AC3D e extraí o zip em uma pasta na minha pasta pessoal. Eu abri um terminal, CD para a pasta e digitei ./ac3d . Mas recebo a seguinte mensagem de erro toda vez:

bash: ./ac3d: No such file or directory

Mas o arquivo está claramente lá! Eu já o tornei rodável, então não poderia ser o caso também. Qualquer ajuda seria apreciada!

Obrigado antecipadamente!

Editar 1: @TheSchwa Eu fiz. E isso mostra que sim, ele é reconhecido.

@Nephente Aqui está. A saída de ls -l ac3d é:

-rwxrwxrwx 1 ruben ruben 3758400 mei  1 23:34 ac3d

A saída de head -1 ac3d é (abreviada)

ELF@�   4�T94(44�4�44�4���o27o27@7����|_h�7h0h088HH�H�  P�td\�4\(\(PPQ�td/lib/ld-linux.so.2GNU �[...]

Editar 2 :

Saída de dpkg --print-architecture : amd64

Saída de dpkg --print-foreign-architectures : i386

    
por TheBoneJarmer 23.09.2015 / 10:10

1 resposta

3

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.

    
por Nephente 23.09.2015 / 19:34