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
相关推荐
泡海椒7 小时前
告别 iText 繁杂配置:jquick-pdf 极简 PDF 生成实战(零基础上手)
java·开发语言·pdf
君顾118 小时前
上海24小时自助健身房系统开发实战指南:从架构设计到落地部署
java·开发语言·健身房
香菜TTT19 小时前
大模型上下文协议(MCP):AI 应用的“USB-C”接口技术
开发语言·人工智能·经验分享
aramae19 小时前
模拟实现strlen()函数 (C语言)
c语言·开发语言·后端
jimy120 小时前
readelf 查看“派生类”的vtable符号
开发语言·c++
ctlover20 小时前
排序与查找算法详解
开发语言·python
YYYing.21 小时前
【C++进阶系列 (七)】C++ RTTI 深度剖析:从 typeid 到 dynamic_cast 的底层之旅
开发语言·c++·c/c++·rtti
nvvas1 天前
Java 入门(四):数组——数据的集合管理
java·开发语言
Y3815326621 天前
SERP 数据清洗实战:字段标准化、日期解析与去重键
开发语言·数据库·python·python数据库
君顾11 天前
本地城市低空经济管理系统定制:城市级低空运营平台架构与落地实战
java·开发语言·飞手