O shell reportará um ambíguo " Nenhum arquivo ou diretório " para um executável quando o shell não puder encontrar uma dependência para esse executável.
A dependência ausente é tipicamente uma biblioteca compartilhada requerida ou um carregador dinâmico.
Use o comando strace para exibir explicitamente o open () syscall que falha durante a solicitação de execução (por exemplo, strace /usr/local/phantomjs/bin/phantomjs
).
Adendo
execve("/usr/local/phantomjs/bin/phantomjs", ["/usr/local/phantomjs/bin/phantom"...], [/* 13 vars */]) = -1 ENOENT (No such file or directory)
O evecve syscall retornou o código de erro ENOENT, que a página man descreve como "o arquivo nome do arquivo ou um script ou interpretador ELF não existe, ou uma biblioteca compartilhada necessária para arquivo ou interpretador não pode ser encontrado. "
Geralmente eu vi strace fornecer melhor resolução do arquivo ausente.
O próximo passo é examinar o arquivo executável de suas dependências.
Use o comando strings para extrair o vinculador / carregador dinâmico, as bibliotecas compartilhadas e os pontos de entrada listados no início do arquivo executável.
strings /usr/local/phantomjs/bin/phantomjs | less
Para cada nome de arquivo que você pode identificar nesta lista, você deve verificar se o arquivo está instalado em seu sistema de arquivos raiz.
$ file modetest
modetest: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.10.0, stripped
$ strings modetest | less
/lib/ld-linux-armhf.so.3 <=
libdrm.so.2 <=
drmModeFreeObjectProperties
drmModeFreePlaneResources
_ITM_deregisterTMCloneTable
...
libpthread.so.0 <=
pthread_join
pthread_create
__errno_location
...
libc.so.6 <=
strcpy
exit
mmap64
...
Do seu Update2 anterior, o primeiro arquivo seria /lib64/ld-linux-x86-64.so.2 .