MacOS下带strip参数编译的Rust二进制无法运行:Mach-O异常求助
问题:MacOS Ventura 13.0.1(M1 Max)下Rust编译剥离符号后二进制变32位Mach-O导致运行失败
根本原因
核心是Ventura 13.0.1自带的GNU strip工具(包括rustc默认调用的strip)存在ARM64 Mach-O处理bug:它错误地把64位Mach-O的magic值从0xfeedfacf(ARM64 64位标识)改成了0xfeedface(32位Mach-O标识),系统识别为无效32位程序,直接触发Killed:9错误。
- Rust的
-C strip=symbols参数默认调用系统strip,所以编译后出问题; - 换zld/mold链接器没用,因为问题出在符号剥离环节,不是链接环节;
- Monterey系统的GNU strip已经修复了这个bug,所以同操作在M1 Pro+Monterey上能正常运行。
解决办法
1. 用llvm-strip替代默认strip
两种方式:
- 编译时直接指定用llvm-strip处理:
rustc main.rs -o main_stripped -C strip=symbols -C llvm-args=-strip-all - 先编译正常二进制,再用llvm-strip剥离符号:
rustc main.rs -o main llvm-strip -S main -o main_stripped
2. 更新Rust到最新稳定版
新版本Rust已经默认适配llvm-strip处理Mach-O,避免调用有bug的GNU strip,执行更新:
rustup update stable
3. 升级系统到Ventura 13.1及以上
Apple在后续Ventura更新中修复了GNU strip的Mach-O处理bug,升级后默认strip工具就能正常处理64位ARM64二进制。
内容的提问来源于stack exchange,提问作者rubinen
相关产品推荐
相关产品推荐

