Разрешение ссылки на символ для динамически загружаемых библиотек на linux - PullRequest
0 голосов
/ 17 февраля 2020

Я пытался понять, как разрешаются символы в случае динамически загружаемых библиотек. Я заметил, что символы библиотек разрешаются с помощью библиотек, связанных как зависимости Dynami c с библиотекой. То же самое можно перечислить с помощью - ldd <share_file_name.so>

Это правильно?

Ранее я предполагал, что загрузчик будет смотреть на LD_LIBRARY_PATH и будет искать во всех библиотеках для разрешения символов в библиотеке. Но теперь я думаю об этом, тогда я понимаю, почему этот подход не может быть использован. Причина в том, что это будет очень неоптимизированный способ разрешения символов, если загрузчик должен просмотреть все библиотеки в каталогах, перечисленных в LD_LIBRARY_PATH. Что если каталог содержит миллион файлов, то он будет очень медленным, поскольку любой файл может иметь символ.

1 Ответ

1 голос
/ 17 февраля 2020

Loader в основном работает путем сканирования всех загруженных библиотек в том порядке, в котором они были загружены (сначала прямые зависимости основного исполняемого файла, затем их зависимости и т. Д. c.). Обычно символы, которые нужны вашей библиотеке, будут решаться из ее собственных зависимостей (которые вы можете найти, запустив readelf -l или ldd в вашей библиотеке). Но если какая-то другая предыдущая библиотека уже предоставила их, они будут разрешены оттуда (это называется интерполяцией символов и используется для различных трюков, таких как LD_PRELOAD или Implib.so ).

Есть много других деталей, которые могут повлиять на решение загрузчиков (-Bsymbolic, управление версиями символов и т. Д. c.), Которые объясняются, например, в каноническом Как писать разделяемые библиотеки документ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...