Terminology varies between compilers and assemblers but the usual meaning is that an object code is the result of converting the code to unlinked assembly instructions.
The flow of code is normally:
1. compile or assemble each source code file to it's own object code file
2. link the object files and any library files you have used into executable code.
If you have only one source file it will convert to one object file and produce one executable.
If you have several source files and/or use library files, each will convert to it's own object file and the linker will combine them into a single executable file.
There are several reasons for doing this but the main one is that an assembler/compiler can only produce code for the source you give it but you may have references in your program to routines in other source files. The assembler/compiler will not know the addresses for those routines or functions in libraries which are in files it may not yet have produced. The object files will have 'place holders' where the addresses of routines and functions it can't find in it's own source code have to be inserted. Once all the object files are ready, the linker combines the object files into one and then can tell the address where each routine/function is placed. It then goes through the file and replaces the place holders with the actual addresses to make the executable file.
Brian.