为何对Rust程序执行objcopy --strip-all后可执行文件体积会减半?
Rust可执行文件执行
objcopy --strip-all后体积大幅缩减的原因 objcopy --strip-all的核心作用是移除可执行文件中所有非运行必需的内容,包括符号表、调试信息、行号映射、注释段等,这部分内容完全不会参与程序运行逻辑,仅用于调试、问题排查场景。- Rust 默认的release编译配置并未开启strip功能,哪怕是最高优化等级的release版本,默认也会保留全量符号信息:
- 保留符号是为了程序panic时可以输出可读的调用栈,直接定位到具体的函数名、代码行号,方便开发和线上问题排查
- Rust默认采用静态链接标准库的编译策略,整个Rust标准库的符号信息也会全部打包进最终可执行文件,这部分是体积占用的大头
- 你测试的两个平台的表现完全符合预期:
- Linux下ELF格式的可执行文件,移除符号和调试信息后,Hello World类的小型工程体积从3MB降到300KB左右是非常普遍的情况
- Windows下x86_64-pc-windows-gnu工具链生成的PE格式可执行文件逻辑完全一致,默认携带的调试信息、符号表体积占比更高,所以会出现4MB降到1MB的表现
如果想要在编译时自动完成strip操作,不需要手动执行objcopy命令,可以在项目的Cargo.toml中添加如下配置:
[profile.release] strip = true
剥离后的程序运行逻辑和剥离前完全一致,仅会丢失调试、带符号的panic回溯能力,如果是生产环境发布且不需要现场调试能力,非常推荐开启strip配置缩减体积。
内容的提问来源于stack exchange,提问作者undefined
相关产品推荐
相关产品推荐

