При линковке динамических библиотек (DLL), линковщик ничего не линкует, линковка происходит только со статическими библиотеками.
Но...
В процессе линковки линкер не знает фактические адреса функций из внешних DLL (например, user32.dll), поэтому он создает таблицу импортов (Import Table) в исполняемом файле.
Эта таблица содержит список всех функций и DLL, которые необходимо импортировать.
Вот...
Когда запускается исполняемый файл, загрузчик операционной системы (Windows Loader) начинает процесс загрузки образа приложения в память.
Загрузчик анализирует Import Table исполняемого файла, чтобы определить, какие DLL необходимо загрузить.
Да и есть ещё Import Address Table (IAT) - Это секция в исполняемом файле, предназначена для хранения адресов функций после их разрешения, изначально она заполнена нулями.
После того как адрес функции найден, загрузчик записывает этот адрес в соответствующую запись в IAT вашего процесса.
И когда прога исполняется, она обращается к адресам в IAT и тем самым узнаёт адрес нужной функции.