前段时间遇见了一个奇怪的问题,在执行二进制文件 protoc 的时候,报错 no such file or directory: ./protoc 。文件明明就在那里,可是一直报这个错,莫不是系统有 bug 了?
这里的二进制文件真实存在,检查权限也是对的,偏偏执行报错。第一次遇见这种问题,一时间都没有啥排查思路,这看起来就是根本不会发生的事。
大家可以先猜猜可能有哪些原因,以及如何验证?

在有 ChatGPT 之前,遇见解决不了的问题,就先去搜索引擎看看,搜索 no such file or directory but file exist ,有不少结果。这里第一个结果 No such file or directory? But the file exists! 比较匹配我的问题,在问题的高赞回答中,上来就给出了结论:可能是因为在不支持 32 位环境的 64 位机器中运行一个 32 位的二进制。具体到我的这个二进制文件,确实是从一个老的机器上拷到 64 位机器执行的。
不过为啥这样就报错?怎么知道是这个原因的? ChatGPT 在排查问题中究竟能发挥多大的作用?
完整内容在文章 ChatGPT 协助分析诡异的 no such file 问题

看见 GPT 直接关掉。😓

linux 下,如果确认文件存在,基本都是位数导致的,linux 下这个提示很脑瘫。

file 下它,还有 ldd 它看看

文件是不是你代码创建的?如果是 有没有可能是并发问题,多个线程访问同一个文件?上一个线程刚删除了 下一个线程又来读了。

这个提示确实很迷惑,不过也是因为底层 execve 返回的错误就这样,说的是找不到 ELF 链接器 文件

起始这个问题,应该是 strace 看调用,才能排查到。。

哈哈,是我的错,没说清,这里查到原因了的,在博客有写的。

怕不是对 ChatGPT 有啥误解吧,建议你多用用

之前在 chroot 下跑 golang 程序也遇到了相同问题 whoisnian.com/2023/10/17/%E5%9C%A8-chroot-jail-%E4%B8%AD%E8%BF%90%E8%A1%8CGolang%E7%A8%8B%E5%BA%8F/man 2 execveIf the executable is a dynamically linked ELF executable, the interpreter named in the PT_INTERP segment is used to load the needed shared objects.This interpreter is typically /lib/ld-linux.so.2 for binaries linked with glibc (see ld-linux.so(8)).ENOENT The file pathname or a script or ELF interpreter does not exist.

对,完全一样的问题,第一次遇见比较懵

#8 谢谢建议,不用。

前段时间遇到过这个问题,仔细分析了下,是跟 linux 动态链接器有关,关于动态链接器我博客里翻译了一篇挺好的文章: listenerri.com/2023/10/08/ld-so-linux-%E5%8A%A8%E6%80%81%E8%BF%9E%E6%8E%A5%E5%99%A8%E6%98%AF%E4%BB%80%E4%B9%88/我觉得 linux 报的找不到文件这个错误,并不是指找不到要执行的二进制文件,而是找不到二进制文件依赖的动态链接器 ld...so 文件

我看了 的言论和你的博客,我觉得他说的对

嗯,希望有一天你不会觉得自己曾经错了

对,看了你的文章,讲的不错啊。

那就让时间来让你回心转意

那不至于贵 GPT 并没有提供超出搜索引擎额外的信息量选 GPT 而不选搜索引擎,其实只是你为了满足自己“用上新鲜玩意”的虚荣心罢了对最终结果没什么影响

说白了是 ENOENT 翻译成错误信息的时候不完善。

说真的,我真不屑于在这跟你辩论这个。

嗯嗯,是的

#17 虚荣心。。真无语,多用用吧

贵 GPT 并没有提供超出搜索引擎额外的信息量GPT 确实没有添加额外的知识量,但可以减小我检索知识的成本...

我曾经碰到过类似的报错明明可执行文件存在,权限也正确,但在高级语言环境里面调用执行的时候就报cannot execute binary file一搜,都是说什么 32 位、64 位问题最后看了一堆,突然扫到别人写的/bin/sh -c ,才突然意识到自己错哪里了为了在非交互式 shell 里面加环境,都加了/bin/sh 等去加载环境、和长命令行处理然后错就错在/bin/sh -c 写成了/bin/sh -C (受 windows 兼容性 cmd /C ,一不注意写到 linux 的分支里也写了大写的-C )

你这个确实更加隐蔽,不好排查。

根据你和网友的反馈,我是这样认为的。提示 no such file or directory: ./protoc ,你是使用什么工具执行去执行这个 protoc 的,自己的 shell ,或者 crontab ,或者是服务程序,或者是 webserver 里的一个点击,等等,这个很关键,因为你是使用了相对路径点撇./,这样执行一个程序是很省事,但是有隐患的,你使用了相对路径,相对谁呢?你在 shell 里,当然是相对于当前你运行的那个窗口的 shell ,其它的执行环境就不一定了。你在你当前 shell 窗口下执行正确(排除 32 位和 64 位和链接库的问题),那就看可能是执行环境的问题了

只给出一个答案,但不一定是正确那个。你看 GPT 的话就断绝了获得更全面知识的可能性了,虽然省了时间

谁说 GPT 只给一个答案了? 另外,用 GPT 学习效率比搜索引擎快很多,获得知识也更全面的