我下载了同一程序的几个预构建的二进制文件(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
,您就知道缺少什么。