I don't know what code linkers are generating on their own but doesn't it sort of imply that the output is at least as large as the input?
Those explicit directives might be more implicit than you think. A linker will likely fold functions declared as inline. Template functions and template classes are implicitly inline, so for example, all uses of std::vector<std::string> will (likely) be implicitly folded together.
(Or are you assuming that a debug flag is used so that all inlined functions are not really inlined by the compiler?)