Там представляют собой два (три) типа библиотек:
- статические библиотеки (суффикс:
.a
/.lib
), который сам становится частью двоичного кода. Строго говоря, это не вся библиотека, это те объекты из библиотеки, которые необходимы для удовлетворения неразрешенных ссылок.
- разделяемые (динамические) библиотеки (суффикс:
.so
/.dll
), который в двух вариантах, отличающихся временем библиотека загружается:
- динамической библиотеки связи, которые являются библиотеки, о которых вы сказали компилятор и компоновщик и которые вы называете статическими библиотеками, но которые не являются частью вашей библиотеки, - они загружаются загрузчиком/компоновщиком (в Linux обычно как часть
__main()
от libc
по телефону dlopen()
).
- библиотека динамической загрузки, которую вы называете
dlopen()
.
(Термины кажутся немного нечеткими, я видел различную литературу, используя различные термины, приведенные выше термины, как я запомнил его, чтобы вспомнить понятия.)
Таким образом, если вы используете a.so
без звонка dlopen()
самостоятельно, a.so
- динамическая библиотека ссылок, поэтому она загружается при запуске программы. В этом случае удаление a.so
из системы будет препятствовать запуску вашей программы - она будет загружена, но она не сработает до того, как вызывается main()
.
Если вы используете a.so
с вызовом dlopen()
самостоятельно, это полностью под вашим контролем.
На вопросы
Q1: Если вы звоните dlopen()
себя, с RTLD_LAZY
, то a.so
будет загружен при первом нерешенным вызова, которые могут быть решены с помощью a.so
производится. Если вы звоните dlopen()
самостоятельно, с RTLD_NOW
, a.so
загружается немедленно, то есть до dlopen()
. Если вы не вызываете dlopen()
самостоятельно, но дайте libc
выполнить работу за вас, a.so
будет загружен при запуске программы.
Q2: Вы удаляете a.so
. Если вы вызываете dlopen()
с RTLD_LAZY
и не запускаете код, который нуждается в a.so
, программа будет работать счастливо, иначе сигнал будет поднят. Если вы не вызываете dlopen()
, но дайте libc
выполнить эту работу, программа не запустится успешно.
Q3: Фактически, нет способа загрузить a.so
без вызова dlopen()
(или что-то подобное, что заменит его). Вопрос только в том, вы сами вызываете dlopen()
, или вы позволяете среде (т. Е. libc
) выполнять эту работу за вас.
Отказ от ответственности: Я не эксперт в этом вопросе, и некоторые части моего ответа могут быть неправильными. Я проверю те части моего ответа, на которых у меня есть сомнения, например, libc
, который вызывает dlopen()
или что-то еще, и возможно ли иметь ленивое связывание, даже если вы не используете dlopen()
самостоятельно. Я буду обновлять ответ, как только у меня появятся результаты.
Это конкретная операционная система. Вы в Linux? –
Извините, я забыл о упоминании. Да, я спрашиваю об этом для Linux OS – PAL
Один вопрос за сообщение, пожалуйста.Я удалил Q2 и Q3, используя ссылку Ask Question, чтобы добавить 2 новых сообщения по одному на каждый вопрос. – sashoalm