stages of compilation
I'm not sure there is a well accepted definition of compiler. To some extent this is an informal concept, so you can't expect a mathematical definition like that of a derivative.

Judging from GCC documentation, the compiler proper converts (preprocessed) source code into object code. Several object codes are then linked together to an executable by the linker, but that doesn't form part of the compiler proper. The C/C++ preprocessor also doesn't form part of the compiler proper.

The compiler proper is further composed of two parts: a front end and a back end. The front end converts source code into intermediate code, and is language specific. The back end converts intermediate code into machine code, and is machine specific. GCC comes with several front ends and back ends, and this is why it is called a compiler collection.