#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. Большое вам спасибо за ваш ответ. Это сработало.