Nenhum tal arquivo ou diretório? Mas o arquivo existe!

139

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
    
por Francesco 07.05.2012 / 21:06

5 respostas

190

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 receber 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 complete).
  • 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, no entanto, quando você tenta executá-lo, é informado de que arquivo não existe.

A mensagem de erro neste último caso é 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 mensagem" Não encontrado "ao executar um binário de 32 bits em um sistema de 64 bits .

O comando file informará exatamente o que é esse 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, é necessário instalar os ia32-libs package . Você pode precisar instalar bibliotecas adicionais (você receberá uma mensagem de erro explícita se o fizer).

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

    
por Gilles 07.05.2012 / 23:47
34

Sistemas Multiarch Ubuntu de 64 bits

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

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 sistema Ubuntu de 64 bits com vários arcos, é necessário adicionar i386 architecture e também libc6:i386 , libncurses5:i386 , libstdc++6:i386 estes 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
    
por Avinash Raj 24.04.2014 / 15:14
4

Ao instalar o deb de 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          

Depois 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 poderia também 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: link .

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

    
por Francesco 09.05.2012 / 21:12
3

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, mesmo que file relate "vinculado dinamicamente", ldd relata "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 por 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 dos pacotes (o preenchimento de guias ajuda).

    
por nobar 08.06.2016 / 22:57
0

Para expandir a resposta @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 exemplo, o comando file funciona), resultando em 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
    

    Observe interpreter /lib64/ld-lsb-x86-64.so.3 ; Se este arquivo não existir, você precisa instalá-lo. Para este carregador específico 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". Veja 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 de carregador que eu não conheço.

    
por jtpereyda 11.05.2018 / 20:54