Я скачал игру (Shank), но файл bin не запускается. Ошибка, которая отображается при попытке запустить исполняемый файл:
bash: ./shank-linux-120720110-1-bin: No such file or directory
Я скачал игру (Shank), но файл bin не запускается. Ошибка, которая отображается при попытке запустить исполняемый файл:
bash: ./shank-linux-120720110-1-bin: No such file or directory
Ответы:
Вероятно, вы пытаетесь запустить 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
пакет . Возможно, вам придется установить дополнительные библиотеки (в противном случае вы получите явное сообщение об ошибке).
Поскольку в 11.10 (oneiric) появилась поддержка multiarch , вы все равно можете установить ia32-libs
, но вы можете выбрать более детальный подход, которого достаточно получить (плюс любую другую необходимую библиотеку).libc6-i386
ldd
чтобы проверить, если вы пропустили библиотеку. ldd kgio_ext.so
может сказать что-то подобное libruby.so.2.3 => not found
среди других
bash: ...some...path...: No such file or directory
может появиться: после перемещения исполняемого файла. Кажется, что Bash кеширует пути к исполняемым файлам, найденным в $ PATH; бежать, hash -r
чтобы очистить это. См: unix.stackexchange.com/a/5610/11352
Следуйте этому ответу, только если вывод 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
libselinux1:i386
Установив 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 .
Надеюсь это кому-нибудь пригодится. Если вам нужна дополнительная помощь или более подробная информация, пожалуйста, не стесняйтесь связаться со мной.
Вот расшифровка стенограммы, показывающая немного больше о природе проблемы и о том, как ее исправить, начиная с 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 ...
Я не знаю, существует ли систематический способ определения правильных библиотек для установки. Есть немного догадок, отображающих сообщения об ошибках на имена пакетов (помогает завершение табуляции).
ldd
(неправильно) сообщает "не динамический исполняемый файл".
Чтобы расширить ответ @Gilles, есть как минимум три сценария, приводящие к этой ошибке:
file
команда работает), создавая удивительное сообщение об ошибке. Это может означать, что есть проблема с загрузчиком.Категории проблем с загрузчиком:
Загрузчик исполняемого файла не существует. Вы можете проверить это с помощью команды 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
.
Проблемы с загрузчиком скрипта (см. Этот ответ ).
ldd <file-name>
для проверки любых «не найденных» библиотек. Смотрите этот ответ для получения дополнительной информации.Загрузчик не существует может быть из-за несоответствия 32/64 бит или по другой причине. Могут быть и другие ошибки загрузчика, о которых я не знаю.
file lmutil
не показывал переводчик, но ldd
сделал, и установка lsb
решила проблему.