Espero que sea esta la respuesta... Si alguien cree que no, ¡que lo diga!
Lo que hace el link es coger todos los ficheros objeto sacados de cada código fuente (*.obj en Windows, *.o en Unix), y enlazarlos para formar el ejecutable final. El enlazado se necesita porque unos ficheros objeto hacen llamadas a funciones que hay en otros.
Cuando el enlazador encuentra una llamada de esas, es posible que todavía no haya leido el fichero objeto al que hace referencia, por lo tanto, no la puede resolver.
Como se soluciona es dando dos pasadas:
Pasada 1: lee todos los ficheros objeto, y construye la tabla de símbolos con todas las funciones, variables, etc., que exporta el fichero y que pueden ser referenciadas desde otros ficheros objeto.
Pasada 2: vuelve a leer los ficheros objeto, buscando referencias a otros, y utilizando la tabla de símbolos construida anteriormente para resolverlas.
Espero que te sirva!