各种 shell 不会运行存在的二进制文件

各种 shell 不会运行存在的二进制文件

我下载了同一程序的几个预构建的二进制文件(nodejs-linux,-x86,-x86_64)。在不同的 shell 中,我收到类似的错误no such file or directory: node。这$PATH是正确的,二进制文件存在并且可执行。

这是因为我使用的是musl基于 linux 的发行版并且二进制文件使用的是吗glibc?我认为在这种情况下程序会崩溃或以非零值退出。

注意:@DepressionDaniel 和 @xhienne 都在下面给出了正确答案。

答案1

您的错误不是由缺少共享对象引起的,而是由于没有动态加载器由应用程序使用。

如果找不到动态加载程序,exec()则返回ENOENT给 shell,这会转换为您收到的错误消息。

如果找到动态加载程序,则exec()成功,并且动态加载程序有机会打印有关丢失共享对象的信息消息(如果应该是这种情况)。

这可以很容易地尝试,通过ls以不同的方式调整二进制文件:

cd /tmp
cp $(which ls) .
sed -e 's/libc.so.6/BAD!.so.6/' <ls >ls2
sed -e 's/ld-linux/ha-hahah/' <ls >ls3
strace ./ls2
strace ./ls3

所以,我想说你的musl基于 Linux 是如此激进,它不仅改变了glibc其他东西,还将动态加载器放在非常规的路径上,或者给它一个非常规的名称。

答案2

如果您的库与可执行文件所需的动态库不匹配,它甚至无法启动。要检查此可执行文件链接到的动态库,请执行以下操作:

ldd /path/to/executable

如果您看到=> not found,您就知道缺少什么。

相关内容