Exec format error 是什么
执行程序时报 cannot execute binary file: Exec format error,含义是二进制文件的架构与主机不匹配:在 aarch64 机器上跑了 x86_64 产物,或反过来。这不是权限问题也不是路径问题,改权限、加 sudo、重命名都无济于事。正确做法是先用 file 和 uname -m 确认两边架构,然后换对应架构的产物或在本机重新编译。同类报错里还有一种 bad ELF interpreter,那是解释器路径或 32 位库缺失,两者要用 file 区分。
基本信息
| 典型报错 | cannot execute binary file: Exec format error |
|---|---|
| 定位命令 | file 二进制、uname -m、ldd 二进制 |
| 根因 | 二进制架构与主机架构不一致 |
| 正确处理 | 换对应架构产物,或在本机重新编译 |
| 近似报错 | bad ELF interpreter 属于解释器或 32 位库缺失 |
典型使用场景
- 信创迁移:从 x86 机器拷来的可执行文件在 ARM 机器上跑不起来
- 交付验收:提前用 file 检查交付物架构,避免现场才发现不匹配
- 脚本迁移:脚本报同样错误,实际是换行符或 shebang 问题
- 第三方工具:厂商只提供单一架构产物,需要找适配版本
- 镜像构建:构建产物与运行环境架构不一致,运行时报错
定位
定位
./app
# bash: ./app: cannot execute binary file: Exec format error
file ./app # 看产物架构,如 x86-64 还是 ARM aarch64
uname -m # 看本机架构
readelf -h ./app | grep Machine # 更精确:ELF 头里的目标机器
ldd ./app # 看动态库依赖是否能解析
head -1 script.sh; file script.sh # 脚本类报错先看 shebang 与换行符处理路径
处理路径
# 路径一(推荐):获取目标架构的产物
uname -m # 确认目标架构后重新下载对应包
# 路径二:源码在本机重新编译
# 路径三:脚本报错时检查 CRLF 与 shebang
sed -i 's/\r$//' script.sh # 去掉 Windows 换行符
chmod +x script.sh # 确保有执行权限
head -1 script.sh # 确认 shebang 指向存在的解释器报错与处理对照
| 报错 | 含义 | 处理方式 |
|---|---|---|
| Exec format error | 二进制架构不匹配 | 换架构产物或本机编译 |
| bad ELF interpreter | 解释器路径不存在或 32 位库缺失 | 装对应解释器或 32 位兼容库 |
| No such file or directory(脚本可执行) | shebang 指向的解释器缺失 | 检查 shebang 与实际路径 |
| Permission denied | 缺少执行权限 | chmod +x |
| cannot execute binary file(脚本带 CRLF) | 换行符导致解析失败 | 转换换行符为 LF |
同样的报错可能来自不同原因:架构不符、脚本 CRLF、解释器路径缺失,都先用 file 分辨清楚再动手。
不建议用 qemu 之类的模拟层长期承载核心生产程序:性能损耗与内核接口差异需要专门评估,只适合临时验证。