Чтобы добавить динамические библиотеки в решение на базе KasperskyOS, существует два способа: с автоматическим и ручным поиском динамических библиотек, от которых зависят программы решения.
Способ с автоматическим поиском динамических библиотек
Нужно использовать параметры PACK_DEPS_COPY_ONLY ON
, PACK_DEPS_LIBS_PATH
и PACK_DEPS_COPY_TARGET
в CMake
-командах build_kos_qemu_image()
и build_kos_hw_image()
.
Динамические библиотеки, которые загружаются в память вызовом функции dlopen()
интерфейса POSIX, не будут найдены автоматическим поиском.
Пример 1:
# В этом примере создается образ решения для аппаратной платформы.
# В этот образ решения добавляется образ накопителя с динамическими
# библиотеками.
# Установка значений переменных
set (IMAGE_FS ${CMAKE_BINARY_DIR}/hdd)
set (LIBS_PATH "${IMAGE_FS}/lib")
set (DISK_IMG ramdisk0.img)
if (blob_container_ENTITY_FOUND)
# Настройка программы BlobContainer
set_target_properties (${blob_container_ENTITY} PROPERTIES
DEPENDS_ON_ENTITY ${precompiled_vfsVfsRamFs}
EXTRA_ENV " VFS_FILESYSTEM_BACKEND: client:kl.VfsRamFs")
endif ()
# Создание образа накопителя с динамическими библиотеками
# Образ накопителя будет создан после выполнения цели copylibs,
# которая создается CMake-командой build_kos_hw_image().
add_custom_command (OUTPUT ${DISK_IMG}
DEPENDS copylibs
COMMAND ${KL_SDK_ROOT_PATH}/common/prepare_hdd_img.sh
-d ${IMAGE_FS} -s 64 -f ext4 -img ${DISK_IMG}
COMMENT "Creating disk image '${DISK_IMG}' from files in '${IMAGE_FS}' ...")
# Создание образа решения для аппаратной платформы
# Цель copylibs означает копирование автоматически найденных динамических
# библиотек в директорию ${LIBS_PATH}. Эта директория будет включена
# в образ накопителя. Поскольку значение ${DISK_IMG} указано в параметре
# IMAGE_FILES, образ накопителя будет создан перед созданием образа решения,
# а также будет включен в образ решения.
build_kos_hw_image (kos-image
...
IMAGE_FILES ${ENTITIES_LIST} ${DISK_IMG}
PACK_DEPS_COPY_ONLY ON
PACK_DEPS_LIBS_PATH ${LIBS_PATH}
PACK_DEPS_COPY_TARGET copylibs)
Пример 2:
# В этом примере для запуска на QEMU создаются образ решения и
# отдельный образ накопителя с динамическими библиотеками,
# а для запуска на аппаратной платформе создается образ SD-карты,
# в который добавляются образ решения и динамические библиотеки.
# Установка значений переменных, используемых при сборке
# для аппаратной платформы
set (HW_IMAGE_FS "${CMAKE_BINARY_DIR}/hdd_hw")
set (HW_LIBS_PATH "${HW_IMAGE_FS}/lib")
# Установка значений переменных, используемых при сборке
# для QEMU
set (QEMU_IMAGE_FS "${CMAKE_BINARY_DIR}/hdd_qemu")
set (QEMU_LIBS_PATH "${QEMU_IMAGE_FS}/lib")
set (QEMU_DISK_IMAGE sdcard0.img)
set (QEMU_FLAGS "-nic none -m 2048 -drive file=${QEMU_DISK_IMAGE},if=sd,format=raw")
set (QEMU_DEPENDENCIES ${QEMU_DISK_IMAGE})
if (blob_container_ENTITY_FOUND)
# Настройка программы BlobContainer
set_target_properties (${blob_container_ENTITY} PROPERTIES
DEPENDS_ON_ENTITY ${precompiled_vfsVfsSdCardFs}
EXTRA_ENV " VFS_FILESYSTEM_BACKEND: client:kl.VfsSdCardFs")
# Создание образа накопителя с динамическими библиотеками для QEMU
add_custom_command (${QEMU_DISK_IMAGE}
DEPENDS copylibs_qemu
COMMAND ${KL_SDK_ROOT_PATH}/common/prepare_hdd_img.sh
-d ${QEMU_IMAGE_FS} -s 64 -f fat32 -img ${QEMU_DISK_IMAGE}
COMMENT "Creating disk image '${QEMU_DISK_IMAGE}' from files in '${QEMU_IMAGE_FS}' ...")
# Создание образа решения для QEMU
# Цель copylibs_qemu означает копирование автоматически найденных динамических
# библиотек в директорию ${QEMU_LIBS_PATH}. Эта директория будет включена
# в образ накопителя с динамическими библиотеками для QEMU. Значение ${QEMU_FLAGS}
# содержит параметры -drive file=${QEMU_DISK_IMAGE},if=sd,format=raw, которые
# требуются для использования на QEMU образа накопителя с динамическими
# библиотеками. Значение ${QEMU_DEPENDENCIES} требуется, чтобы обеспечить
# создание образа накопителя с динамическими библиотеками до создания образа
# решения для QEMU. (Образ решения не будет включать образ накопителя с
# динамическими библиотеками, но добавление этой зависимости целей
# нужно, чтобы выполнить создание образа накопителя с динамическими библиотеками.)
build_kos_qemu_image (kos-qemu-image
...
QEMU_FLAGS "${QEMU_FLAGS}"
QEMU_DEPENDENCIES "${QEMU_DEPENDENCIES}"
PACK_DEPS_COPY_ONLY ON
PACK_DEPS_LIBS_PATH "${QEMU_LIBS_PATH}"
PACK_DEPS_COPY_TARGET copylibs_qemu
IMAGE_FILES ${ENTITIES})
# Создание образа решения для аппаратной платформы
# Цель copylibs_hw означает копирование автоматически найденных динамических
# библиотек в директорию ${HW_LIBS_PATH}. Эта директория будет включена
# в образ SD-карты, который создается CMake-командой build_sd_image().
build_kos_hw_image (kos-image
...
PACK_DEPS_COPY_ONLY ON
PACK_DEPS_LIBS_PATH "${HW_LIBS_PATH}"
PACK_DEPS_COPY_TARGET copylibs_hw
IMAGE_FILES ${ENTITIES})
# Образ решения для аппаратной платформы будет создан после копирования
# автоматически найденных динамических библиотек в директорию ${HW_LIBS_PATH}.
# (Образ решения не будет включать динамические библиотеки, но добавление
# этой зависимости целей нужно, чтобы выполнить копирование до создания
# образа SD-карты.)
add_dependencies (kos-image copylibs_hw)
# Создание образа SD-карты
# Образ SD-карты будет создан на основе директории ${HW_IMAGE_FS},
# включающей образ решения для аппаратной платформы и директорию
# с динамическими библиотеками. Образ SD-карты будет создан
# после создания образа решения для аппаратной платформы.
build_sd_image (sd-image
KOS_IMAGE_TARGET kos-image
IMAGE_FS ${HW_IMAGE_FS})
Способ с ручным поиском динамических библиотек
Нужно самостоятельно выполнить поиск динамических библиотек, от которых зависят программы решения. Это позволяет добавить в решение даже те динамические библиотеки, которые загружаются в память вызовом функции dlopen()
интерфейса POSIX.
Пример 1:
# В этом примере создается образ решения, включающий, помимо
# исполняемых файлов программ, динамическую библиотеку libm.so.
# Настройка программы VFS
set (VFS_SDCARD_ARGS "\
- -l
- nodev /tmp ramfs 0
- -l
- devfs /dev devfs 0
- -l
- romfs /lib romfs ro")
set_target_properties (${precompiled_vfsVfsSdCardFs} PROPERTIES
EXTRA_ARGS ${VFS_SDCARD_ARGS})
if (blob_container_ENTITY_FOUND)
# Настройка программы BlobContainer
set_target_properties (${blob_container_ENTITY} PROPERTIES
DEPENDS_ON_ENTITY ${precompiled_vfsVfsSdCardFs}
EXTRA_ENV " VFS_FILESYSTEM_BACKEND: client:kl.VfsSdCardFs")
endif ()
if(PLATFORM_SUPPORTS_DYNAMIC_LINKING)
# Получение полного пути к динамической библиотеке libm.so
find_file(LIBM_SO_FILE libm.so PATH_SUFFIXES lib REQUIRED)
set(EXTRA_FILES ${LIBM_SO_FILE})
else()
set(EXTRA_FILES)
endif()
# Создание образа решения для аппаратной платформы
# Динамическая библиотека libm.so будет добавлена в
# образ решения, поскольку значение ${EXTRA_FILES},
# указанное в параметре IMAGE_FILES, содержит полный
# путь к этой библиотеке.
build_kos_hw_image(kos-image
...
IMAGE_FILES ${ENTITIES}
${EXTRA_FILES})
Пример 2:
# В этом примере для запуска на QEMU создаются образ решения и
# отдельный образ накопителя с динамической библиотекой libm.so.
# Установка значений переменных
set (QEMU_FLAGS "-nic none -m 2048")
set (QEMU_DEPENDENCIES)
if (PLATFORM_SUPPORTS_DYNAMIC_LINKING)
# Установка значений переменных
set (IMAGE_FS "${CMAKE_BINARY_DIR}/hdd")
set (LIBS_PATH "${IMAGE_FS}/lib")
set (QEMU_DISK_IMAGE sdcard0.img)
string (APPEND QEMU_FLAGS "-drive file=${QEMU_DISK_IMAGE},if=sd,format=raw")
set (QEMU_DEPENDENCIES ${QEMU_DISK_IMAGE})
# Настройка программы BlobContainer
set_target_properties (${blob_container_ENTITY} PROPERTIES
DEPENDS_ON_ENTITY ${precompiled_vfsVfsSdCardFs}
EXTRA_ENV " VFS_FILESYSTEM_BACKEND: client:kl.VfsSdCardFs")
# Получение полного пути к динамической библиотеке libm.so
find_file (LIBM_SO_FILE libm.so PATH_SUFFIXES lib REQUIRED)
# Создание образа накопителя с динамической библиотекой libm.so
add_custom_command (OUTPUT ${QEMU_DISK_IMAGE}
COMMAND ${CMAKE_COMMAND} -E make_directory ${LIBS_PATH}
COMMAND ${CMAKE_COMMAND} -E copy ${LIBM_SO_FILE} ${LIBS_PATH}
COMMAND ${KL_SDK_ROOT_PATH}/common/prepare_hdd_img.sh
-d ${IMAGE_FS} -s 64 -f fat32 -img ${QEMU_DISK_IMAGE}
COMMENT "Creating disk image '${QEMU_DISK_IMAGE}' from files in '${IMAGE_FS}' ...")
endif ()
# Создание образа решения для QEMU
# Значение ${QEMU_FLAGS} содержит параметры -drive file=${QEMU_DISK_IMAGE},if=sd,format=raw,
# которые требуются для использования на QEMU образа накопителя с динамической
# библиотекой libm.so. Значение ${QEMU_DEPENDENCIES} требуется, чтобы обеспечить
# создание образа накопителя с динамической библиотекой libm.so до создания образа
# решения для QEMU. (Образ решения не будет включать образ накопителя с
# динамической библиотекой libm.so, но добавление этой зависимости целей
# нужно, чтобы выполнить создание образа накопителя с динамической библиотекой libm.so.)
build_kos_qemu_image (kos-qemu-image
...
QEMU_FLAGS "${QEMU_FLAGS}"
QEMU_DEPENDENCIES "${QEMU_DEPENDENCIES}"
IMAGE_FILES ${ENTITIES})
В начало