Немає такого файлу чи каталогу? Але файл існує!


186

Я завантажив гру (Shank), але файл bin не працює. Помилка, яка з’являється при спробі запуску виконуваного файлу, є:

bash: ./shank-linux-120720110-1-bin: No such file or directory

2
Може, спочатку "chmod u + x ./shank*bin"?
агент86

також не повинно бути ".bin", а не "-bin", можливо, це просто помилка
Anake

Дякую за відповідь Я виконав команду, яку ви сказали, агент86, але в мене такий же результат. Я завантажив також .deb файл, але теж є проблема. Я не знаю, з якою проблемою є ця гра.
Франческо

Підтвердьте, чи використовується 64-розрядна установка (це найпоширеніший випадок цієї проблеми).
Жиль

Так, я підтверджую, що я використовую 64-бітну архітектуру на своєму ноутбуці.
Франческо

Відповіді:


235

Ви, ймовірно, намагаєтеся запустити 32-розрядний бінарний файл у 64-бітній системі, на якій не встановлена ​​32-бітна підтримка.

Є три випадки, коли ви можете отримати повідомлення "Немає такого файлу чи каталогу":

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

Повідомлення про помилку в цьому останньому випадку, очевидно, заплутане. Це вам говорить, що ключовий компонент середовища виконання, необхідний для запуску програми, відсутній. На жаль, на каналі, через який повідомляється про помилку, є лише місце для коду помилки, а не для цієї додаткової інформації, що справді це середовище виконання. Якщо ви хочете отримати технічну версію цього пояснення, прочитайте повідомлення "Не знайдено" під час запуску 32-розрядного двійкового файлу в 64-бітній системі .

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

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

Оскільки 11.10 (oneiric) запровадив підтримку мультиарха , ви все ще можете встановити ia32-libs, але ви можете обрати більш тонкий підхід, достатньо отримати (плюс будь-яку іншу необхідну бібліотеку).libc6-i386 Встановіть libc6-i386


Дякую за чудову відповідь, Жилле. Поки я ще не відчув цієї проблеми (поки що!), Я відправив вашу відповідь для подальшої довідки.
Джим C

Дякую за вичерпну відповідь! Я завантажив скриньку файлів, був єдиним у цьому форматі (бін). Тому я думаю, що це добре для всіх архітектур. Я також завантажив .deb файл для моєї архітектури (64bit), але з різною помилкою. На даний момент я думаю, що на гру впливають деякі помилки, або я не можу встановити цю гру. Зараз я намагаюся завантажити libc6-i386, і я все ще намагаюся його встановити. Я напишу ще раз, якщо будуть суттєві зміни. Дякую за ваш час.
Франческо

2
@Francesco Будь ласка, розмістіть рішення! Ймовірно, це допоможе іншим людям, які намагаються запустити Шенк на 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 може бути ризикованим. (ну, навіть як поза коренем, з адміністрацією)
alci

що коли-небудь може бути нарешті, але це працює.
Авінаш Радж

1
Слід зазначити, що якщо ви використовуєте CentOS або RedHat, ця відповідь не застосовується. Через це було скинуто на кілька годин.
omikes

1
На Kali 2 64 біт мені довелося лише встановитиlibselinux1:i386
Aralox

4

Встановивши деб для 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 .

Я сподіваюся, що комусь буде корисно. Якщо вам потрібна додаткова допомога або більше деталей, будь ласка, не соромтеся зв’язатися зі мною.


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

Я не знаю, чи існує систематичний спосіб визначення правильних бібліотек для встановлення. Існує трохи здогадів, які відображають повідомлення про помилки з іменами пакунків (доповнення вкладки допомагає).


ldd(неправильно) повідомляє "не динамічний виконуваний файл".
nobar

3

Щоб розширити відповідь на @Gilles, існує щонайменше три сценарії, що призводять до цієї помилки:

  1. Файл не існує.
  2. Файл існує, але є звисаючим символічним посиланням.
  3. Файл існує (наприклад, fileпрацює команда), створюючи дивовижне повідомлення про помилку. Це може означати, що проблема з завантажувачем.

Категорії проблем із завантажувачем:

  1. Завантажувач виконуваного файлу не існує. Ви можете перевірити це за допомогою команди файлів і побачити, чи існує завантажувач. Напр

    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 біт або іншої причини. Можуть бути й інші помилки завантажувача, про які я не знаю.


1
У моєму випадку file lmutilне показав перекладача, але lddзробив, і встановлення lsbвирішило проблему.
davidA
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.