Quando exec*
retorna -ENOENT
, o binário está faltando ou o interpretador está faltando.
Obviamente, /bin/ps
existe, caso contrário não estaria em hash no shell. Mas o vinculador dinâmico do qual depende provavelmente não existe no seu sistema. Se o GNU binutils estiver instalado, você poderá determinar facilmente se este é o caso.
$ readelf -l /bin/ps … INTERP 0x0000000000000270 0x0000000000400270 0x0000000000400270 0x000000000000001c 0x000000000000001c R 1 [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] …
/lib64/ld-linux-x86-64.so.2
existe na minha máquina de teste híbrida Debian Squeeze / Sid.
Uma possibilidade é que você de alguma forma instalou pacotes de 32 bits sem as bibliotecas de 32 bits necessárias. Por exemplo, se eu tentar executar um binário de 32 bits em um sistema somente de 64 bits,
# on another system for 32-bit development $ echo 'int main(){}' > 32bit.c $ cc -m32 -o 32bit 32bit.c # on a 64-bit system without 32-bit libraries $ ./32bit -bash: ./32bit: No such file or directory $ readelf -l 32bit … INTERP 0x000154 0x08048154 0x08048154 0x00013 0x00013 R 0x1 [Requesting program interpreter: /lib/ld-linux.so.2] … $ ls /lib/ld-linux.so.2 ls: cannot access /lib/ld-linux.so.2: No such file or directory
Outra possibilidade é que você está tentando executar binários LSB em um sistema sem bibliotecas básicas de LSB instaladas, por exemplo, um cenário como o link ou a tentativa de usar pacotes baseados no Glibc em um sistema somente µClibc ou em várias outras situações semelhantes.
Eu tenho que perguntar - como este sistema foi instalado? Nada disso será verdade por padrão, alguém teve que se meter com as coisas.