ОС — Ubuntu 20.10.
Источник ядра: linux_5.8.0-59.66.
Я переношу модификации ядра с Centos 7 Rhel 7.9 на Ubuntu.
Исходный немодифицированный исходный код ядра Ubuntu компилируется и работает на этой машине без ошибок. Настройка компилятора, кажется, работает правильно.
Моя текущая проблема связана с системным вызовом, который я добавил. Генерируемая ошибка -
LD .tmp_vmlinux.btf
ld: arch/x86/entry/syscall_64.o:(.rodata+0xdc0): неопределенная ссылка на `__x64_sys_s_enable'
BTF .btf.vmlinux.bin.o
Ошибка сегментации (дамп ядра)
LD .tmp_vmlinux.kallsyms1
.btf.vmlinux.bin.o: файл не распознан: формат файла не распознан
make: *** [Makefile:1163: vmlinux] Ошибка 1
Я искал и гуглил эту исходную ошибку «неопределенная ссылка», нашел возможные исправления, которые не сработали.
Вот шаги, которые я использовал для добавления системного вызова, который изначально работал на Centos 7 и RHEL 7.9.
Модифицирован /SOURCE-DIRECTORY/include/linux/syscalls.h, закомментировав исходную строку и добавив ссылку на __64 (включая пустую строку над ней) -
asmlinkage длинный __64_sys_s_enable (int s_enable_flag);
// asmlinkage long sys_s_enable(int s_enable_flag);
Изменен /SOURCE-DIRECTORY/arch/x86/include/asm/syscalls.h добавление -
# ДОБАВЛЕНИЕ СИСТЕМНОГО ВЫЗОВА
440 64 s_enable sys_s_enable
Поля разделены клавишей TAB, и я не добавлял пустых строк.
Создал исходный каталог и файлы -
/SOURCE-DIRECTORY/s_enable, содержащий s_enable.c.
s_enable.c в целом
#include <linux/kernel.h>
внешний интервал s_enable_flag;
asmlinkage длинный sys_s_enable (int i)
{
// printk(KERN_INFO "В ИСХОДНОМ SYSCALL s_enable\n");
s_enable_flag = я;
вернуть 0;
}
И добавил соответствующий каталог системных вызовов в Makefile.
core-y += ядро/сертификаты/mm/fs/ipc/security/crypto/block/s_enable/
И запустил "sudo make".
Я не уверен, что я могу делать неправильно в том, что «make» работает с исходным кодом ядра, а системный вызов, который я пытаюсь добавить, работал на других упомянутых дистрибутивах.
Спасибо за любой вклад, который вы можете предоставить.