首页/系统/信创系统运维速查/Exec format error:架构不匹配处理
迁移适配65 条

Exec format error:架构不匹配处理

报错 cannot execute binary file: Exec format error 表示二进制架构与主机不符:file/uname 确认后,换对应架构产物或源码编译,不要暴力改名或强跑。

信创系统运维速查系统更新于 2026-10-13

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 之类的模拟层长期承载核心生产程序:性能损耗与内核接口差异需要专门评估,只适合临时验证。

易错点

  • 把 Exec format error 当成权限问题反复改 chmod,方向完全错误,先看 file 输出。
  • 误把 bad ELF interpreter 与架构不匹配混为一谈,前者缺解释器或 32 位库,处理方式不同。
  • 脚本在 Windows 编辑后带 CRLF 换行,Linux 下执行同样报格式错,转换换行符即可解决。
  • 交付前不校验产物架构,到现场才发现在目标机器上根本跑不起来。
  • 长期依赖模拟层运行核心业务,性能与兼容性风险在生产阶段才暴露。

数据来源与参考

  • man 1 file
  • man 8 binfmt(内核二进制格式)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌