KasperskyOS Community Edition 1.3

Добавление динамических библиотек в решение на базе KasperskyOS

Чтобы добавить динамические библиотеки в решение на базе 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})