Динамические объекты в процессе поступают из нескольких источников:
- Сам исполняемый файл
- Любые необходимые ему библиотеки (
DT_NEEDED
для ELF) - Библиотекизагружен явно (
dlopen
или аналогичный) - Любые библиотеки, необходимые для таких явных загрузок
Они могут быть выгружены явно (dlclose
) или неявно когда процесс exit
s, запустив их финализацию (atexit
функции, деструкторы статической длительности в C ++ и __attribute__((destructor))
функции) в любом случае.
Что определяет порядок вкакие динамические объекты инициализируются и завершаются в этих различных случаях?Очевидно, что последний dlclose
для библиотеки немедленно выгружает ее, но как насчет ее дерева зависимостей (некоторые из которых также могут быть зависимостями других загруженных библиотек)?Что если библиотека dlopen
редактируется, но затем выгружается exit
?
Я склонен ожидать обычный обратный порядок инициализации, но, возможно, есть разница между DT_NEEDED
иdlopen
, поскольку "плагины" загружаются последними, и можно ожидать, что они будут зависеть от данных исполняемого файла, а не наоборот.