Comment by pornel
I mean you get one upfront cost for things like allocators, common string manipulation and std::fmt, std::{fs, io, path} helper functions, and gathering of pretty backtraces for panics (which is a surprisingly fiddly task, including ELF+DWARF parsers and gzip to decompress the debug info).
A println!("hello world") happens to pull in almost all of it (it panics if stdout is closed).
Later code growth is just obviously proportional to what you're doing, and you're not getting a whole new copy of std::fmt every time you call print.