首页 > 解决方案 > 为什么在 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。

标签: rustfilesizeobjcopy

解决方案


当您生成二进制文件时,Rust 编译器会生成大量调试信息,以及其他信息,例如每个符号的符号名称。大多数其他编译器也这样做,有时带有一个选项(例如,-g)。拥有这些数据对调试非常有帮助,即使您在发布模式下编译也是如此。

你正在做的--strip-all是删除所有这些额外的数据。在 Rust 中,您要删除的大部分数据只是调试信息,而在典型的 Linux 发行版中,这些数据会从二进制文件中剥离出来并存储在特殊的调试包中,以便在需要时使用,否则不会下载。

运行程序并非绝对需要这些数据,因此您可能决定剥离它(通常使用strip二进制文件完成)。如果大小不是您关心的问题,那么保留它以在出现问题时帮助调试可能会更有帮助。


推荐阅读