Por que um executável diria que ele não existe quando eu tentar executá-lo?

6

Eu tenho um programa compilado, um tagger para identificar partes do texto, que afirma que ele não existe.

Quando eu tento executá-lo através da linha de comando, recebo isso:

user@place:/home/user/explicitRedactedPath$ ls tagger
tagger
user@place:/home/user/explicitRedactedPath$ ./tagger arg and other args
-bash: ./tagger: No such file or directory

Este executável tem que ser chamado por um script gerado, que é como eu corri para este problema. Quais são os motivos pelos quais esse erro pode aparecer? Estou sem ideias sobre como consertar isso.

Notas:

  • o SO é o Ubuntu
  • O executável foi copiado de outra máquina
  • O arquivo tem privilégios de execução (ele fornece uma mensagem não permitida adequada sem eles)
  • Eu tentei copiar o arquivo para um local diferente (mesmo problema)
  • Eu tentei substituir o arquivo por uma nova cópia (mesmo problema)
  • O arquivo existe. Abrindo com pico mostra um arquivo com dados binários.
por Craig Gidney 28.09.2010 / 22:11

5 respostas

7

O programa foi compilado para uma arquitetura incompatível, resultando em um programa não-executável. A mensagem de erro que diz "não existe" em vez de "executável inválido" é apenas uma mensagem muito enganadora.

Recompilá-lo na máquina de destino corrigiu o problema.

    
por 29.09.2010 / 21:11
4

Eu tive um problema muito semelhante ao OP ( ./lfm: Command not found. quando eu estava olhando bem para ele), e algumas das respostas aqui me ajudaram a descobrir como executar meu executável em um sistema diferente sem recompilar Eis como eu aconselharia o meu passado (se eu pensasse que o passado era inteligente o suficiente para ouvir uma mudança):

1) Verifique se o arquivo não é um link corrompido, se ele tem permissões executáveis e se você não está tentando executar um executável de 64 bits em um sistema operacional de 32 bits (para mim, file lfm retornou lfm: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped , portanto, é de 64 bits; verifique a saída de uname -a para x86_64 , para verificar se o SO também é de 64 bits; i386 ou i686 significa 32 bits) (substitua o seu nome do programa para lfm nesses exemplos, é claro).

2) ldd lfm retornou a mensagem not a dynamic executable (em vez de imprimir as dependências da biblioteca compartilhada), então tente readelf -l ./lfm | grep ld-linux para descobrir onde o executável espera encontrar o ld-linux, que é o carregador do linux para dinamicamente bibliotecas vinculadas (no meu caso, isso retornou [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] ).

3) Verificar o diretório indicado pelo comando anterior mostra que o arquivo ld-linux indicado não está lá; copie-o da máquina em que o programa foi originalmente compilado (ou um sistema semelhante, se necessário) para esse diretório.

4) Tente executar o programa original novamente. (Trabalhou para mim.) Além disso, ldd ./lfm deve funcionar agora (mas você sempre pode usar readelf -d ./lfm para ver quais bibliotecas são necessárias e, em seguida, verificar se elas estão disponíveis.)

    
por 27.08.2012 / 11:41
1

Provavelmente o tagger é um link flexível e o destino do link não está lá. Reproduza assim:

$ cp /usr/bin/ld .
$ ln -s ld fff
$ rm ld
$ ./fff
zsh: no such file or directory: ./fff
    
por 28.09.2010 / 22:24
0

Você pode estar sem bibliotecas compartilhadas.

Faça o 'ldd tagger' para ver uma lista de bibliotecas necessárias.

% ldd /bin/zsh                                                                                   
libcap.so.2 => /lib/libcap.so.2 (0x00007f50ce8db000)
libdl.so.2 => /lib/libdl.so.2 (0x00007f50ce6d7000)
libm.so.6 => /lib/libm.so.6 (0x00007f50ce201000)
libc.so.6 => /lib/libc.so.6 (0x00007f50cdea0000)
libattr.so.1 => /lib/libattr.so.1 (0x00007f50cdc9b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f50ceaf8000)

Se um deles estiver faltando, não terá um caminho próximo a ele.

    
por 29.09.2010 / 21:34
0

Se você não pode recompilar, você pode considerar o uso do statifier para mapear um executável dinâmico em um link estaticamente 1. Note, eu não tentei pessoalmente.

    
por 02.10.2010 / 16:56