在 Rust 发布版本中何时使用符号剥离?

3
在发布配置文件中剥离调试信息可以将我的板条箱二进制文件大小减少三分之一(从1.9 MB到1.3 MB)。这是我添加的内容:
[profile.release]
strip = true
# or strip = "symbols"

为什么在发布配置中默认禁用剥离(stripping)?

我已经阅读了关于 strip cargo 选项 的部分,但我仍然不确定其内部机制。

是否总是在发布配置中使用它会有任何缺点 - 可能只会增加编译时间吗?


这是否回答了您的问题?什么是符号表? - Colonel Thirty Two
1个回答

4

“Debug info”指的是在调试过程中有用的信息。特别地,二进制代码的某些部分被映射到源代码,以帮助你调试一个--release版本的二进制代码。

例如,考虑以下代码:

fn main() {
  foo();
}

#[inline(never)]
fn foo() {
  panic!("hello");
}

带有调试信息的堆栈跟踪如下(运行 RUST_BACKTRACE=full cargo run --release):
...

  12:     0x563a420d5c5c - std::sys_common::backtrace::__rust_end_short_backtrace::h356ecf2a7ec67271
                               at /rustc/060e47f74a91b28c3db28d80a6a9d6841ca51026/library/std/src/sys_common/backtrace.rs:138:18
  13:     0x563a420d7162 - rust_begin_unwind
                               at /rustc/060e47f74a91b28c3db28d80a6a9d6841ca51026/library/std/src/panicking.rs:584:5
  14:     0x563a420c0833 - core::panicking::panic_fmt::h9555dfef52eae25e
                               at /rustc/060e47f74a91b28c3db28d80a6a9d6841ca51026/library/core/src/panicking.rs:142:14
  15:     0x563a420c0b59 - playground::foo::h556d88610d3b7d1f
  16:     0x563a420c0b06 - playground::main::h2eebec7531673915
  17:     0x563a420c0af3 - std::sys_common::backtrace::__rust_begin_short_backtrace::haa748201e9438a0f
  18:     0x563a420c0b99 - std::rt::lang_start::{{closure}}::h605b074d393b11eb
  19:     0x563a420d19bf - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once::hed7373fa9659f259
                               at /rustc/060e47f74a91b28c3db28d80a6a9d6841ca51026/library/core/src/ops/function.rs:280:13
  20:     0x563a420d19bf - std::panicking::try::do_call::h60869ea5a827d812
                               at /rustc/060e47f74a91b28c3db28d80a6a9d6841ca51026/library/std/src/panicking.rs:492:40
  21:     0x563a420d19bf - std::panicking::try::he306a2f2634a9efa
                               at /rustc/060e47f74a91b28c3db28d80a6a9d6841ca51026/library/std/src/panicking.rs:456:19
  22:     0x563a420d19bf - std::panic::catch_unwind::hd1d792c621528cfe
                               at /rustc/060e47f74a91b28c3db28d80a6a9d6841ca51026/library/std/src/panic.rs:137:14

...

没有调试信息,它看起来像这样:
   0:     0x55d165a94750 - <unknown>
   1:     0x55d165aaf00e - <unknown>
   2:     0x55d165a92575 - <unknown>
   3:     0x55d165a95ea3 - <unknown>
   4:     0x55d165a95b8f - <unknown>
   5:     0x55d165a9654a - <unknown>
   6:     0x55d165a96401 - <unknown>
   7:     0x55d165a94c5c - <unknown>
   8:     0x55d165a96162 - <unknown>
   9:     0x55d165a7f833 - <unknown>
  10:     0x55d165a7fb49 - <unknown>
  11:     0x55d165a7faf6 - <unknown>
  12:     0x55d165a7fb83 - <unknown>
  13:     0x55d165a7fb99 - <unknown>
  14:     0x55d165a909bf - <unknown>
  15:     0x55d165a7fb72 - <unknown>
  16:     0x7fddc5a16237 - __libc_start_call_main
  17:     0x7fddc5a162f5 - __libc_start_main_impl
  18:     0x55d165a7fa21 - <unknown>
  19:                0x0 - <unknown>

作为经验法则,我通常保留它(即不剥离调试信息),除非我非常非常关心二进制文件的大小。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接