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

В начало