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]