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
Функция |
Сведения о функции |
|---|---|
|
Назначение Позволяет получить идентификатор сборки из ELF-образа. Параметры
Возвращаемые значения В случае успеха возвращает Если идентификатор сборки отсутствует в ELF-образе, возвращает |