Порядок поиска символов на графике зависимостей .so - PullRequest
0 голосов
/ 13 февраля 2019

Предположим, у меня есть график зависимости времени загрузки общих объектов и символ foo, указанный в одном из .so.Предположим также, что этот символ foo определен в нескольких других общих объектах.Мой вопрос: какое определение будет найдено, каков порядок поиска и где оно определено (в каком стандарте, справочная страница)?

Пример: Рассмотрим граф зависимостей https://i.imgur.com/jdhD3V0.png

где библиотеки перечислены в порядке ldd, например,

ldd a.so
b.so
d.so

Предположим, что foo определено в c.so и d.so и впервые указано в f.so.Мои эксперименты показывают, что реализация из d.so будет взята компоновщиком.Похоже, что библиотеки ищутся в bfs порядке.Это правильно?Совпадает ли это с порядком загрузки библиотек?Я не смог найти это ни в одной документации и должен быть уверен, что это не определено реализацией.

Спасибо!

1 Ответ

0 голосов
/ 13 февраля 2019

Динамическое связывание указано в спецификации ELF .(Обратите внимание, что существуют некоторые действительно старые файлы PDF и Postscript, но они, как правило, очень устарели.) Поиск символов описан в разделе Зависимости общих объектов :

При разрешенииСимвольные ссылки, динамический компоновщик проверяет таблицы символов с помощью поиска в ширину.То есть сначала он смотрит на таблицу символов самой исполняемой программы, затем на таблицы символов DT_NEEDED записей (по порядку), а затем на DT_NEEDED записи второго уровня и т. Д.

(Существуют различные расширения, которые изменяют это поведение. Сама спецификация ELF определяет DF_SYMBOLIC флаг .)

Это означает, что на ваш вопрос нельзя ответить, потому что вашНа графике не показан основной исполняемый файл, и неясно, в каком порядке выполняется поиск нескольких зависимостей (сверху вниз или снизу вверх).

Соответствует ли порядок поиска порядку загрузки объекта при реализации-определено, потому что простая загрузка объекта (без выполнения его функций инициализации) не является чем-то, что имеет наблюдаемый эффект согласно спецификации ELF.

Порядок инициализации (порядок, в котором функции инициализациивыполнено) менее ограничено, чем порядок поиска символов, поскольку порядок DT_NEEDED записейне имеет значения к этому.Таким образом, теоретически, возможно, что реализация загружает инициализированные d.so до b.so, но символы из b.so вставляют символы d.so, потому что они идут первыми в порядке поиска символов (из-за способа, которым DT_NEEDED записей заказано).

...