rust - 为什么在 rust 程序中运行 objcopy --strip-all 会使它们的大小减半?
问题描述
当我在任何 rust 程序中执行 objcopy --strip-all 时,它的大小减半。例如,如果我使用 cargo build --release 编译一个普通的 hello world 应用程序,它会以 3 mb 的可执行文件(在 linux 中)结束。然后,当我在可执行文件上运行 objcopy --strip-all 时,我以 330 kb 的可执行文件结束。为什么会这样?
我还在 Windows 中使用 x86_64-pc-windows-gnu 作为我的工具链对此进行了测试,它还将可执行文件的大小从 4 mb 降低到 1 mb。
在 Windows 中,我的工具链是每晚 2021-07-22。在 linux 中,我的工具链是每晚 2021-07-05。
解决方案
当您生成二进制文件时,Rust 编译器会生成大量调试信息,以及其他信息,例如每个符号的符号名称。大多数其他编译器也这样做,有时带有一个选项(例如,-g
)。拥有这些数据对调试非常有帮助,即使您在发布模式下编译也是如此。
你正在做的--strip-all
是删除所有这些额外的数据。在 Rust 中,您要删除的大部分数据只是调试信息,而在典型的 Linux 发行版中,这些数据会从二进制文件中剥离出来并存储在特殊的调试包中,以便在需要时使用,否则不会下载。
运行程序并非绝对需要这些数据,因此您可能决定剥离它(通常使用strip
二进制文件完成)。如果大小不是您关心的问题,那么保留它以在出现问题时帮助调试可能会更有帮助。
推荐阅读
- angular - 当我手动选择帐户时,带有 GoogleAuthProvider 的 signInWithRedirect 在 safari 上出现白屏
- swift - 使用 IBOutlet 连接 MapKit 视图时应用程序崩溃
- npm - 运行 npm install 时出错
- maven - Intellij 在实际没有错误时报告依赖错误
- c# - Xamarin 插件地理定位器不适用于 Xamarin Forms android
- algorithm - 给定一个包含两个整数作为节点的查询,在树中找到这两个节点的所有子节点?
- spring - 使用spring boot默认杰克逊映射时日期时区发生变化
- html - 使用 inline-block 时 div 消失
- app-engine-ndb - 设置 NDB 模型对象的 is_saved 属性未按预期工作
- tortoisehg - 在 Windows 中使用 TortoiseHg 复制和重命名