Подготовка загружаемых сегментов ELF-образа для создания процесса (elf_api.h)

30 сентября 2026

ID libkos_elf_api

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

API позволяет использовать ELF-образ, чтобы создать буферы MDL с загружаемыми сегментами для последующего отображения этих сегментов на виртуальную память нового процесса.

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

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

Типовой сценарий использования API включает следующие шаги:

  1. Создать объект, описывающий ELF-образ вызовом функции KnElfOpen().

    ELF-образ нужно поместить в буфер, указатель на который функция KnElfOpen() принимает через параметр img. Если ELF-образ некорректен, функция завершится с ошибкой, и объект, описывающий ELF-образ, не будет создан. Также корректность ELF-образа можно проверить до выполнения этого шага вызовом функцию KnElfValidate().

  2. Создать буферы MDL с загружаемыми сегментами ELF-образа для последующего отображения этих сегментов на виртуальную память нового процесса.

    Чтобы выполнить этот шаг, нужно вызвать функцию KnElfCreateVmSegEx(), задавая через входной параметр descr объект, описывающий ELF-образ.

    При использовании функции KnElfCreateVmSegEx() нужно учитывать, что таблица символов .symtab и таблица строк .strtab считаются отдельными загружаемыми сегментами ELF-образа. То есть в массиве структур, адрес которого передается через выходной параметр segs, и в числе загружаемых сегментов, передаваемом через выходной параметр segsCount, таблица символов и таблица строк учитываются наряду с сегментами типа LOAD. Функция может создать буфер MDL с таблицей символов и буфер MDL с таблицей строк для последующего отображения на память нового процесса независимо от того, находятся секции .symtab и .strtab в загружаемом сегменте ELF-образа или нет.

    Чтобы не создавать буфер MDL с таблицей символов, нужно указать значение RTL_NULL в параметре symTabIndex. Чтобы не создавать буфер MDL с таблицей строк, нужно указать значение RTL_NULL в параметре strTabIndex. Если в этих параметрах указаны значения, отличные от RTL_NULL, то буферы MDL с таблицей символов и таблицей строк будут созданы при условии наличия секций .symtab и .strtab в ELF-образе. При отсутствии секции .symtab или .strtab передается значение SEG_IDX_INVALID через параметр symTabIndex или strTabIndex соответственно.

    Через параметр relocBase функция KnElfCreateVmSegEx() принимает смещение загрузки ELF-образа. Смещение загрузки ELF-образа рассчитывается функцией KnTaskVmReserveForElf() из API task_api.h. Если ELF-файл имеет тип DYN, функция KnTaskVmReserveForElf() передает через выходной параметр relocBase случайное смещение с целью поддержки ASLR, для ELF-файла другого типа передает нулевое смещение. Функция KnElfCreateVmSegEx() использует смещение загрузки ELF-образа, чтобы рассчитать адрес точки входа в программу (выходной параметр entry). Также с учетом смещения загрузки ELF-образа функция KnElfCreateVmSegEx() рассчитывает адрес загрузки каждого загружаемого сегмента, кроме таблицы символов .symtab и таблицы строк .strtab. Для таблицы символов и таблицы строк функция KnElfCreateVmSegEx() указывает нулевые адреса загрузки, поэтому фактические адреса загрузки таблицы символов и таблицы строк будут определены автоматически механизмом управления виртуальной памятью при отображении буферов MDL, содержащих эти таблицы, на виртуальную память нового процесса. Адреса загрузки сегментов сохраняются функцией KnElfCreateVmSegEx() в поле loadAddr структур, адрес массива которых передается через выходной параметр segs.

  3. Отобразить буферы MDL с загружаемыми сегментами ELF-образа на виртуальную память нового процесса.

    Этот шаг выполняется при использовании функции KosTaskInitFromSeg(), KosTaskInitFromSegEx() или KosTaskLoadSegments() из API task.h.

  4. Освободить ресурсы, выделенные при успешном выполнении функции KnElfCreateVmSegEx().

    Чтобы выполнить этот шаг, нужно вызвать функцию KnElfFreeVmSeg().

  5. Удалить объект, описывающий ELF-образ, вызовом функции KnElfClose().

    После удаления объекта, описывающего ELF-образ, можно удалить буфер с ELF-образом.

Функция KnElfGetLoadInfo() позволяет получить данные, которые используются, чтобы зарезервировать в новом процессе регион виртуальной памяти для последующего отображения буферов MDL с сегментами ELF-образа типа LOAD. Эта функция предназначена для использования библиотекой libkos.

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

Функции elf_api.h

Вам помогла эта статья?
Что нам нужно улучшить?
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!