Binary size could be smaller #107
Description
Issue by smklein
Friday Oct 19, 2018 at 21:59 GMT
Originally opened as clap-rs/clap#1365
Rust Version
rustc 1.31.0-nightly (e7f5d4805 2018-10-18)
Affected Version of clap
2.32.0
Bug or Feature Request Summary
I compared the binary size of a "hello world" application, with and without clap, and came up with the following data:
Using a Cargo.toml:
[profile.release]
opt-level = 3
lto = true
panic ='abort'
And a main.rs (of either this, or a version which only calls println!("Hello world")
:
#![feature(alloc_system)]
extern crate alloc_system;
extern crate clap;
use clap::{App, Arg};
fn main() {
let matches = App::new("Hello")
.arg(Arg::with_name("foo")
.short("f")
.takes_value(true))
.get_matches();
let foo = matches.value_of("foo").unwrap();
println!("Hello, world: {}", foo); }
I ran the following:
$ cargo rustc --release -- -C link-args=-static && strip target/release/hello
The "Non-clap" version of hello world resulted in the following output from bloaty:
VM SIZE FILE SIZE
-------------- --------------
78.3% 283Ki .text 283Ki 78.3%
8.2% 29.8Ki .rodata 29.8Ki 8.2%
6.0% 21.7Ki .eh_frame 21.7Ki 6.0%
3.7% 13.6Ki .data.rel.ro 13.7Ki 3.8%
1.1% 4.16Ki .bss 0 0.0%
0.2% 568 [ELF Headers] 2.37Ki 0.7%
0.6% 2.16Ki .dynsym 2.16Ki 0.6%
0.0% 0 [Unmapped] 1.91Ki 0.5%
0.4% 1.36Ki .dynstr 1.36Ki 0.4%
0.3% 1.17Ki .rela.dyn 1.17Ki 0.3%
0.2% 712 .got 712 0.2%
0.2% 672 .rela.plt 672 0.2%
0.2% 576 .dynamic 576 0.2%
0.1% 534 [12 Others] 525 0.1%
0.1% 464 .plt 464 0.1%
0.1% 416 .gnu.hash 416 0.1%
0.1% 320 .gnu.version_r 320 0.1%
0.1% 272 .data 272 0.1%
0.0% 0 .shstrtab 250 0.1%
0.0% 184 .gnu.version 184 0.0%
0.0% 152 .plt.got 152 0.0%
100.0% 362Ki TOTAL 362Ki 100.0%
Where the clap version resulted in the following:
VM SIZE FILE SIZE
-------------- --------------
82.6% 620Ki .text 620Ki 82.7%
7.0% 52.6Ki .rodata 52.6Ki 7.0%
5.4% 40.3Ki .eh_frame 40.3Ki 5.4%
3.2% 23.8Ki .data.rel.ro 23.9Ki 3.2%
0.6% 4.29Ki .bss 0 0.0%
0.1% 568 [ELF Headers] 2.37Ki 0.3%
0.3% 2.27Ki .dynsym 2.27Ki 0.3%
0.2% 1.41Ki .rela.dyn 1.41Ki 0.2%
0.2% 1.38Ki .dynstr 1.38Ki 0.2%
0.0% 0 [Unmapped] 1.12Ki 0.1%
0.1% 760 .got 760 0.1%
0.1% 576 .dynamic 576 0.1%
0.1% 576 .rela.plt 576 0.1%
0.1% 542 [12 Others] 501 0.1%
0.1% 476 .gnu.hash 476 0.1%
0.1% 400 .plt 400 0.1%
0.0% 320 .gnu.version_r 320 0.0%
0.0% 272 .data 272 0.0%
0.0% 0 .shstrtab 250 0.0%
0.0% 194 .gnu.version 194 0.0%
0.0% 184 .plt.got 184 0.0%
100.0% 751Ki TOTAL 750Ki 100.0%
(Diff for visibility)
VM SIZE FILE SIZE
-------------- --------------
+119% +336Ki .text +336Ki +119%
+77% +22.8Ki .rodata +22.8Ki +77%
+85% +18.6Ki .eh_frame +18.6Ki +85%
+75% +10.2Ki .data.rel.ro +10.2Ki +75%
+20% +240 .rela.dyn +240 +20%
+3.0% +128 .bss 0 [ = ]
+5.4% +120 .dynsym +120 +5.4%
+14% +60 .gnu.hash +60 +14%
+6.7% +48 .got +48 +6.7%
+21% +32 .plt.got +32 +21%
+24% +32 .tbss 0 [ = ]
+1.9% +26 .dynstr +26 +1.9%
+5.4% +10 .gnu.version +10 +5.4%
-28.9% -24 [LOAD [RX]] -24 -28.9%
-13.8% -64 .plt -64 -13.8%
-14.3% -96 .rela.plt -96 -14.3%
[ = ] 0 [Unmapped] -808 -41.2%
+107% +388Ki TOTAL +388Ki +107%
The amount of .text being generated here doubles the size of the binary.
Clap is really useful, and I'd love if I could use it on more constrained environments, where binary size might be expensive.
Chatting with @kbknapp , it seems that there are some changes to clap-rs underway to allow more flexible usage of the crate, potentially disabling some features at compile-time to shrink the binary, but I figured I'd file this bug to track.
Are there currently other ways of toggling clap features, to compare binary sizes for this evaluation?