Ghidra反编译二进制文件存在却提示“无此文件或目录”求助
我碰到过NixOS上运行预编译二进制的这种坑,明明文件在那、ldd也显示依赖都找到了,却报"No such file or directory"——这几乎都是动态链接器路径不匹配导致的,给你几个具体的解决思路:
1. 确认动态链接器路径问题
预编译的ELF二进制通常会硬编码动态链接器路径(比如你的file输出里的/lib64/ld-linux-x86-64.so.2),但NixOS里这个路径并不存在(真实的链接器在/nix/store的glibc目录下),系统找不到链接器就会误报文件不存在。
你可以用readelf验证这一点:
readelf -l ./ghidra/Ghidra/Features/Decompiler/os/linux64/decompile | grep interpreter
输出应该会显示硬编码的/lib64/ld-linux-x86-64.so.2,而这个路径在NixOS里是无效的。
2. 用patchelf修改动态链接器路径
这是最直接的修复方法,把二进制的链接器路径替换成ldd输出里的真实路径:
从你的ldd结果里,真实的链接器路径是/nix/store/h0p0h3rh1q4i2yavzm3yqi716s9yaj2f-glibc-2.27/lib64/ld-linux-x86-64.so.2,执行命令:
patchelf --set-interpreter /nix/store/h0p0h3rh1q4i2yavzm3yqi716s9yaj2f-glibc-2.27/lib64/ld-linux-x86-64.so.2 ./ghidra/Ghidra/Features/Decompiler/os/linux64/decompile
修改后再尝试运行./decompile,应该就能正常启动了。
3. 直接使用Nixpkgs中的Ghidra包(更省心的方案)
Nixpkgs里已经打包了适配Nix环境的Ghidra,所有依赖和链接器问题都已经处理好了,直接通过nix-shell或者安装就能用:
# 临时进入包含Ghidra的shell环境 nix-shell -p ghidra # 启动Ghidra ghidra
这种方式完全不用自己手动处理依赖和二进制补丁,是Nix系统上运行Ghidra的推荐方案。
4. 额外检查:确认二进制执行权限
虽然你能运行ldd和file,但还是可以确认一下二进制有没有执行权限:
ls -l ./ghidra/Ghidra/Features/Decompiler/os/linux64/decompile
如果没有执行权限,执行chmod +x ./ghidra/Ghidra/Features/Decompiler/os/linux64/decompile添加权限即可。
内容的提问来源于stack exchange,提问作者tsm

