Так что я пытаюсь обернуть голову вокруг статического и динамического связывания.Есть много ресурсов на SO и в Интернете.Я думаю, что в значительной степени понимаю, но есть еще одна вещь, которая, кажется, беспокоит меня.Также, пожалуйста, исправьте меня, если мое общее понимание неверно.
Мне кажется, я понимаю статическое связывание: компоновщик распаковывает связанные библиотеки и фактически включает в себя объектные файлы библиотек внутри созданного исполняемого файла.Затем неразрешенные заглушки в объектных файлах приложения заменяются реальным кодом вызова функций, который вызывает функции по адресам, известным во время сборки.
С другой стороны, динамическое связывание - вот что меня больше удивляет: я понимаю, чтопри динамическом связывании заглушки в объектном коде, которые ссылаются на еще не разрешенные имена, будут оставаться заглушками до времени выполнения.
Затем во время выполнения динамический загрузчик ОС будет просматривать предварительно скомпилированные библиотеки, хранящиеся встандартные местоположения файловой системы.Он будет смотреть в объектных файлах библиотек, внутри их таблиц символов (?) И пытаться найти соответствующее определение функции для каждой неразрешенной заглушки.Затем он загружает соответствующие объектные файлы в память и заменяет заглушки, чтобы указывать на определения функций.
Итак, часть, которую я пропускаю, такова: где выглядит динамический загрузчик ОС - выглядит ли онв таблицах символов для всех объектных файлов в каталоге системных библиотек?Или он выглядит только в объектных файлах, указанных где-то в исполняемом файле приложения?Это причина, почему во время компиляции мы должны указать все динамические зависимости нашей программы?Кроме того, действительно ли динамические библиотеки также предоставляют таблицу символов?