Skip to content

Trivial dependencies on large crates pull in massive amounts of debuginfo #56068

Open
@rocallahan

Description

@rocallahan
extern crate rusoto_core;
const REGION: rusoto_core::Region = rusoto_core::Region::UsEast1;
fn main() {
    println!("Hello, region {:?}", &REGION);
}

rusoto_core::Region is a very simple enum type. This doesn't run any interesting code. The resulting Linux debug-build binary is 41MB. If I replace &REGION with 0 the binary is 7.5MB.

readelf -a shows that .text is 370,558 bytes. .debug_info is 10,541,677 bytes. The other debug sections account for most of the rest.

Inspecting the debuginfo shows DWARF compilation units for rusoto_core and lots of its dependencies that are entirely dead code. For example:

COMPILE_UNIT<header overall offset = 0x0034b008>:
< 0><0x0000000b>  DW_TAG_compile_unit
                    DW_AT_producer              clang LLVM (rustc version 1.30.1 (1433507eb 2018-11-07))
                    DW_AT_language              DW_LANG_Rust
                    DW_AT_name                  /home/roc/.cargo/registry/src/github.com-1ecc6299db9ec823/serde_json-1.0.33/src/lib.rs
                    DW_AT_stmt_list             0x001534c8
                    DW_AT_comp_dir              /home/roc/.cargo/registry/src/github.com-1ecc6299db9ec823/serde_json-1.0.33
                    DW_AT_GNU_pubnames          yes(1)
                    DW_AT_low_pc                0x00000000
                    DW_AT_ranges                0x000a7120
                ranges: 89 at .debug_ranges offset 684320 (0x000a7120)
                        [ 0] <offset pair low-off: 0x00000001 addr 0x00000001 high-off: 0x00000001 addr 0x00000001>
                        [ 1] <offset pair low-off: 0x00000001 addr 0x00000001 high-off: 0x00000001 addr 0x00000001>
                        [ 2] <offset pair low-off: 0x00000001 addr 0x00000001 high-off: 0x00000001 addr 0x00000001>
                        [ 3] <offset pair low-off: 0x00000001 addr 0x00000001 high-off: 0x00000001 addr 0x00000001>

... followed by 85 more identical ranges. These all indicate empty code ranges; all code for this CU has been stripped by the linker. However, this CU still has a ton of debuginfo for types and for functions. E.g.:

< 4><0x00001802>          DW_TAG_subprogram
                            DW_AT_low_pc                0x00000000
                            DW_AT_high_pc               <offset-from-lowpc>262
                            DW_AT_frame_base            len 0x0001: 57: DW_OP_reg7
                            DW_AT_linkage_name          _ZN91_$LT$core..slice..Iter$LT$$u27$a$C$$u20$T$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$4next1
7hc6f1932985554eebE
                            DW_AT_name                  next<serde_json::value::Value>
                            DW_AT_decl_file             0x00000005 /home/roc/.cargo/registry/src/github.com-1ecc6299db9ec823/serde_json-1.0.33/libcore/slice/m
od.rs
                            DW_AT_decl_line             0x00000978
                            DW_AT_type                  <0x000007b0>
< 5><0x00001820>            DW_TAG_formal_parameter
                              DW_AT_location              len 0x0002: 9128: DW_OP_fbreg 40
                              DW_AT_name                  self
                              DW_AT_decl_file             0x00000003 /home/roc/.cargo/registry/src/github.com-1ecc6299db9ec823/serde_json-1.0.33/src/lib.rs
                              DW_AT_decl_line             0x00000001
                              DW_AT_type                  <0x00002f94>
< 5><0x0000182e>            DW_TAG_inlined_subroutine
                              DW_AT_abstract_origin       <0x00001a7d>
                              DW_AT_low_pc                0x00000000
                              DW_AT_high_pc               <offset-from-lowpc>123
                              DW_AT_call_file             0x00000005 /home/roc/.cargo/registry/src/github.com-1ecc6299db9ec823/serde_json-1.0.33/libcore/slice/mod.rs
                              DW_AT_call_line             0x00000982
< 6><0x00001842>              DW_TAG_formal_parameter
                                DW_AT_location              len 0x0002: 9138: DW_OP_fbreg 56
                                DW_AT_abstract_origin       <0x00001a97>
< 6><0x0000184a>              DW_TAG_formal_parameter
                                DW_AT_location              len 0x0003: 91c000: DW_OP_fbreg 64
                                DW_AT_abstract_origin       <0x00001aa2>
< 6><0x00001853>              DW_TAG_lexical_block
                                DW_AT_low_pc                0x00000000
                                DW_AT_high_pc               <offset-from-lowpc>36
< 7><0x00001860>                DW_TAG_variable
                                  DW_AT_location              len 0x0003: 91d000: DW_OP_fbreg 80
                                  DW_AT_abstract_origin       <0x00001aae>
< 5><0x0000186b>            DW_TAG_template_type_parameter
                              DW_AT_type                  <0x00000064>
                              DW_AT_name                  T

All DW_AT_low_pcs of DW_TAG_subprogram, DW_TAG_lexical_block and DW_TAG_inlined_subroutine in this CU are zero. There are a lot of CUs like this.

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-debuginfoArea: Debugging information in compiled programs (DWARF, PDB, etc.)C-enhancementCategory: An issue proposing an enhancement or a PR with one.I-compiletimeIssue: Problems and improvements with respect to compile times.I-heavyIssue: Problems and improvements with respect to binary size of generated code.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions