Eu baixei um jogo (Shank), mas o arquivo bin não é executado. O erro que é mostrado quando tento iniciar o executável é:
bash: ./shank-linux-120720110-1-bin: No such file or directory
Eu baixei um jogo (Shank), mas o arquivo bin não é executado. O erro que é mostrado quando tento iniciar o executável é:
bash: ./shank-linux-120720110-1-bin: No such file or directory
Respostas:
Você provavelmente está tentando executar um binário de 32 bits em um sistema de 64 bits que não possui suporte de 32 bits instalado.
Há três casos em que você pode receber a mensagem "Esse arquivo ou diretório não existe":
file shank-linux-120720110-1-bin
exibe algo como "ELF 32-bit LSB executável ...") e, no entanto, quando você tenta executá-lo, é avisado que o arquivo não existe.A mensagem de erro neste último caso é reconhecidamente confusa. O que está lhe dizendo é que falta um componente-chave do ambiente de tempo de execução necessário para executar o programa. Infelizmente, o canal através do qual o erro é relatado tem espaço apenas para o código do erro e não para essas informações extras, as quais são realmente o ambiente de tempo de execução. Se você deseja a versão técnica desta explicação, leia a mensagem Obtendo "Não encontrado" ao executar um binário de 32 bits em um sistema de 64 bits .
O file
comando irá dizer exatamente o que é esse binário. Com algumas exceções, você pode executar apenas um binário para a arquitetura do processador para a qual é sua versão do Ubuntu. A principal exceção é que você pode executar binários de 32 bits (x86, também conhecido como IA32) em sistemas de 64 bits (amd64, também conhecido como x86_64).
No Ubuntu até 11.04, para executar um binário de 32 bits em uma instalação de 64 bits, você precisa instalar o ia32-libs
pacote . Pode ser necessário instalar bibliotecas adicionais (você receberá uma mensagem de erro explícita).
Desde a 11.10 (onírica) introduziu o suporte a multiarcas , você ainda pode instalar ia32-libs
, mas pode escolher uma abordagem mais refinada, é o suficiente para obter (além de qualquer outra biblioteca necessária).libc6-i386
ldd
para verificar se está faltando uma biblioteca. ldd kgio_ext.so
poderia dizer algo como libruby.so.2.3 => not found
, entre outros
bash: ...some...path...: No such file or directory
pode aparecer: depois de mover o arquivo executável. O Bash parece armazenar em cache os caminhos dos executáveis encontrados em $ PATH; correr hash -r
para limpá-lo. Veja: unix.stackexchange.com/a/5610/11352
Siga esta resposta apenas se a saída dos file file-name
programas,
file-name: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped
Para executar o arquivo executável de 32 bits em um multi-arch sistema Ubuntu de 64 bits, você tem que adicionar i386
arquitetura e também você tem que instalar libc6:i386
, libncurses5:i386
, libstdc++6:i386
estes três pacotes de bibliotecas.
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name
libselinux1:i386
Ao instalar o deb para 32 bits, percebi que estavam faltando algumas bibliotecas (além de ia32-libs e libc6). Eu primeiro resolvi esse problema, dando este comando:
sudo apt-get install -f
Então eu recebi outro erro:
Message: SDL_GL_LoadLibrary
Error: Failed loading libGL.so.1
Obviamente, essas bibliotecas foram instaladas corretamente. Sem entrar em detalhes, tive que vincular as bibliotecas manualmente. Percebi então que também poderia ser uma solução mais fácil através do Synaptic instalar os seguintes pacotes:
libgl1-mesa-glx:i386
libgl1-mesa-dri: i386.
Depois disso, o próximo problema foi a tela preta durante a reprodução, que resolvi substituindo o executável em / Shank / bin por este: http://treefort.icculus.org/smb/smb-linux-mesa-hotfix-test.tar .bz2 .
Espero que seja útil para alguém. Se precisar de mais ajuda ou mais detalhes, entre em contato comigo.
Aqui está uma transcrição mostrando um pouco mais sobre a natureza do problema e como corrigi-lo no Ubuntu 16.04. Observe que, embora os file
relatórios sejam "vinculados dinamicamente", os ldd
relatórios "não sejam um executável dinâmico".
$ ./myprogram
bash: myprogram: No such file or directory
$ file myprogram
myprogram: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.2.5, not stripped
$ ldd myprogram
not a dynamic executable
Depois de instalar o libc6: i386, as coisas começam a melhorar ...
$ sudo apt-get install libc6:i386 # the initial fix
...
$ ldd myprogram
linux-gate.so.1 => (0xf77fd000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7626000)
/lib/ld-linux.so.2 (0x56578000)
$ ./myprogram
myprogram: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
Para concluir o trabalho, pode ser necessário identificar e instalar bibliotecas adicionais, uma de cada vez ...
$ sudo apt-get install libstdc++6:i386 ## may require various additional libs
$ ./myprogram
... works correctly ...
Não sei se existe uma maneira sistemática de identificar as bibliotecas corretas para instalar. Há um pouco de adivinhação ao mapear as mensagens de erro para os nomes dos pacotes (ajuda na conclusão de guias).
ldd
(incorretamente) relata "não é um executável dinâmico".
Para expandir a resposta do @Gilles, há pelo menos três cenários que resultam neste erro:
file
comando funciona), gerando uma mensagem de erro intrigante. Isso pode significar que há um problema com o carregador.Categorias de problemas do carregador:
O carregador de um executável não existe. Você pode verificar isso usando o comando file e ver se o carregador existe. Por exemplo
file lmgrd
lmgrd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-lsb-x86-64.so.3, for GNU/Linux 2.6.18, stripped
Aviso interpreter /lib64/ld-lsb-x86-64.so.3
; se esse arquivo não existir, você precisará instalá-lo. Para este carregador em particular no 16.04, a resposta acabou sendo sudo apt-get install lsb
.
Problemas com o carregador de um script (consulte esta resposta ).
ldd <file-name>
para verificar se há bibliotecas "não encontradas". Veja esta resposta para mais informações.O carregador não existente pode ser devido a uma incompatibilidade de 32/64 bits ou por outro motivo. Pode haver outros tipos de erros do carregador que eu não conheço.
file lmutil
não mostrei o intérprete, mas ldd
sim, e a instalação lsb
resolveu o problema.