No such file or directory? But the file exists!
Solution 1
You're probably trying to run a 32-bit binary on a 64-bit system that doesn't have 32-bit support installed.
There are three cases where you can get the message “No such file or directory”:
- The file doesn't exist. I presume you've checked that the file does exist (perhaps because the shell completes it).
- There is a file by that name, but it's a dangling symbolic link.
- The file exists, and you can even read it (for example, the command
file shank-linux-120720110-1-bin
displays something like “ELF 32-bit LSB executable …”), and yet when you try to execute it you're told that the file doesn't exist.
The error message in this last case is admittedly confusing. What it's telling you is that a key component of the runtime environment necessary to run the program is missing. Unfortunately, the channel through which the error is reported only has room for the error code and not for this extra information that it's really the runtime environment that's to blame. If you want the technical version of this explanation, read Getting “Not found” message when running a 32-bit binary on a 64-bit system.
The file
command will tell you just what this binary is. With a few exceptions, you can only run a binary for the processor architecture that your release of Ubuntu is for. The main exception is that you can run 32-bit (x86, a.k.a. IA32) binaries on 64-bit (amd64, a.k.a. x86_64) systems.
In Ubuntu up to 11.04, to run a 32-bit binary on a 64-bit installation, you need to install the ia32-libs
package . You may need to install additional libraries (you'll get an explicit error message if you do).
Since 11.10 (oneiric) introduced multiarch support, you can still install ia32-libs
, but you can choose a finer-grained approach, it's enough to get libc6-i386
(plus any other necessary library).
Solution 2
64 bit Ubuntu Multiarch systems
Follow this answer only if the output of file file-name
shows,
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
To run 32bit executable file in a 64 bit multi-arch Ubuntu system, you have to add i386
architecture and also you have to install libc6:i386
,libncurses5:i386
,libstdc++6:i386
these three library packages.
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name
Solution 3
To expand on @Gilles answer, there are at least three scenarios resulting in this error:
- The file doesn't exist.
- The file exists but is a dangling symbolic link.
- The file exists (e.g.
file
command works), making for a puzzling error message. This may mean there's a problem with the loader.
Categories of loader problems:
-
An executable's loader does not exist. You can check this using the file command and see if the loader does exist. E.g.
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
Notice
interpreter /lib64/ld-lsb-x86-64.so.3
; if this file does not exist, you need to install it. For this particular loader on 16.04, the answer turned out to besudo apt-get install lsb
. Issues with a script's loader (see this answer).
- Missing shared libraries -- use
ldd <file-name>
to check for any "not found" libraries. See this answer for more info.
The loader not existing could be due to a 32/64 bit mismatch or some other reason. There might be other kinds of loader errors I don't know about.
Solution 4
Here's a transcript showing a bit more about the nature of the problem, and how to fix it as of Ubuntu 16.04. Notice that even though file
reports "dynamically linked", ldd
reports "not a dynamic executable".
$ ./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
Once you install libc6:i386, things start improving...
$ 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
To complete the job, you may need to identify and install additional libraries one at a time...
$ sudo apt-get install libstdc++6:i386 ## may require various additional libs
$ ./myprogram
... works correctly ...
I don't know if there is a systematic way of identifying the correct libraries to install. There is a bit of guesswork mapping the error messages to package names (tab completion helps).
Solution 5
By installing the deb for 32 bit I realized I was missing some libraries (in addition to ia32-libs and libc6). I first solved this problem by giving this command:
sudo apt-get install -f
Then I got another error:
Message: SDL_GL_LoadLibrary
Error: Failed loading libGL.so.1
Obviously, these libraries were properly installed. Without going into details I had to link the libraries by hand. I realized then that could also an easier solution through Synaptic install the following packages:
libgl1-mesa-glx:i386
libgl1-mesa-dri: i386.
After that the next problem was the black screen while playing, which I solved by replacing the executable in /Shank/bin with this: http://treefort.icculus.org/smb/smb-linux-mesa-hotfix-test.tar.bz2.
I hope it will be useful to someone. If you need more help or more details please feel free to contact me.
Related videos on Youtube
choofie
Updated on September 18, 2022Comments
-
choofie over 1 year
I've downloaded a game (Shank) but the bin file doesn't run. The error that is shown when I try to launch the executable is:
bash: ./shank-linux-120720110-1-bin: No such file or directory
-
agent86 about 12 yearsMaybe "chmod u+x ./shank*bin" first?
-
Anake about 12 yearsalso shouldn't that be '.bin' rather than '-bin', maybe it's just a typo
-
choofie about 12 yearsThank you for your reply. I've done the command you said Agent86 but I have the same result. I've downloaded also the .deb file but there is a problem too. I don't know what problem has this game.
-
David Foerster almost 7 years@agent86: No. In that case the error message would be "Permission denied".
-
Avatar about 4 yearsIn case you run a script, use
bash -x scriptname.sh
to trace the error.
-
-
Jim C about 12 yearsThanks for a great answer, Gilles. While I haven't experienced this problem (yet!), I have filed your answer away for future reference.
-
choofie about 12 yearsI've found the solution! It's too long to write, but if anyone needs it I'm ready to help.
-
h3. about 12 years@Francesco Please do post the solution! It is likely to help other people trying to run Shank on Ubuntu. It's perfectly ok to answer your own question.
-
T_S_ about 10 yearsI would use sudo for the last command : launching a 32bit binary (so obviously not compiled by you or Ubuntu) as sudo could be risky. (well, even as non root, admitedly)
-
Avinash Raj about 10 yearswhat ever it may be at the last but it works.
-
Henry over 8 yearsYou can use
ldd
to check if you're missing a library.ldd kgio_ext.so
might say something likelibruby.so.2.3 => not found
among others -
Brent Bradburn almost 8 years
ldd
(incorrectly) reports "not a dynamic executable". -
akavel over 7 yearsThere's apparently another scenario when
bash: ...some...path...: No such file or directory
can show up: after moving the executable file. Bash seems to cache paths to executables found in $PATH; runhash -r
to clear it. See: unix.stackexchange.com/a/5610/11352 -
h3. over 7 years@akavel This question was about a scenario when the file exists. There are of course plenty of scenarios where you'll get an error message stating that a file doesn't exist and the file really does not exist.
-
akavel over 7 years@Gilles Hm; for me the case was that the file existed but at a different path (and still in $PATH). But then I agree this is arguable.
-
omikes about 7 yearsIs should be noted that if you are using CentOS or RedHat, this answer does not apply. Was thrown off for a few hours because of this.
-
Aralox about 7 yearsOn Kali 2 64 bit, I only had to install
libselinux1:i386
-
davidA almost 6 yearsIn my case,
file lmutil
didn't show the interpreter, butldd
did, and installinglsb
solved the problem. -
guilhermecgs about 5 yearsThis is an error from the dark side of mordor!! Very difficult to debug
-
Avatar about 4 yearsTip: In VSCode in the bottom right corner you can change the line terminator frin "CRLF" to "LF".
-
Martin Dale Lyness about 3 yearsRan into this additional class of errors trying to run Node 4.9.1 on an Alpine linux docker image, I had to install libc6-compat to get the
interpreter /lib64/ld-linux-x86-64.so.2
to load. Thanks for the addition! -
Xedret almost 3 yearsThis fixes the "Deadline License Server not starting" issue on Ubuntu 20.04
-
Error404 over 2 yearsWhile this link may answer the question, it is better to include the essential parts of the answer here and provide the link for reference. Link-only answers can become invalid if the linked page changes. - From Review
-
Mohamed Elleuch over 2 yearsdone, i hope that you remove that delete vote
-
Error404 over 2 yearsThanks for editing your answer, I have further edited it to improve the formatting and grammar. Don't worry about the delete vote, it would be automatically retracted soon!
-
Sandwich about 2 years
lmgrd
was the exact binary I was having problems with, thank you!