Não existe tal arquivo ou diretório? Mas o arquivo existe!

186

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
Francesco
fonte
2
Talvez "chmod u + x ./shank*bin" primeiro?
agent86
também não deve que ser' .bin' em vez de '-bin', talvez seja apenas um erro de digitação
Anake
Obrigado por sua resposta. Eu fiz o comando que você disse Agent86, mas tenho o mesmo resultado. Também baixei o arquivo .deb, mas também há um problema. Não sei qual é o problema desse jogo.
Francesco
Confirme se você está executando uma instalação de 64 bits (esse é o caso mais comum desse problema).
Gilles
Sim, confirmo que estou usando uma arquitetura de 64 bits no meu laptop.
Francesco

Respostas:

236

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":

  • O arquivo não existe. Presumo que você tenha verificado que o arquivo existe (talvez porque o shell o complete).
  • Há um arquivo com esse nome, mas é um link simbólico pendente.
  • O arquivo existe e você pode até lê-lo (por exemplo, o comando file shank-linux-120720110-1-binexibe 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 filecomando 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-libspacote Instale ia32-libs . 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 Instale libc6-i386

Gilles
fonte
Obrigado por uma ótima resposta, Gilles. Embora ainda não tenha enfrentado esse problema, arquivei sua resposta para referência futura.
Jim C.
Obrigado pela sua resposta exaustiva! A lixeira que baixei foi a única disponível neste formato (lixeira). Então eu acho que é bom para todas as arquiteturas. Também baixei o arquivo .deb para minha arquitetura (64 bits), mas com um erro diferente. Neste ponto, acho que o jogo é afetado por alguns bugs ou não consigo instalar o jogo. Agora eu tento baixar o libc6-i386 e ainda tento instalá-lo. Escreverei novamente se houver mudanças significativas. Obrigado pelo seu tempo.
Francesco
2
@Francesco Por favor, poste a solução! É provável que ajude outras pessoas que tentam executar o Shank no Ubuntu. Não há problema em responder sua própria pergunta .
Gilles
1
Você pode usar lddpara verificar se está faltando uma biblioteca. ldd kgio_ext.sopoderia dizer algo como libruby.so.2.3 => not found, entre outros
EnabrenTane
1
Aparentemente, há outro cenário em que bash: ...some...path...: No such file or directorypode aparecer: depois de mover o arquivo executável. O Bash parece armazenar em cache os caminhos dos executáveis ​​encontrados em $ PATH; correr hash -rpara limpá-lo. Veja: unix.stackexchange.com/a/5610/11352
akavel
53

Sistemas Ubuntu Multiarch de 64 bits

Siga esta resposta apenas se a saída dos file file-nameprogramas,

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 i386arquitetura e também você tem que instalar libc6:i386, libncurses5:i386, libstdc++6:i386estes 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
Avinash Raj
fonte
Eu usaria o sudo como último comando: iniciar um binário de 32 bits (obviamente não compilado por você ou pelo Ubuntu), pois o sudo pode ser arriscado. (assim, ainda n como raiz, admitedly)
alci
o que quer que seja, finalmente, mas funciona.
Avinash Raj
1
Note-se que se você estiver usando o CentOS ou RedHat, esta resposta não se aplica. Foi jogado fora por algumas horas por causa disso.
omikes 28/02
1
No Kali 2 de 64 bits, eu só tinha que instalar #libselinux1:i386
193 Aralox
4

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.

Francesco
fonte
3

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 filerelatórios sejam "vinculados dinamicamente", os lddrelató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).

nobar
fonte
ldd(incorretamente) relata "não é um executável dinâmico".
Nobar
3

Para expandir a resposta do @Gilles, há pelo menos três cenários que resultam neste erro:

  1. O arquivo não existe.
  2. O arquivo existe, mas é um link simbólico pendente.
  3. O arquivo existe (por exemplo, o filecomando funciona), gerando uma mensagem de erro intrigante. Isso pode significar que há um problema com o carregador.

Categorias de problemas do carregador:

  1. 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.

  2. Problemas com o carregador de um script (consulte esta resposta ).

  3. Bibliotecas compartilhadas ausentes - use 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.

jtpereyda
fonte
1
No meu caso, file lmutilnão mostrei o intérprete, mas lddsim, e a instalação lsbresolveu o problema.
Davida