A .o file (object file) is the outputted machine code of your program. The Linker’s job is to take all the .o files and stitch them together into a final executable. The general flow is that the compiler will turn source code into assembly, the assembler will turn assembly into machine code (.o files) and the linker will take those files and put them together into the final executable.
I was pretty fuzzy about what exactly .o files were and what the linker was in relation to the compiler.