An executable program will may be built from several source files and will also include code from library routines.
The C compiler does not know the final address of functions defined in these other files.
Similarly if a global pointer is initialized with the address of another global variable, the compiler will not know the final value of this address to use to initialize the pointer.
The object files created by the compiler must contain information about which items are missing. The linker/loader then uses this information to paste the object files together, fix the missing information, and produce the single executable file.
This describes static linking. The library routines are included by the linker/loader and are a part of the final executable file.