While most of the code optimizations are performed at compile time, there are optimizations that only a linker can perform. For example, it can detect unreferenced function calls. These are functions that exist in one or more source files and were compiled. If the linker detects that the application never calls these functions, it can remove their code from the resultant executable, thereby producing a smaller and faster program.
Usually, you can control the number of passes the linker makes to remove unreferenced functions. The more passes you enable, the more unreferenced functions are removed, albeit at the cost of a longer linkage time.