Добавление динамических библиотек в решение на базе KasperskyOS
Чтобы добавить динамические библиотеки в решение на базе KasperskyOS, существует два способа: с автоматическим и ручным поиском динамических библиотек, от которых зависят программы решения.
Способ с автоматическим поиском динамических библиотек
Динамические библиотеки, которые загружаются в память вызовом функции 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)
# Настройка программы BlobContainerset_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")
# Установка значений переменных, используемых при сборке# для QEMUset (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)
# Настройка программы BlobContainerset_target_properties (${blob_container_ENTITY} PROPERTIES
DEPENDS_ON_ENTITY ${precompiled_vfsVfsSdCardFs}
EXTRA_ENV " VFS_FILESYSTEM_BACKEND: client:kl.VfsSdCardFs")
# Создание образа накопителя с динамическими библиотеками для QEMUadd_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.# Настройка программы VFSset (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)
# Настройка программы BlobContainerset_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.sofind_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})
# Настройка программы BlobContainerset_target_properties (${blob_container_ENTITY} PROPERTIES
DEPENDS_ON_ENTITY ${precompiled_vfsVfsSdCardFs}
EXTRA_ENV " VFS_FILESYSTEM_BACKEND: client:kl.VfsSdCardFs")
# Получение полного пути к динамической библиотеке libm.sofind_file (LIBM_SO_FILE libm.so PATH_SUFFIXES lib REQUIRED)
# Создание образа накопителя с динамической библиотекой libm.soadd_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})
Идентификатор статьи: shared_libraries_adding_to_solution, Последнее изменение: 27 янв. 2025 г.