it-swarm.dev

Žádný takový soubor nebo adresář? Ale soubor existuje!

Stáhl jsem hru (Shank), ale soubor bin se nespustí. Chyba, která se zobrazí při pokusu o spuštění spustitelného souboru, je:

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

Pravděpodobně se pokoušíte spustit 32bitový binární soubor v 64bitovém systému, který nemá nainstalovanou 32bitovou podporu.

Existují tři případy, kdy se zobrazí zpráva „Žádný takový soubor nebo adresář“:

  • Soubor neexistuje. Předpokládám, že jste zkontrolovali, že soubor existuje (snad proto, že jej Shell dokončí).
  • Existuje soubor s tímto jménem, ​​ale je to visící symbolický odkaz.
  • Soubor existuje a můžete si ho dokonce přečíst (například příkaz file shank-linux-120720110-1-bin zobrazuje něco jako „ELF 32-bitový spustitelný LSB…“), a přesto se při pokusu o jeho spuštění zobrazí, že soubor neexistuje.

Chybová zpráva v tomto posledním případě je sice matoucí. Říká vám, že chybí klíčová součást běhového prostředí nezbytná pro spuštění programu. Kanál, jehož prostřednictvím se chyba hlásí, má bohužel pouze prostor pro kód chyby a nikoli pro tuto další informaci, že je to skutečně runtime prostředí, za které je možné vinu. Pokud chcete technickou verzi tohoto vysvětlení, přečtěte si zprávu Získání zprávy „Nenalezeno“ při spuštění 32bitového binárního systému v 64bitovém systém .

Příkaz file vám řekne, co je tento binární. Až na několik výjimek můžete binární proces spustit pouze pro architekturu procesoru, pro kterou je vaše vydání Ubuntu určeno. Hlavní výjimkou je, že na 64bitových (AMD64, a.k.a. x86_64) systémech můžete spustit 32bitové (x86, a.k.a. IA32) binární soubory.

V Ubuntu až do 11.04, chcete-li spustit 32bitový binární soubor v 64bitové instalaci, musíte nainstalovat ia32-libs balíčekInstall ia32-libs . Možná budete muset nainstalovat další knihovny (obdržíte explicitní chybovou zprávu, pokud ano).

Vzhledem k tomu, že byla zavedena podpora 11.10 (oneiric) multiarch , můžete nainstalovat ia32-libs, ale můžete si vybrat jemnější přístup, stačí získat libc6-i386Install libc6-i386 (plus jakákoli další nezbytná knihovna).

64bitové systémy Ubuntu Multiarch

Tuto odpověď sledujte pouze v případě, že se zobrazuje výstup 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

Chcete-li spustit 32bitový spustitelný soubor v 64bitovém systému Multi-Arch Ubuntu, musíte přidat architekturu i386 A také musíte nainstalovat libc6:i386, libncurses5:i386, libstdc++6:i386 tyto tři balíčky knihoven.

Sudo dpkg --add-architecture i386
Sudo apt-get update
Sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name
57
Avinash Raj

Rozbalit na @Gilles odpověď, existují alespoň tři scénáře vedoucí k této chybě:

  1. Soubor neexistuje.
  2. Soubor existuje, ale je to visící symbolický odkaz.
  3. Soubor existuje (např. Příkaz file funguje), což způsobuje záhadnou chybovou zprávu. To může znamenat, že je problém s nakladačem.

Kategorie problémů s nakladačem:

  1. Zavaděč spustitelného souboru neexistuje. Můžete to zkontrolovat pomocí příkazu file a zjistit, zda zavaděč existuje. Např.

    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
    

    Oznámení interpreter /lib64/ld-lsb-x86-64.so.3; pokud tento soubor neexistuje, musíte jej nainstalovat. U tohoto konkrétního zavaděče dne 16.04 se ukázala odpověď Sudo apt-get install lsb .

  2. Problémy se zavaděčem skriptu (viz tato odpověď ).

  3. Chybějící sdílené knihovny - použijte ldd <file-name> zkontrolovat všechny knihovny „nenalezeny“. Více informací viz tato odpověď .

Zavaděč, který neexistuje, může být způsoben 32/64 bitovým neshodou nebo jiným důvodem. Mohou existovat další druhy chyb zavaděče, o kterých nevím.

4
jtpereyda

Instalací debetu na 32 bitů jsem si uvědomil, že mi chybí některé knihovny (kromě ia32-libs a libc6). Nejprve jsem tento problém vyřešil zadáním tohoto příkazu:

Sudo apt-get install -f          

Pak jsem dostal další chybu:

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

Tyto knihovny byly samozřejmě správně nainstalovány. Aniž bych šel do podrobností, musel jsem knihovny propojit ručně. Uvědomil jsem si, že to může také usnadnit řešení pomocí Synaptic nainstalovat následující balíčky:

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

Poté byl dalším problémem černá obrazovka při hraní, kterou jsem vyřešil nahrazením spustitelného souboru v/Shank/bin tímto: http://treefort.icculus.org/smb/smb-linux-mesa-hotfix -test.tar.bz2 .

Doufám, že to bude pro někoho užitečné. Pokud potřebujete další pomoc nebo více podrobností, neváhejte mě kontaktovat.

4
Francesco

Zde je přepis ukazující trochu více o povaze problému a jak jej opravit jako u Ubuntu 16.04. Všimněte si, že i když file hlásí „dynamicky propojený“, ldd hlásí „není dynamický spustitelný soubor“.

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

Po instalaci libc6: i386 se věci začnou zlepšovat ...

$ 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

Chcete-li dokončit úlohu, možná budete muset identifikovat a nainstalovat další knihovny po jedné ...

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

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

Nevím, jestli existuje systematický způsob identifikace správných knihoven k instalaci. Existuje trochu hádání mapování chybových zpráv na názvy balíčků (pomoc s dokončováním karty).

3
nobar

K této chybě dochází při práci na systému Windows (který zavádí další znaky z důvodu jiného oddělovače řádků než systém Linux) a při pokusu o spuštění tohoto skriptu (s vloženými dalšími znaky) v systému Linux. Chybová zpráva je zavádějící.

V systému Windows je oddělovač řádku CRLF (\ r\n), zatímco v linuxu je LF (\ n). případ se to stalo kvůli práci na Windows a nahrávání na Unix server k provedení.

0
PALEN