Жизненный цикл динамической библиотеки

30 сентября 2026

ID shared_libraries_lifecycle

Жизненный цикл динамической библиотеки включает следующие стадии:

  1. Загрузка в память.

    Динамическая библиотека загружается из файловой системы в оперативную память системной программой BlobContainer из состава KasperskyOS. (Чтобы получить доступ к файловым системам с динамическими библиотеками, программа BlobContainer обращается через IPC к системной программе VfsStorage из состава KasperskyOS.) Часть динамической библиотеки, содержащая код и доступные только на чтение данные, помещается в разделяемую память, которая отображается загрузчиком динамических библиотек на память всех процессов, которые используют эту библиотеку. (Код загрузчика динамических библиотек включен в динамическую библиотеку ld.elf_so, с которой скомпонованы исполняемые файлы, или в сами исполняемые файлы в зависимости от применяемого варианта динамической компоновки. Подробнее см. "Библиотека platform".) Другая часть, содержащая доступные на чтение и запись данные, копируется загрузчиком динамических библиотек в память каждого из этих процессов. Загрузка выполняется либо при запуске процесса, созданного на основе исполняемого файла, скомпонованного с динамической библиотекой, либо в результате вызова функции dlopen() интерфейса POSIX. (Если при запуске процесса или вызове функции dlopen() требуемая динамическая библиотека уже загружена, то новая загрузка не выполняется, и используется уже загруженная библиотека.)

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

    Если задать для программы список динамических библиотек через переменную окружения LD_PRELOAD, то эти динамические библиотеки будут загружены при запуске программы, даже если исполняемый файл не зависит от них. (Элементами списка должны быть абсолютные пути к динамическим библиотекам, разделенные двоеточием, например: LD_PRELOAD=/home/user/lib/libfoo.so:/usr/lib/libbar.so.) Функции, которые экспортируются динамическими библиотеками, указанными в LD_PRELOAD, замещают одноименные функции, которые экспортируются другими динамическими библиотеками. Это можно использовать для целей отладки, если требуется подменить функции, импортируемые из динамических библиотек.

    Если применяется устаревший вариант динамической компоновки, то с использованием переменной окружения LD_PRELOAD невозможно заместить функции библиотек libkos, libc, libm, libpthread, libvfs, librtlcom, libdynld.

    Поиск динамических библиотек в файловых системах выполняется в следующем порядке:

    1. По абсолютным путям, заданным через переменную окружения LD_LIBRARY_PATH.

      Пути должны быть разделены двоеточием, например: LD_LIBRARY_PATH=/usr/lib:/home/user/lib.

    2. По абсолютным путям, сохраненными в поле DT_RUNPATH или DT_RPATH секции .dynamic исполняемых файлов и динамических библиотек.

      Пути должны быть разделены двоеточием. Их можно сохранить в исполняемых файлах, скомпонованных с динамическими библиотеки, и в динамических библиотеках, скомпонованных с другими динамическими библиотеками. Для этого можно использовать, например, CMake-команду set_target_properties (), указав пути в параметре INSTALL_RPATH. Пути применяются при поиске требуемых динамических библиотек (указанных в полях DT_NEEDED секции .dynamic) только для того исполняемого файла (или динамической библиотеки), в котором сохранены.

    3. По пути /lib.

    Если через параметр file функции dlopen() задан относительный путь к динамической библиотеке, то поиск этой библиотеки и библиотек, от которых она зависит, выполняется в таком же порядке.

  2. Использование процессом (процессами).
  3. Выгрузка из памяти.

    Динамическая библиотека, которая больше не требуется, удаляется из оперативной памяти. Это происходит, когда все процессы, использующие эту библиотеку, завершились или вызвали функцию dlclose() интерфейса POSIX (число вызовов функции dlclose() должно быть не меньше числа вызовов функции dlopen()). Динамическая библиотека, скомпонованная с исполняемым файлом, не может быть удалена до завершения процесса, который был создан на основе этого исполняемого файла. Динамическая библиотека, скомпонованная с другими динамическими библиотеками, будет удалена после удаления всех библиотек, которые зависят от нее.

Вам помогла эта статья?
Что нам нужно улучшить?
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!