Ошибка при реализации системного вызова hello world в Lunix

#c #linux #linux-kernel #system-calls

#c #линукс #linux-ядро #системные вызовы

Вопрос:

Я компилирую свое ядро для системного вызова hello world, но получаю следующую ошибку:

ld: arch/x86/запись/syscall_64.o:(.rodata 0xdc0): неопределенная ссылка на __x64_sys_hello' ld: arch/x86/entry/syscall_x32.o:(.rodata 0xdc0): undefined reference to __x64_sys_привет’ сделать: *** [Файл создания:1139: vmlinux] Ошибка 1 site:stackoverflow.com

Ниже приведены изменения, которые я внес, чтобы добавить системный вызов hello world:

Текущая версия ядра=5.11.0.40

linux-5.8.1/привет/привет.c:

 #include lt;linux/kernel.hgt; #include lt;linux/syscalls.hgt;  asmlinkage long sys_hello(void) {  printk("Hello worldn");  return 0; }  

linux-5.8.1/Makefile:

 ifeq ($(KBUILD_EXTMOD),) core-y  = kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/ hello/  

linux-5.8.1/включить/linux$ gedit syscalls.h

 asmlinkage long sys_hello(void);  

linux-5.8.1/arch/x86/запись/системные вызовы$ gedit syscall_64.tbl

 440 common hello sys_hello  

С нетерпением жду ваших ответов.Заранее спасибо.

Ответ №1:

Этот код:

 asmlinkage long sys_hello(void) {  printk("Hello worldn");  return 0; }  

необходимо изменить на:

 SYSCALL_DEFINE0(hello) {  printk("Hello worldn");  return 0; }  

SYSCALL_DEFINE0(sname) Макрос определяется #include lt;linux/syscalls.hgt; . Он определяется по-разному в зависимости от того CONFIG_ARCH_HAS_SYSCALL_WRAPPER , определен ли он в конфигурации ядра. Он определен для некоторых архитектур, но не для других.

Комментарии:

1. Большое вам спасибо за ваш ответ. Это сработало.