bash: ./xxx: No such file or directory

问题现象

在使用开源或他人可执行文件的时候,可能会遇到 bash: ./squashfs2sparse: No such file or directory 的报错;实际测试发现该文件存在,并且有可执行权限;

问题分析

通过对报错文件的分析

1:文件具有可执行权限;

2:文件编译的系统和当前系统一致;x86-64

3:可执行文件依赖一个私人路径的.so库,在当前电脑是没有该路径的

bash 复制代码
# 文件执行报错
djq@huali-virtual-machine:~/linux_os/$ ./squashfs2sparse 
bash: ./squashfs2sparse: No such file or directory

# 文件具有可执行权限
djq@huali-virtual-machine:~/linux_os/$ ls -lh squashfs2sparse 
-rwxr-xr-x 1 djq huali 13K Jan 17 11:32 squashfs2sparse

# 文件依赖一个私人绝对路径的动态库 ld-linux-x86-64.so.2
djq@huali-virtual-machine:~/linux_os/$ file squashfs2sparse 
back_squashfs2sparse: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /home/v1804/auto_build/apps_proc/build-qti-distro-tele-perf/tmp-glibc/sysroots-uninative/x86_64-linux/lib/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=1193336dc96c0c6bb7d19027812c9b511cf2278f, stripped

问题解决

我们可以使用 patchelf 工具,来修改 动态库的依赖路径;前提是个人环境下必须要有该动态库,才可以进行修改;

bash 复制代码
# ldd查看文件依赖的动态库
djq@huali-virtual-machine:~/linux_os/$ ldd squashfs2sparse 
        linux-vdso.so.1 (0x00007ffe1fbd0000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f306e339000)
        /home/v1804/auto_build/apps_proc/build-qti-distro-tele-perf/tmp-glibc/sysroots-uninative/x86_64-linux/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f306e743000)

# ls -lh 查看本机电脑相同动态库的路径
djq@huali-virtual-machine:~/linux_os/$ ls -lh /lib64/ld-linux-x86-64.so.2                
lrwxrwxrwx 1 root root 32 May  1  2024 /lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.31.so

# patchelf 修改动态库的依赖路径
djq@huali-virtual-machine:~/linux_os/$ patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 squashfs2sparse

# file 再次查看文件依赖,已经没有了个人路径库
djq@huali-virtual-machine:~/linux_os/$ file squashfs2sparse 
squashfs2sparse: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=1193336dc96c0c6bb7d19027812c9b511cf2278f, stripped

# 再次执行,可以执行成功
djq@huali-virtual-machine:~/linux_os/$ ./squashfs2sparse
squashfs_sparse  -  is used to prepare image which supports block update tested only for squashfs image .
  squashfs_sparse is tested only for squashfs image, please check before using for any other fs type image 
  correct usage squashfs_sparse system.squash system.img
相关推荐
开开心心就好6 分钟前
电脑小说阅读器,支持朗读和自定义皮肤
服务器·开发语言·javascript·算法·pdf·c#·音视频
Smoothcloud润云15 分钟前
GPU远程纳管节点频繁离线?心跳、DNS与时钟排障实战
运维·服务器·开发语言·人工智能·php·gpu算力
class心平气和19 分钟前
ADB 工具函数 Python 使用教程
开发语言·python·adb
滕州市燕猫虎计算机科技工作室个体工商户1 小时前
Java,Java NIO,Java NIO2,Java AIO,AsynchronousServerSocketChannel
java·开发语言·nio·aio·nio2
古城小栈1 小时前
Rust 学习路线,供初学者参考
开发语言·rust
云计算练习生1 小时前
什么是 Bash?Linux 默认 Shell 的核心功能
linux·操作系统·bash·shell·命令解释器
喵了几个咪1 小时前
GoWind CMS 拆解:给 NL2SQL 上四把锁——智能问数的安全边界
开发语言·后端·安全·微服务·golang·gowind
多弗朗皮卡丘1 小时前
C++的类型转换
开发语言·c++
FLJwu1 小时前
运动相机图像传感器选型实战|第二篇:参数看着一模一样,为什么骑行录像疯狂果冻、拖影翻车?
android·c语言·开发语言·数码相机·运动相机·oem 量产
驭渊的小故事1 小时前
从 JVM 底层看泛型:泛型擦除、Signature 属性与 Super Type Token 模式
java·开发语言·jvm