bash утверждает, что исполняемый файл не существует при попытке выполнить его, но он существует - PullRequest
0 голосов
/ 25 июня 2019

Самый странный опыт, который я не могу объяснить, и заставляет меня вырывать волосы.У меня есть двоичный исполняемый файл MMM, и он существует, я вижу, что у него установлено разрешение x, bash даже автоматически завершает имя, когда я нажимаю клавишу TAB, и файл подтверждает его исполняемый файл, но это происходит:

~/tmp$ ls -l
total 56
-rwxrwxr-x 1 polyphemus polyphemus 56948 Jun 25 22:43 MMM
~/tmp$ file MMM
MMM: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 2.2.5, stripped
~/tmp$ ./MMM
-bash: ./MMM: No such file or directory

Таким образом, я скопировал этот файл с другого сервера, и чтобы убедиться, что у меня не происходит какое-то странное повреждение файла, не то чтобы это объясняло нелепое утверждение bash о том, что файл не существует, я скопировал файл на NAS и изNAS вернулся на другой сервер и повторил точно такой же эксперимент, только это происходит:

~/tmp$ ls -l
total 56
-rwxr-xr-x 1 bernd bernd 56948 Jun 25 22:53 MMM
~/tmp$ file MMM 
MMM: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 2.2.5, stripped
~/tmp$ ./MMM
JAVA_HOME is not set. ./MMM cannot start.

, если это помогает, они оба являются блоками Linux Mint, тот, на котором он работает, - это компьютер для разработки с Mint 19 и тот,там, где он не работает, это свежая установка Mint 19.1.

Установка работает нормально, другие исполняемые файлы работают нормально, и я могу затем запустить в bash ./file.

Я изучал исравнил магазинчики и ничего не нашел, псевдонимы и ничего не нашел.Это заставляет меня вырывать волосы.Я надеюсь, что кто-то видел это раньше.

Ответы [ 3 ]

0 голосов
/ 25 июня 2019

хорошо, ошибка, кажется, с переменной JAVA_HOME env

JAVA_HOME is not set. ./MMM cannot start.

Просто установите JAVA_HOME из любой используемой вами версии Java

вы можете запустить его как показано

JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::") ./MMM
0 голосов
/ 26 июня 2019

Благодаря указанию Денниса Уильямсона проблему можно охарактеризовать следующим образом:

  1. Это хорошо известная проблема.В этом есть ограничение ядра, которое означает, что bash получает только код состояния (тот, что для «файл не найден») без каких-либо описательных данных, когда ядро ​​пытается загрузить файл, необходимый для запуска двоичного файла.Сообщение действительно разочаровывающе вводит в заблуждение, и это широко известная и понятная проблема.
  2. Как отмечено в самом вопросе, это двоичный файл ELF: https://en.wikipedia.org/wiki/Executable_and_Linkable_Format, и интерпретатор, необходимый для такого abinar, может быть предсказанс readelf -a MMM | grep interpreter, который производит [Requesting program interpreter: /lib/ld-linux.so.2]
  3. Легко видеть, что этот файл отсутствует в моей системе, и получается, что для его установки нам нужно просто установить библиотеки lib6 для 32-битной архитектуры с sudo apt install libc6:i386

После этого проблемный сценарий, который меня смущал, теперь выглядит как рабочий сценарий:

~/tmp$ ls -l
total 56
-rwxrwxr-x 1 polyphemus polyphemus 56948 Jun 25 22:43 MMM
~/tmp$ file MMM
MMM: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 2.2.5, stripped
~/tmp$ ./MMM
JAVA_HOME is not set. ./MMM cannot start.

И двоичный файл работает очень хорошо!

Приятнорезультат.Большое спасибо StackOverflow и Деннису Уильямсону.

0 голосов
/ 25 июня 2019

Это может быть библиотека, которая не может быть загружена (потому что ее нет в вашей системе) с ошибочным сообщением об ошибке.Попробуйте:

ldd .MMM

, это даст вам динамические библиотеки, которые пытаются загрузить, и сообщит вам, если одна из них отсутствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...