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


Eu baixei um jogo (Shank), mas o arquivo bin não roda. O erro mostrado quando tento iniciar o executável é:

bash: ./shank-linux-120720110-1-bin: No such file or directory

150
2018-05-07 19:06


origem


Talvez "chmod u + x ./shank*bin" primeiro? - agent86
também não deveria 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 eu tenho o mesmo resultado. Eu baixei também o arquivo .deb, mas há um problema também. Eu não sei qual problema tem esse jogo. - Francesco
Confirme se você está executando uma instalação de 64 bits (esse é o caso mais comum para esse problema). - Gilles
Sim, confirmo que estou usando uma arquitetura de 64 bits no meu laptop. - Francesco


Respostas:


Você provavelmente está tentando executar um binário de 32 bits em um sistema de 64 bits que não tem suporte para 32 bits instalado.

Existem três casos em que você pode obter a mensagem “Nenhum arquivo ou diretório”:

  • O arquivo não existe. Eu presumo que você tenha verificado que o arquivo existe (talvez porque o shell o completa).
  • Existe 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-bin exibe algo como “executável LSB de 32 bits ELF…”), e quando você tenta executá-lo, é informado que o arquivo não existe.

A mensagem de erro neste último caso é reconhecidamente confusa. O que ele está dizendo é que um componente chave do ambiente de tempo de execução necessário para executar o programa está faltando. Infelizmente, o canal pelo qual o erro é relatado tem espaço apenas para o código de erro e não para essa informação extra que é realmente o ambiente de tempo de execução responsável. Se você quiser a versão técnica desta explicação, leia Obtendo a mensagem "Não encontrado" ao executar um binário de 32 bits em um sistema de 64 bits.

o file comando irá dizer-lhe apenas o que este binário é. Com poucas exceções, você só pode executar um binário para a arquitetura do processador que o seu lançamento do Ubuntu é para. A principal exceção é que você pode executar binários de 32 bits (x86, a.k.a. IA32) em sistemas de 64 bits (amd64, a.k.a. x86_64).

No Ubuntu até 11.04, para executar um binário de 32 bits em uma instalação de 64 bits, você precisa instale o ia32-libs pacote  Install ia32-libs. Você pode precisar instalar bibliotecas adicionais (você receberá uma mensagem de erro explícita se o fizer).

Desde 11.10 (onírico) introduzido multiarco apoio, você ainda pode instalar ia32-libs, mas você pode escolher uma abordagem mais refinada, é o suficiente para obter libc6-i386  Install libc6-i386 (mais qualquer outra biblioteca necessária).


201
2018-05-07 21:47



Obrigado por uma ótima resposta, Gilles. Embora eu não tenha experimentado esse problema (ainda!), Arquivei sua resposta para referência futura. - Jim C
Obrigado pela sua resposta exaustiva! O bin do arquivo que baixei era o único disponível nesse formato (bin). Então eu acho que é bom para todas as arquiteturas. Eu também baixei o arquivo .deb para minha arquitetura (64 bits), mas com erro diferente. Neste momento acho que o jogo é afetado por alguns bugs ou eu não consigo instalar este jogo. Agora eu tento baixar libc6-i386 e ainda tento instalá-lo. Vou escrever novamente se houver mudanças significativas. Obrigado pelo seu tempo. - Francesco
@Francesco Por favor, publique a solução! É provável que ajude outras pessoas a tentarem executar Shank no Ubuntu. É perfeitamente correto responder sua própria pergunta. - Gilles
Você pode usar ldd para verificar se você está perdendo uma biblioteca. ldd kgio_ext.so pode dizer algo como libruby.so.2.3 => not found entre outros - EnabrenTane
Há aparentemente outro cenário quando 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 para os executáveis ​​encontrados no $ PATH; corre hash -r para limpá-lo. Vejo: unix.stackexchange.com/a/5610/11352 - akavel


Sistemas de 64 bits do Ubuntu Multiarch

Siga esta resposta somente se a saída de file file-name mostra

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 rodar o arquivo executável de 32 bits em um sistema Ubuntu multi-arch de 64 bits, você deve adicionar i386 arquitetura e também você tem que instalar libc6:i386,libncurses5:i386,libstdc++6:i386 esses três pacotes de biblioteca.

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name

40
2018-04-24 13:14



Eu usaria o sudo para o último comando: lançando um binário de 32 bits (obviamente não compilado por você ou pelo Ubuntu), já que o sudo poderia ser arriscado. (bem, mesmo como não raiz, admitidamente) - alci
o que quer que seja, no final, mas funciona. - Avinash Raj
Deve-se notar que se você estiver usando o CentOS ou RedHat, esta resposta não se aplica. Foi jogado fora por algumas horas por causa disso. - oMiKeY
No Kali 2 64 bit, eu só tive que instalar libselinux1:i386 - Aralox


Instalando o deb para 32 bits, percebi que faltavam algumas bibliotecas (além de ia32-libs e libc6). Primeiro resolvi este 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 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 o jogo, que resolvi substituindo o executável em / Shank / bin por: http://treefort.icculus.org/smb/smb-linux-mesa-hotfix-test.tar.bz2.

Espero que seja útil para alguém. Se você precisar de mais ajuda ou mais detalhes, sinta-se à vontade para entrar em contato comigo.


4
2018-05-09 19:12





Aqui está uma transcrição mostrando um pouco mais sobre a natureza do problema e como corrigi-lo a partir do Ubuntu 16.04. Observe que, embora file relatórios "dinamicamente ligados", ldd relatórios "não é 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, talvez seja 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 a serem instaladas. Há um pouco de adivinhação mapeando as mensagens de erro para os nomes de pacotes (ajuda de conclusão de tabulação).


3
2018-06-08 20:57



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


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

  1. O arquivo não existe.
  2. O arquivo existe, mas é um link simbólico pendente.
  3. O arquivo existe (por ex. file comando funciona), criando 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 loader 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 prévio interpreter /lib64/ld-lsb-x86-64.so.3; Se este arquivo não existir, você precisa instalá-lo. Para este carregador em particular em 16.04, a resposta acabou por ser 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". Vejo esta resposta para mais informações.

O carregador não existente pode ser devido a uma incompatibilidade de 32/64 bits ou algum outro motivo. Pode haver outros tipos de erros do carregador que eu não conheço.


2
2018-05-11 18:54



No meu caso, file lmutil não mostrou o intérprete, mas ldd fez, e instalando lsb resolveu o problema. - meowsqueak