6

У меня есть скомпилированная программа, тегер для идентификации частей текста, который утверждает, что он не существует.

Когда я пытаюсь запустить его через командную строку, я получаю это:

user@place:/home/user/explicitRedactedPath$ ls tagger
tagger
user@place:/home/user/explicitRedactedPath$ ./tagger arg and other args
-bash: ./tagger: No such file or directory

Этот исполняемый файл должен вызываться сгенерированным скриптом, как я столкнулся с этой проблемой. По каким причинам может появиться эта ошибка? У меня нет идей, как это исправить.

Заметки:

  • ОС это Ubuntu
  • Исполняемый файл был скопирован с другого компьютера
  • Файл имеет привилегии выполнения (без них он выдает правильное недопустимое сообщение)
  • Я пытался скопировать файл в другое место (та же проблема)
  • Я пытался заменить файл свежей копией (та же проблема)
  • Файл существует. Открытие его с пико показывает файл с двоичными данными.

5 ответов5

7

Программа была скомпилирована для несовместимой архитектуры, что привело к неисполняемой программе. Сообщение об ошибке "не существует" вместо "неверный исполняемый файл" является очень вводящим в заблуждение сообщением.

Перекомпиляция на целевой машине устранила проблему.

4

У меня была проблема, очень похожая на OP (./lfm: Command not found. Когда я смотрел прямо на нее), и некоторые ответы здесь помогли мне понять, как запустить мой исполняемый файл в другой системе без перекомпиляции. Вот как я мог бы посоветовать себя прошлым (если бы я думал, что прошлый я достаточно умен, чтобы выслушать изменения):

1) Убедитесь, что файл не является неработающей ссылкой, у него есть права на выполнение и что вы не пытаетесь запустить 64-разрядный исполняемый файл в 32-разрядной ОС (для меня file lfm вернул lfm: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped поэтому он 64-битный; проверьте вывод uname -a для x86_64 в это, чтобы проверить, что ОС тоже 64-битная; i386 или i686 означает 32-битная) (в этих примерах, конечно, замените имя вашей программы на lfm ).

2) ldd lfm вернул нечетное not a dynamic executable сообщение (вместо печати зависимостей общей библиотеки), поэтому попробуйте readelf -l ./lfm | grep ld-linux чтобы узнать, где исполняемый файл ожидает найти ld-linux, который является загрузчиком linux для динамически связанных библиотек (в моем случае это вернуло [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]).

3) Проверка каталога, указанного предыдущей командой, показывает, что указанного файла ld-linux там нет; скопируйте его с компьютера, на котором изначально была скомпилирована программа (или аналогичная система, если необходимо), в этот каталог.

4) Попробуйте снова запустить оригинальную программу. (Работал на меня.) Кроме того, ldd ./lfm теперь должен работать (но вы всегда можете использовать readelf -d ./lfm чтобы увидеть, какие библиотеки нужны, а затем убедиться, что они доступны.)

1

Вероятно, теггер - это мягкая ссылка, и цель ссылки не существует. Воспроизведите так:

$ cp /usr/bin/ld .
$ ln -s ld fff
$ rm ld
$ ./fff
zsh: no such file or directory: ./fff
0

Если вы не можете перекомпилировать, вы можете рассмотреть возможность использования statifier для преобразования динамического исполняемого файла в статически связанный. Обратите внимание, я лично не пробовал это.

0

Возможно, вам не хватает общих библиотек.

Сделайте 'ldd tagger', чтобы увидеть список необходимых библиотек.

% ldd /bin/zsh                                                                                   
libcap.so.2 => /lib/libcap.so.2 (0x00007f50ce8db000)
libdl.so.2 => /lib/libdl.so.2 (0x00007f50ce6d7000)
libm.so.6 => /lib/libm.so.6 (0x00007f50ce201000)
libc.so.6 => /lib/libc.so.6 (0x00007f50cdea0000)
libattr.so.1 => /lib/libattr.so.1 (0x00007f50cdc9b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f50ceaf8000)

Если один из них отсутствует, рядом с ним не будет пути.

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