Использование динамических библиотек
Преимущества использования динамических библиотек
Использование динамических библиотек (файлов *.so) в решении дает следующие преимущества:
- Экономия оперативной памяти.
От одной и той же динамической библиотеки может зависеть множество исполняемых файлов и других динамических библиотек в решении. При этом часть динамической библиотеки, содержащая код и доступные только на чтение данные, загружается в оперативную память в единственном экземпляре.
Динамические библиотеки могут загружаться в оперативную память и выгружаться из нее по инициативе программ, которые их используют. Это позволяет достичь того, чтобы динамические библиотеки находились в оперативной памяти только то время, в течение которого они действительно используются.
- Удобство обновления ПО.
Обновление динамической библиотеки распространяется на все зависимые от нее исполняемые файлы и динамические библиотеки без их повторной сборки.
- Возможность реализовать механизм плагинов.
Плагины для компонентов решения представляют собой динамические библиотеки.
- Совместное использование кода и данных.
Одна и та же динамическая библиотека может совместно использоваться несколькими процессами. Наряду с экономией оперативной памяти это исключает необходимость дублировать в исполняемых файлах общий код программ (помещенный в динамическую библиотеку) и позволяет хранить в динамической библиотеке общие данные программ (доступные только на чтение).
Работоспособность любых динамических библиотек, кроме поставляемых в составе KasperskyOS SDK или созданных разработчиком решения, не гарантируется.
В настоящее время динамические библиотеки libc.so и libpthread.so не поставляются в составе KasperskyOS SDK.
Особенности сборки исполняемых файлов, использующих динамические библиотеки
Исполняемые файлы, использующие динамические библиотеки, должны быть собраны с динамической компоновкой. (О CMake-командах, задающих способ компоновки исполняемых файлов, см. "Библиотека platform".)
Исполняемый файл, который должен компоноваться с динамической библиотекой, может быть скомпонован со статической библиотекой, если требуемая динамическая библиотека не найдена. Например, если используется CMake-команда target_link_libraries (client m), исполняемый файл программы client компонуется со статической библиотекой libm.a, если динамическая библиотека libm.so не найдена.
Добавление динамических библиотек в решение
Чтобы добавить динамические библиотеки в решение, нужно поместить их в KPA-пакеты вместе с теми программами, которые зависят от этих динамических библиотек. Для этого нужно использовать CMake-команду add_kpa_component (). Если динамическая библиотека входит в состав KPA-пакета, то после его установки эта библиотека будет помещена в директорию /data/packages.unpacked/<идентификатор KPA-пакета>/<версия KPA-пакета>/lib. Этот путь нужно указывать в вызовах функции dlopen() интерфейса POSIX и/или задать в качестве пути поиска динамических библиотек. Пути поиска динамических библиотек можно задать через переменную окружения LD_LIBRARY_PATH или в полях DT_RUNPATH и DT_RPATH секции .dynamic ELF-файлов (подробнее см. "Жизненный цикл динамической библиотеки"). Например, это можно сделать, задав значение переменной окружения LD_LIBRARY_PATH в параметре RUN_CONFIGURATION->ENV CMake-команды add_kpa_component ():
add_kpa_component (${PACKAGE}
RUN_CONFIGURATION "default"
...
# В переменную окружения KOS_APP_PACKAGE_DIR при
# запуске программы будет передан абсолютный путь
# к директории установки заданной версии KPA-пакета.
# Версия KPA-пакета задается в параметре VERSION
# CMake-команды add_kpa_package ().
ENV "LD_LIBRARY_PATH=\${KOS_APP_PACKAGE_DIR}lib")
Динамические библиотеки могут зависеть от других динамических библиотек, поэтому необходимо, чтобы каждая динамическая библиотека была добавлена со всеми зависимостями.
Не рекомендуется помещать динамические библиотеки в директорию /lib, так как в ней находятся системные динамические библиотеки.