Разница между динамической связью во время загрузки и во время выполнения
В чем разница между динамическим связыванием во время загрузки и динамическим связыванием во время выполнения?
3 ответа
Динамическое связывание во время загрузки
Когда исполняемый файл связан с DLL во время сборки, компоновщик не вставит объектный код, а вставит заглушку, которая в основном говорит, что функция этого имени находится в этой DLL.
Теперь, когда исполняемый файл запускается, биты исполняемого файла будут отсутствовать (т.е. заглушки функций), поэтому перед тем, как программе будет разрешено запускаться, загрузчик программы исправляет эти отсутствующие функции, заменяя их точками входа в файлы DLL.
Только после того, как все заглушки будут заменены (то есть разрешены), исполняемый файл будет разрешен к запуску.
Это динамическое связывание во время загрузки.
Динамическое связывание во время выполнения
В этом случае исполняемый файл не был связан ни с одним файлом библиотеки DLL, поэтому он не будет содержать никаких заглушек в dll, и поэтому у загрузчика программы нет проблем с запуском исполняемого файла.
Но задача получения доступа к функции из библиотеки DLL оставлена на исполняемый файл и может быть выполнена с помощью Windows API GetProcAddress.
Это динамическое связывание во время выполнения.
Вы забыли тег "домашнее задание".
Связывание во время загрузки означает, что DLL, с которой вы связываетесь, загружается при запуске приложения, независимо от того, используете ли вы на самом деле функциональность в этой DLL. Динамическое связывание означает, что функциональность DLL загружается только тогда, когда это действительно необходимо.
Динамическое связывание во время загрузки выполняется операционной системой при загрузке приложения. ОС использует информацию компоновщика, помещенную в файл, чтобы найти имена DLL, а затем ищет эти библиотеки DLL. И если ей не удается найти библиотеку DLL, она просто завершается и выдает сообщение об ошибке, в противном случае ОС сопоставляет библиотеку DLL с виртуальное адресное пространство процесса и увеличивает количество ссылок на DLL.