Получение идентификатора сборки из ELF-образа (elf_id.h)

API определен в заголовочном файле sysroot-*-kos/include/kos/elf_id.h из состава KasperskyOS SDK.

API позволяет получить идентификатор сборки (англ. build ID) из ELF-образа. Идентификатор сборки необходим для работы механизма семплирующего профилирования. Также желательно, чтобы идентификатор сборки был доступен GBD-серверу ядра, который использует этот идентификатор, чтобы сообщить отладчику GDB, где выполнять поиск отладочных символов. (В качестве альтернативы идентификатору сборки GDB-сервер ядра использует имя исполняемого файла.)

Идентификатор сборки может отсутствовать в ELF-образе. Компоновщик добавляет идентификатор сборки в ELF-образ только в том случае, если компилятор вызван с параметром -Wl,--build-id.

Сведения о функциях API приведены в таблице ниже.

Использование API

Чтобы получить идентификатор сборки и его размер из ELF-образа, нужно вызвать функцию KosElfGetBuildId(). Эти данные нужно передать ядру, чтобы они были доступны механизму семплирующего профилирования и GDB-серверу ядра. Передача идентификатора сборки и его размера ядру осуществляется при вызове функции KosTaskInitFromSeg(), KosTaskInitFromSegEx() или KosTaskLoadSegments() из API task.h. Через параметр segs эти функции принимают массив структур VmSeg, описывающих загружаемые сегменты ELF-образа. Тип структур VmSeg определен в заголовочном файле sysroot-*-kos/include/coresrv/vmm/vmm_types.h из состава KasperskyOS SDK. Эти структуры содержат поля buildId и buildIdSize. Для каждого загружаемого сегмента ELF-образа (включая таблицу символов .symtab и таблицу строк .strtab) нужно задать идентификатор сборки и его размер (одни и те же значения для всех сегментов). В то же время можно использовать функцию KnElfCreateVmSegEx() из API elf_api.h, которая автоматически заполняет поля buildId и buildIdSize в массиве структур VmSeg (при наличии идентификатора сборки в ELF-образе) и передает адрес этого массива через выходной параметр segs. То есть при использовании функции KnElfCreateVmSegEx() не нужно применять функцию KosElfGetBuildId().

Также автоматическое заполнение полей buildId и buildIdSize структуры VmSeg выполняет функция KnVmSegInitFromBuf() из API vmm_api.h, которая принимает идентификатор сборки и его размер через входные параметры buildId и buildIdSize соответственно. Идентификатор сборки и его размер записываются в структуру VmSeg, заданную через выходной параметр seg, для последующей передачи ядру вызовом функции KosTaskInitFromSeg(), KosTaskInitFromSegEx() или KosTaskLoadSegments().

Функции KosTaskInit(), KosTaskInitEx() и KosTaskLaunch() из API task.h передают ядру идентификатор сборки и его размер при наличии идентификатора сборки в ELF-образе.

Сведения о функциях API

Функции elf_id.h

Функция

Сведения о функции

KosElfGetBuildId()

Назначение

Позволяет получить идентификатор сборки из ELF-образа.

Параметры

  • [in] elf – указатель на буфер с ELF-образом.
  • [in] elfSize – размер ELF-образа в байтах.
  • [in] buildIdMaxSize – размер буфера для сохранения идентификатора сборки, в байтах.
  • [out] buildId – указатель на буфер для сохранения идентификатора сборки.
  • [out] buildIdSize – указатель на размер идентификатора сборки в байтах.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

Если идентификатор сборки отсутствует в ELF-образе, возвращает rcResourceNotFound.

В начало