Данный файл или каталог отсутствует? Но файл существует!

186

Я скачал игру (Shank), но файл bin не запускается. Ошибка, которая отображается при попытке запустить исполняемый файл:

bash: ./shank-linux-120720110-1-bin: No such file or directory
Francesco
источник
2
Может быть, "chmod u + x ./shank*bin" первым?
agent86
также не должно быть это «.bin», а не «-bin», может быть, это просто опечатка
Anake
Спасибо за ваш ответ. Я выполнил команду, которую вы сказали Agent86, но у меня тот же результат. Я также скачал файл .deb, но есть проблема. Я не знаю, в чем проблема этой игры.
Франческо
Пожалуйста, подтвердите, используете ли вы 64-битную установку (это наиболее распространенный случай для этой проблемы).
Жиль
Да, я подтверждаю, что использую 64-разрядную архитектуру на своем ноутбуке.
Франческо

Ответы:

236

Вероятно, вы пытаетесь запустить 32-разрядный двоичный файл в 64-разрядной системе, в которой не установлена ​​32-разрядная поддержка.

В трех случаях вы можете получить сообщение «Нет такого файла или каталога»:

  • Файл не существует. Я предполагаю, что вы проверили, что файл существует (возможно, потому что оболочка завершает его).
  • Файл с таким именем существует, но это свисающая символическая ссылка.
  • Файл существует, и вы даже можете прочитать его (например, команда file shank-linux-120720110-1-binотображает что-то вроде «ELF 32-битный исполняемый файл LSB…»), и все же, когда вы пытаетесь выполнить его, вам говорят, что файл не существует.

Сообщение об ошибке в этом последнем случае, по общему признанию, сбивает с толку. Это говорит о том, что отсутствует ключевой компонент среды выполнения, необходимый для запуска программы. К сожалению, канал, по которому сообщается об ошибке, имеет место только для кода ошибки, а не для этой дополнительной информации, которая действительно виновата в среде выполнения. Если вам нужна техническая версия этого объяснения, прочитайте сообщение Получение «Не найдено» при запуске 32-разрядного двоичного файла в 64-разрядной системе .

Команда fileскажет вам, что это за двоичный файл. За некоторыми исключениями, вы можете запустить только двоичный файл для архитектуры процессора, для которой предназначен ваш выпуск Ubuntu. Основным исключением является то, что вы можете запускать 32-битные (x86, aka IA32) двоичные файлы в 64-битных (amd64, aka x86_64) системах.

В Ubuntu до 11.04 для запуска 32-разрядного двоичного файла в 64-разрядной установке необходимо установить ia32-libsпакет Установить ia32-libs . Возможно, вам придется установить дополнительные библиотеки (в противном случае вы получите явное сообщение об ошибке).

Поскольку в 11.10 (oneiric) появилась поддержка multiarch , вы все равно можете установить ia32-libs, но вы можете выбрать более детальный подход, которого достаточно получить (плюс любую другую необходимую библиотеку).libc6-i386 Установите libc6-i386

жилль
источник
Спасибо за отличный ответ, Жиль. Хотя я еще не сталкивался с этой проблемой (пока!), Я оставил ваш ответ для дальнейшего использования.
Джим С
Спасибо за исчерпывающий ответ! Файл bin, который я скачал, был единственным, доступным в этом формате (bin). Так что я думаю, что это хорошо для всех архитектур. Я также скачал файл .deb для моей архитектуры (64 бита), но с другой ошибкой. На данный момент я думаю, что на игру влияют некоторые ошибки, или я не могу установить эту игру. Сейчас я пытаюсь загрузить libc6-i386 и все еще пытаюсь установить его. Я напишу снова, если будут значительные изменения. Спасибо за ваше время.
Франческо
2
@Francesco Пожалуйста, опубликуйте решение! Это может помочь другим людям, пытающимся запустить Shank на Ubuntu. Это нормально, чтобы ответить на свой вопрос .
Жиль
1
Вы можете использовать, lddчтобы проверить, если вы пропустили библиотеку. ldd kgio_ext.soможет сказать что-то подобное libruby.so.2.3 => not foundсреди других
EnabrenTane
1
Очевидно, есть другой сценарий, когда bash: ...some...path...: No such file or directoryможет появиться: после перемещения исполняемого файла. Кажется, что Bash кеширует пути к исполняемым файлам, найденным в $ PATH; бежать, hash -rчтобы очистить это. См: unix.stackexchange.com/a/5610/11352
akavel
53

64-битные системы Ubuntu Multiarch

Следуйте этому ответу, только если вывод file file-nameпоказывает,

file-name: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped

Для того, чтобы запустить 32 - битный исполняемый файл в 64 битном мульти-арочной системы Ubuntu, вы должны добавить i386архитектуру , а также вы должны установить libc6:i386, libncurses5:i386, libstdc++6:i386эти три библиотеки пакетов.

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name
Авинаш Радж
источник
Я бы использовал sudo для последней команды: запуск 32-битного двоичного файла (так что очевидно, что он не скомпилирован вами или Ubuntu), поскольку sudo может быть рискованным. (ну, даже не как root, восхищенно)
alci
что бы это ни было в конце концов, но это работает.
Авинаш Радж
1
Следует отметить, что если вы используете CentOS или RedHat, этот ответ не применяется. Был скинут на несколько часов из-за этого.
omikes
1
На Кали 2 64 бит, мне оставалось только установитьlibselinux1:i386
Aralox
4

Установив deb для 32-битной системы, я понял, что мне не хватает некоторых библиотек (в дополнение к ia32-libs и libc6). Сначала я решил эту проблему, дав следующую команду:

sudo apt-get install -f          

Тогда я получил еще одну ошибку:

Message: SDL_GL_LoadLibrary 
Error: Failed loading libGL.so.1

Очевидно, что эти библиотеки были правильно установлены. Не вдаваясь в детали, мне пришлось связывать библиотеки вручную. Тогда я понял, что через Synaptic можно было бы также проще установить следующие пакеты:

libgl1-mesa-glx:i386
libgl1-mesa-dri: i386.

После этого следующей проблемой был черный экран во время игры, который я решил, заменив исполняемый файл в / Shank / bin следующим: http://treefort.icculus.org/smb/smb-linux-mesa-hotfix-test.tar .bz2 .

Надеюсь это кому-нибудь пригодится. Если вам нужна дополнительная помощь или более подробная информация, пожалуйста, не стесняйтесь связаться со мной.

Francesco
источник
3

Вот расшифровка стенограммы, показывающая немного больше о природе проблемы и о том, как ее исправить, начиная с Ubuntu 16.04. Обратите внимание, что хотя fileотчеты «динамически связаны», они ldd«не являются динамическими исполняемыми файлами».

$ ./myprogram
bash: myprogram: No such file or directory

$ file myprogram
myprogram: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.2.5, not stripped

$ ldd myprogram
    not a dynamic executable

После установки libc6: i386 все начинает улучшаться ...

$ sudo apt-get install libc6:i386 # the initial fix
...

$ ldd myprogram
    linux-gate.so.1 =>  (0xf77fd000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7626000)
    /lib/ld-linux.so.2 (0x56578000)

$ ./myprogram
myprogram: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

Чтобы завершить работу, вам может понадобиться определить и установить дополнительные библиотеки по одной за раз ...

$ sudo apt-get install libstdc++6:i386 ## may require various additional libs

$ ./myprogram
... works correctly ...

Я не знаю, существует ли систематический способ определения правильных библиотек для установки. Есть немного догадок, отображающих сообщения об ошибках на имена пакетов (помогает завершение табуляции).

nobar
источник
ldd(неправильно) сообщает "не динамический исполняемый файл".
Нобар
3

Чтобы расширить ответ @Gilles, есть как минимум три сценария, приводящие к этой ошибке:

  1. Файл не существует.
  2. Файл существует, но является висячей символической ссылкой.
  3. Файл существует (например, fileкоманда работает), создавая удивительное сообщение об ошибке. Это может означать, что есть проблема с загрузчиком.

Категории проблем с загрузчиком:

  1. Загрузчик исполняемого файла не существует. Вы можете проверить это с помощью команды file и посмотреть, существует ли загрузчик. Например

    file lmgrd
    lmgrd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-lsb-x86-64.so.3, for GNU/Linux 2.6.18, stripped
    

    Обратите внимание interpreter /lib64/ld-lsb-x86-64.so.3; если этот файл не существует, вам необходимо установить его. Для данного конкретного загрузчика 16.04 ответ оказался sudo apt-get install lsb.

  2. Проблемы с загрузчиком скрипта (см. Этот ответ ).

  3. Отсутствуют общие библиотеки - используйте ldd <file-name>для проверки любых «не найденных» библиотек. Смотрите этот ответ для получения дополнительной информации.

Загрузчик не существует может быть из-за несоответствия 32/64 бит или по другой причине. Могут быть и другие ошибки загрузчика, о которых я не знаю.

jtpereyda
источник
1
В моем случае file lmutilне показывал переводчик, но lddсделал, и установка lsbрешила проблему.
Давида