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 существует, по крайней мере, как ссылка на что-то, что может существовать и быть исполняемым.

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

Кажется, /usr /bin /java правильно разрешен для исполняемого документа.

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 существует как документ, разрешение exec для.

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)
...

Это действительно существует?

Спасибо за внимание.

1 ответ1

2

Когда execve() возвращает ошибку ENOENT, это может означать несколько вещей:

  • программа не существует;
  • сама программа существует, но для нее требуется "интерпретатор", которого не существует.

Исполняемые файлы ELF могут запрашивать загрузку другой программой, очень похоже на #!/bin/something в скриптах оболочки.

Обычно динамически связанные исполняемые файлы запрашивают /lib/ld-linux.so.2 (или другой подобный путь), который заботится о поиске необходимых разделяемых библиотек и загрузке их в память до запуска самой программы.

В этом случае я предполагаю, что вы пытаетесь запустить 32-битный Skype в 64-битной системе, и вы не установили 32-битный glibc и другие необходимые библиотеки. (В Debian это должен быть libc6:i386 ; в Arch - lib32-glibc .)

Чтобы увидеть точный путь, запрошенный программой, используйте 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]

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .