связывание во время загрузки - это когда операционная система обрабатывает символы в библиотеке, на которые ссылается исполняемый файл (или другая библиотека), когда исполняемый файл / библиотека загружается в память.
Связывание во время выполнения - это когда вы используете API, предоставляемый ОС или через библиотеку, для загрузки DLL или DSO, когда вам это нужно, и затем выполняете разрешение символов.
Я знаю больше о Linux DSO, чем Windows DLL, но принцип должен быть таким же. Библиотеки .NET могут отличаться.
В Linux архитектуры плагинов сделаны таким образом. Ваша программа будет использовать связывание во время выполнения для загрузки библиотеки и вызова некоторых функций. Тогда, может быть, разгрузить его. Это также позволяет загружать несколько библиотек с одинаковыми экспортированными символами без конфликтов. Я думаю, что библиотеки DLL будут работать примерно так же.
Исполняемые файлы имеют "пробелы" в своих таблицах символов, которые необходимо заполнить какой-либо библиотекой Эти пробелы обычно заполняются во время загрузки или компиляции. Вы можете отменить потребность в «пробелах» в таблице символов, используя связывание во время выполнения.
Еще один сценарий, в котором полезно связывание во время выполнения, - для отладки библиотек или выбора из нескольких совместимых с ABI / API библиотек во время выполнения. У меня часто есть библиотека, скажем, «foo» и одна, называемая «foo_unstable», и у меня есть тестовое приложение, которое переключается между двумя и выполняет некоторое тестирование.
В linux, чтобы увидеть, на какие библиотеки ссылается исполняемый файл во время загрузки, вы запускаете команду ldd
и получаете вывод, такой как (on / bin / ls):
linux-vdso.so.1 => (0x00007fff139ff000)
librt.so.1 => /lib64/librt.so.1 (0x0000003c4f200000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003c4fa00000)
libcap.so.2 => /lib64/libcap.so.2 (0x0000003c53a00000)
libacl.so.1 => /lib64/libacl.so.1 (0x0000003c58e0000
Операционная система попытается загрузить библиотеки (файлы .so) во время загрузки. Возможно, библиотека уже находится в памяти.