Bash: 没有那个文件或目录?

Bash: No such file or directory?

我尝试在 Linux 共享网络服务器(Debian,64 位)上使用可执行脚本 (wkhtmltopdf)。我很确定我编译的一切都是正确的,但是每当我想执行文件时,我都会得到响应:

> ./wkhtmltopdf -H
-bash: ./wkhtmltopdf: No such file or directory

为了确保文件在那里,这里是 ls 输出:

> ls
wkhtmltoimage  wkhtmltopdf

此外,我在其上测试了文件命令,输出如下:

> file wkhtmltopdf
wkhtmltopdf: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

我现在的问题是:

为什么明明有bash却告诉我没有'file or directory'?

我的第一个猜测是共享服务器不允许执行二进制文件?但这不应该是权限问题,具有不同的 bash 输出吗?

编辑:

> id 
uid=2725674(p8907906) gid=600(ftpusers) groups=600(ftpusers)

> ls -l wkhtmltopdf
-rwxrwxrwx 1 p8907906 ftpusers 39745960 Jan 20 09:33 wkhtmltopdf

> ls -ld
drwx---r-x 2 p8907906 ftpusers 44 Jan 28 21:02 .

我打赌你错过了 动态链接器。就做一个

readelf --all ./wkhtmltopdf | grep interpreter

你应该得到这样的输出:

[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

您的系统很可能缺少解释器(示例中的 /lib64/ld-linux-x86-64.so.2)。在这种情况下 bash 会大喊 No such file or directory,就像二进制文件本身丢失一样。

您可以尝试使用不同的链接器。有时你可以成功。只需做一个:

/path/to/the/linker /path/to/your/executable

这个命令:

find /lib* -name ld-linux\*

将帮助您找到系统上的链接器。或者您可以在 执行 运行 的某些命令上执行 readelf 命令。它将向您显示正确的工作链接器。

,既然你是运行ning Debian系统,就做一个

sudo apt-get install wkhtmltopdf

安装本机版本的工具:)

就我而言

$ readelf --all ./wkhtmltopdf | grep interpreter # readelf: Displays information about ELF files.
      [Requesting program interpreter: /lib/ld-linux.so.2]

在运行可执行文件的机器上:

$ ls -lah /lib/ld-linux.so.2
lrwxrwxrwx 1 root root 25 Apr 16  2018 /lib/ld-linux.so.2 -> i386-linux-gnu/ld-2.27.so
$ dpkg -S /lib/ld-linux.so.2  # -S, --search filename-search-pattern: Search for a filename from installed packages.
libc6:i386: /lib/ld-linux.so.2

所以要解决问题 (reference)

sudo dpkg --add-architecture i386
sudo apt update
sudo apt install libc6:i386  # GNU C Library: Shared libraries (from apt show)

错过 linker 也是我的情况。我可以在 nsilent22 的帮助下修复它,如下所示:

readelf --all  /usr/local/myprogram | grep interpreter
[Requesting program interpreter: /lib64/ld-lsb-x86-64.so.3]

但是那个link儿已经不存在了。

/lib64 中的旧情况是:

ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.31.so
ld-linux-x86-64.so.3 -> ld-linux-x86-64.so.2

原来这只是系统linker 的符号link。

移至 /lib64 ,它本身是 usr/lib64 的 symlink 并在那里创建 symlink 无效。我假设在 Debian 将所有内容移动到 /usr

之后,有很多符号 link 级别

但是创建一个 'direct' symlink

ln -s /usr/lib64/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3

完成任务; /usr/lib64 现在显示:

ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.31.so
ld-lsb-x86-64.so.3 -> /usr/lib64/ld-linux-x86-64.so.2

我 运行 在我的 raspberry pi 4 运行 aarch64 alpine 3.13 上解决了这个问题。使用@vkersten 提供的答案,我能够确定我丢失了 /lib/ld-linux-aarch64.so.1.

我通过 apk add gcompat 安装 gcompat 解决了这个问题。