Динамическое связывание указано в спецификации ELF .(Обратите внимание, что существуют некоторые действительно старые файлы PDF и Postscript, но они, как правило, очень устарели.) Поиск символов описан в разделе Зависимости общих объектов :
При разрешенииСимвольные ссылки, динамический компоновщик проверяет таблицы символов с помощью поиска в ширину.То есть сначала он смотрит на таблицу символов самой исполняемой программы, затем на таблицы символов DT_NEEDED
записей (по порядку), а затем на DT_NEEDED
записи второго уровня и т. Д.
(Существуют различные расширения, которые изменяют это поведение. Сама спецификация ELF определяет DF_SYMBOLIC
флаг .)
Это означает, что на ваш вопрос нельзя ответить, потому что вашНа графике не показан основной исполняемый файл, и неясно, в каком порядке выполняется поиск нескольких зависимостей (сверху вниз или снизу вверх).
Соответствует ли порядок поиска порядку загрузки объекта при реализации-определено, потому что простая загрузка объекта (без выполнения его функций инициализации) не является чем-то, что имеет наблюдаемый эффект согласно спецификации ELF.
Порядок инициализации (порядок, в котором функции инициализациивыполнено) менее ограничено, чем порядок поиска символов, поскольку порядок DT_NEEDED
записейне имеет значения к этому.Таким образом, теоретически, возможно, что реализация загружает инициализированные d.so
до b.so
, но символы из b.so
вставляют символы d.so
, потому что они идут первыми в порядке поиска символов (из-за способа, которым DT_NEEDED
записей заказано).