
Object files do not have all of their dependencies resolved, and there are still address gaps and unkown addresses for functions that reside in other object files or libraries. Usually object files contain the debugger instrumentation, symbol table, static data and base addresses for functions.

Your executable is where everything is put together and all of the questions are answered about missing addresses, etc. Your exe also contains the bootstrap code and kernel hooks such as opening you input and output streams, loading any dynamic libraries, and setting up your call stacks and dumping your core file if something crashes in your code.
Basically your exe is the interface to the operating system from the user command shell.