I’m not sure this is really as bad as people are making it out to be. The primary difference seems to be that libc is almost always linked dynamically, whereas rustc seems to be pulling in libstd (and friends) statically.
As a (not very meaningful) comparison, with x86_64, simple println!("Hello world"); and an equivalent in C with printf
$ rustc -O hello_rust.rs
$ size ./hello_rust
text data bss dec hex filename
374774 13768 4736 393278 6003e hello_rust
and
$ gcc -static -O -o hello_c hello.c
$ size ./hello_c
text data bss dec hex filename
741430 7852 9144 758426 b929a hello_c
This isn’t really a meaningful comparison, since the rust executable is still dynamically linking against libc. But, the only way C is getting a size of only a few thousand bytes is because most of the stuff is dynamically linked.
I wasn’t able to figure out how to get rustc to statically link against libc.