Nenhum tal arquivo quando existe

8

Como isso é possível?

bash: /usr/local/phantomjs/bin/phantomjs: No such file or directory
bash-4.3# cd /usr/local/phantomjs/bin
bash-4.3# ls
phantomjs
bash-4.3#

O conteúdo de /usr/local/phantomjs/bin é o arquivo phantomjs , mas quando eu tento executá-lo, parece que ele não existe.

FYI, estou no linux alpino 3.3

Update1

bash-4.3# ls -lF /usr/local/phantomjs/bin/phantomjs
-rwxr-xr-x    1 root     root      67932064 Jan 25  2016 /usr/local/phantomjs/bin/phantomjs*
bash-4.3# lf -lF /usr/local/phantomjs/bin
bash: lf: command not found
bash-4.3# ls -lF /usr/local/phantomjs/bin
total 66340
-rwxr-xr-x    1 root     root      67932064 Jan 25  2016 phantomjs*

Update2

bash-4.3# file /usr/local/phantomjs/bin/phantomjs
bash: file: command not found
bash-4.3# head -n1 /usr/local/phantomjs/bin/phantomjs
ELF>xvA@'�
Q�t/lib64/ld-linux-x86-64.so.2GNUGNU����!�'�L'�L^|��������h�TT@T@DD'��'�L'�P�tddB�dB�dB��g

Update3

bash-4.3# echo $PATH
/usr/local/phantomjs/bin:/usr/local/ruby/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
bash-4.3# ruby -v
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]

Update4

bash-4.3# strace /usr/local/phantomjs/bin/phantomjs
execve("/usr/local/phantomjs/bin/phantomjs", ["/usr/local/phantomjs/bin/phantom"...], [/* 13 vars */]) = -1 ENOENT (No such file or directory)
writev(2, [{"strace: exec: No such file or di"..., 39}, {"\n", 1}], 2strace: exec: No such file or directory
) = 40
writev(2, [{"", 0}, {NULL, 0}], 2)      = 0
getpid()                                = 12
exit_group(1)                           = ?
+++ exited with 1 +++

Obrigado

    
por Sig 07.02.2017 / 14:04

1 resposta

3

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 .

por 07.02.2017 / 19:55