“Esse arquivo ou diretório não existe” em um executável, no entanto, o arquivo existe e o ldd reporta todas as bibliotecas presentes

13

Portanto, por qualquer outro comando, o arquivo executável existe, mas quando tento executá-lo, ele afirma que não está lá.

Não é um caractere especial no nome porque o renomeei como "gato". E parece ser um binário para a arquitetura correta ... "parece", acho que a pergunta é: o que mais gera uma mensagem de erro além do erro ... o arquivo não está lá, porque obviamente ESTÁ!

ldd xls

    linux-gate.so.1 =>  (0xb77bc000)
    libQtGui.so.4 => /usr/lib/i386-linux-gnu/libQtGui.so.4 (0xb6cc2000)
    libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0xb6c98000)
    libSM.so.6 => /usr/lib/i386-linux-gnu/libSM.so.6 (0xb6c8f000)
    libICE.so.6 => /usr/lib/i386-linux-gnu/libICE.so.6 (0xb6c76000)
    libXrender.so.1 => /usr/lib/i386-linux-gnu/libXrender.so.1 (0xb6c6d000)
    libfreetype.so.6 => /usr/lib/i386-linux-gnu/libfreetype.so.6 (0xb6bd1000)
    libfontconfig.so.1 => /usr/lib/i386-linux-gnu/libfontconfig.so.1 (0xb6b9b000)
    libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0xb6b88000)
    libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xb6a50000)
    libm.so.6 => /lib/i386-linux-gnu/i686/cmov/libm.so.6 (0xb6a2a000)
    libQtSql.so.4 => /usr/lib/i386-linux-gnu/libQtSql.so.4 (0xb69ea000)
    libQtCore.so.4 => /usr/lib/i386-linux-gnu/libQtCore.so.4 (0xb6704000)
    libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb66ea000)
    libgthread-2.0.so.0 => /usr/lib/i386-linux-gnu/libgthread-2.0.so.0 (0xb66e7000)
    libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xb65ea000)
    libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0xb6598000)
    librt.so.1 => /lib/i386-linux-gnu/i686/cmov/librt.so.1 (0xb658f000)
    libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xb6575000)
    libdl.so.2 => /lib/i386-linux-gnu/i686/cmov/libdl.so.2 (0xb6571000)
    libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb6485000)
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb6468000)
    libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb6305000)
    libaudio.so.2 => /usr/lib/i386-linux-gnu/libaudio.so.2 (0xb62ea000)
    libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0xb62e4000)
    libexpat.so.1 => /lib/i386-linux-gnu/libexpat.so.1 (0xb62ba000)
    libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb6297000)
    /lib/ld-lsb.so.3 => /lib/ld-linux.so.2 (0xb77bd000)
    libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xb6258000)
    libffi.so.5 => /usr/lib/i386-linux-gnu/libffi.so.5 (0xb624f000)
    libXt.so.6 => /usr/lib/i386-linux-gnu/libXt.so.6 (0xb61f1000)
    libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0xb61ee000)
    libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0xb61e8000)

uname -m (Além disso, minha distribuição é Debian wheezy.)

i686

arquivo xls

xls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 
     dynamically linked (uses shared libs), for GNU/Linux 2.6.15,
     BuildID[sha1]=0xa9786f61b371a683ae4306792f95e0636c288883, not stripped

ls -ld xls

-rwxr-xr-x 1 root root 4634064 May 20 14:35 xls

gato

root@pc170:# cat xls > zls
root@pc170:# ./zls
-su: ./zls: Permission denied
root@pc170:# chmod +x zls
root@pc170:# ./zls
-su: ./zls: No such file or directory

Tempo

root@pc170:# time ./zls
-su: ./zls: No such file or directory

real    0m0.002s
user    0m0.000s
sys     0m0.000s
Lee
fonte
1
Que tal LD_DEBUG=all /lib/ld-lsb.so.3 ./zls?
Stéphane Chazelas
1
Uma coisa é a seguinte: diz o "su: "que faz parecer que você está executando um system()ou algo dentro do programa e está dizendo que, depois disso, suele não consegue encontrar o executável no diretório em que ele termina. O que acontece se você copiar ou vincular para /binalgo assim?
Bratchley
Vamos tentar objdump -j .interp -s ./zls. Eu suspeito que irá listar o arquivo que não existe.
Derobert 20/05

Respostas:

20

Parece um carregador ausente . Resumindo: o carregador dinâmico esperado pelo programa está ausente e as mensagens de erro são enganosas neste caso. Como acho que não discuti isso antes, deixe-me explicar a parte relevante da saída de ldd. A maioria consiste em linhas do formulário library_soname => /path/to/library_file.

/lib/ld-lsb.so.3 => /lib/ld-linux.so.2 (0xb77bd000)

Entre as bibliotecas, vemos algo que não é uma biblioteca compartilhada: é o programa que carrega as bibliotecas compartilhadas. O programa está solicitando /lib/ld-lsb.so.3, mas o kernel não o encontra, por isso informa "Não existe esse arquivo ou diretório". No entanto ldd, encontra o carregador, porque lddé um script de invólucro que chama um carregador embutido em um ambiente especial, e o carregador sempre relata seu próprio caminho, independentemente do caminho que o programa esperou.

Você possui /lib/ld-linux.so.2em seu sistema, que é o local padrão de fato para o carregador ELF em sistemas Linux x86_32. O programa requer /lib/ld-lsb.so.3, que é o local padrão de jure .

Instale o suporte LSB mínimo da sua distribuição, por exemplo, o lsb-corepacote no Debian. Se a sua distribuição não tiver isso (a maioria possui), crie um link simbólico /lib/ld-lsb.so.3 -> ld-linux.so.2. Em desespero, você pode ligar o carregador explicitamente: /lib/ld-linux.so.2 ./xls.

Gilles 'SO- parar de ser mau'
fonte
De fato, o carregador é o que essa linha de objdump teria impresso. Eu esqueci que estava realmente na lddsaída. Boa pegada!
Derobert
Esse é exatamente o problema que eu vi, com a mensagem de erro enganosa. Um problema é que 'ldd' não será executado se o carregador dinâmico não estiver presente porque é (pelo menos em centos) um shell script.
Davidobe
Obrigado por esta postagem mais útil entre um grande número de postagens que falam sobre a falta de bibliotecas de 32 bits em um sistema de 64 bits.
Michael Burr
readelf -a zls | grep "Requesting program interpreter"imprimirá o carregador.
Kevin Smyth