ENOENT ou enotent? [fechadas]

0
uprego@udv1320ku12:~$ ls /usr/bin/ -thral | grep java
-rwxr-xr-x 1 root root 78 Aug 25 2010 javacc
-rwxr-xr-x 1 root root 2.5K Mar 13 2012 dh_nativejava
lrwxrwxrwx 1 root root 22 Sep 23 19:40 java -> /etc/alternatives/java
...

/usr/bin/java existe, pelo menos como uma referência a algo que pode existir e ser executável.

uprego@udv1320ku12:~$ strace /usr/bin/java
execve("/usr/bin/java", ["/usr/bin/java"], [/* 45 vars */]) = 0
...

Parece que o / usr / bin / java foi resolvido corretamente para um documento executável.

uprego@udv1320ku12:~$ ls /home/uprego/skype-4.0.0.8/ -thral
total 26M
-rw-r--r-- 1 uprego uprego 7.0K Jul 13 10:53 third-party_attributions.txt
drwxr-xr-x 2 uprego uprego 4.0K Jul 13 10:53 sounds
-rw-r--r-- 1 uprego uprego 161 Jul 13 10:53 skype.desktop
-rw-r--r-- 1 uprego uprego 453 Jul 13 10:53 skype.conf
-rwxr-xr-x 1 uprego uprego 26M Jul 13 10:53 skype
...

/home/uprego/skype-4.0.0.8/skype existe como um documento, permissão de execução em.

uprego@udv1320ku12:~$ strace /home/uprego/skype-4.0.0.8/skype
execve("/home/uprego/skype-4.0.0.8/skype", ["/home/uprego/skype-4.0.0.8/skype"],
    [/* 45 vars */]) = -1 ENOENT (No such file or directory)
...

Realmente existe?

Obrigado pela sua atenção.

    
por uprego 17.11.2012 / 20:30

1 resposta

2

Quando execve() retorna o erro ENOENT, pode significar mais de uma coisa:

  • o programa não existe;
  • o próprio programa existe, mas requer um "intérprete" que não existe.

Os executáveis ELF podem solicitar que sejam carregados por outro programa, de uma maneira muito semelhante a #!/bin/something em scripts de shell.

Normalmente, os executáveis vinculados dinamicamente solicitam /lib/ld-linux.so.2 (ou outro caminho similar), que cuida de encontrar as bibliotecas compartilhadas necessárias e carregá-las na memória antes que o próprio programa seja iniciado.

Nesse caso, acredito que você esteja tentando executar um Skype de 32 bits em um sistema de 64 bits e não tenha instalado o glibc de 32 bits e outros necessários bibliotecas. (No Debian, deve ser libc6:i386 ; no Arch, lib32-glibc .)

Para ver o caminho exato solicitado pelo programa, use readelf -l :

$ readelf -l /bin/sh | grep interpreter
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

$ readelf -l /tmp/skype-4.1.0.20/skype | grep interpreter
      [Requesting program interpreter: /lib/ld-linux.so.2]
    
por 17.11.2012 / 20:51

Tags