可执行文件在当前目录中,但无法运行。

4
我遇到了一个奇怪的问题,我有一个在目录中的可执行文件,但是当我尝试运行它时,终端提示该文件不存在:
kiarashsadr@pandoras-box:~/Downloads/Tether/linux$ ls
adb  run.sh
kiarashsadr@pandoras-box:~/Downloads/Tether/linux$ ls -l total 1204 -rwxrwxr-x 1 kiarashsadr kiarashsadr 1226659 Mar 9 2013 adb -rwxrwxr-x 1 kiarashsadr kiarashsadr 521 Oct 29 2012 run.sh
kiarashsadr@pandoras-box:~/Downloads/Tether/linux$ ./adb bash: ./adb: 没有那个文件或目录
file命令返回的输出如下:
kiarashsadr@pandoras-box:~/Downloads/Tether/linux$ file adb
adb: ELF 32-bit LSB 可执行文件,Intel 80386,版本 1 (SYSV),动态链接 (使用共享库),for GNU/Linux 2.6.8,未剥离
这是怎么回事?

2
我记得当加载器找不到可执行文件引用的动态库时,会出现这个错误。这种情况可能吗? - Peter - Reinstate Monica
2
这个问题的答案http://unix.stackexchange.com/questions/120015/how-to-find-out-the-dynamic-libraries-executables-loads-when-run展示了如何获取引用库的列表。 - Peter - Reinstate Monica
1
你是否试图在64位系统上运行32位程序? - melpomene
我正在运行Ubuntu 14.04 64位操作系统。 - dsynkd
相关链接:https://dev59.com/u17Va4cB1Zd3GeqPO_kC - melpomene
显示剩余10条评论
2个回答

5

我可以确认,在那种情况下你得到的错误确实是“没有这个文件或目录”,就好像文件不存在一样。 - LSerni

1

正如VOR73X所说,在这种情况下的原因是文件是32位可执行文件,在64位架构上运行。你可以运行它,但需要兼容性层来实现。如果你有:

mintaka:/home/lserni # file ansi
ansi: 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
mintaka:/home/lserni # uname -a
Linux mintaka 4.0.1-1-default #1 SMP Wed Apr 29 15:04:53 UTC 2015 (e3a374a) x86_64 x86_64 x86_64 GNU/Linux
mintaka:/home/lserni # ./ansi
Syntax: ansi [file|-]

...否则你会得到“没有这样的文件或目录”的错误。

然而,可能有其他原因导致无法运行一个“看起来”存在(甚至确实存在)的文件。

缺少动态库会产生一个独特的错误(至少在我的系统上,Linux OpenSuSE 13.2是这样的):

./test: error while loading shared libraries: libcap.so.2: cannot open shared object file: No such file or directory

另一种可能性...

...是文件名不是你想象中的那样。你所要求的文件真的不存在!

例如(使用之前同样过时的文件)

mintaka:/home/lserni # mv ansi 'ansi '
mintaka:/home/lserni # ls -la ansi*
-rwxr-xr-x 1 root root 14268 Sep 17 23:29 ansi

文件似乎在那里,但是它的名称现在以空格结尾,所以正如您所预期的那样...
mintaka:/home/lserni # ./ansi
bash: ./ansi: No such file or directory

当然,如果文件名正确,空格可以被转义...
mintaka:/home/lserni # ./ansi\
Syntax: ansi [file|-]
mintaka:/home/lserni #

还有其他的技巧(我曾经不小心自己用过一次,也见过某些蠕虫使用这种技巧来隐藏自己以避免被随意的“ls”命令发现)。例如UTF8不可见字符。

试试看。

ls -la | hexdump -C

验证名称确实是应该的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接