У меня проблема, я не понимаю, что происходит.
Я не могу добавить системный вызов при использовании SYSCALL_DEFINE. Это каждая сборка идет к:
ld: arch/x86/entry/syscall_32.o:(.rodata+0xc18): undefined reference to 'sys_get_pid_info'
То же для версии 64
Код фактически компилируется и работает, когда я делаю обычный прототип, такой как:
asmlinkage long get_pid_info(void)
но нет, если я использую: SYSCALL_DEFINE0(get_pid_info)
Вот патч diff в ветке Master для 4.19 Release.
diff --git a/Makefile b/Makefile
index 7a2a9a175756..fe78cd54b7ef 100644
--- a/Makefile
+++ b/Makefile
@@ -970,6 +970,7 @@ endif
ifeq ($(KBUILD_EXTMOD),)
core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/
+core-y += get_pid_info/
vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
$(core-y) $(core-m) $(drivers-y) $(drivers-m) \
diff --git a/arch/x86/entry/syscalls/syscall_32.tbl b/arch/x86/entry/syscalls/syscall_32.tbl
index 3cf7b533b3d1..08e6569134d6 100644
--- a/arch/x86/entry/syscalls/syscall_32.tbl
+++ b/arch/x86/entry/syscalls/syscall_32.tbl
@@ -398,3 +398,4 @@
384 i386 arch_prctl sys_arch_prctl __ia32_compat_sys_arch_prctl
385 i386 io_pgetevents sys_io_pgetevents __ia32_compat_sys_io_pgetevents
386 i386 rseq sys_rseq __ia32_sys_rseq
+387 i386 get_pid_info sys_get_pid_info
diff --git a/arch/x86/entry/syscalls/syscall_64.tbl b/arch/x86/entry/syscalls/syscall_64.tbl
index f0b1709a5ffb..da6c9d0f0c01 100644
--- a/arch/x86/entry/syscalls/syscall_64.tbl
+++ b/arch/x86/entry/syscalls/syscall_64.tbl
@@ -343,6 +343,7 @@
332 common statx __x64_sys_statx
333 common io_pgetevents __x64_sys_io_pgetevents
334 common rseq __x64_sys_rseq
+335 common get_pid_info sys_get_pid_info
#
# x32-specific system call numbers start at 512 to avoid cache impact
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index 2ac3d13a915b..a0bff632b8fa 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -1296,4 +1296,7 @@ static inline unsigned int ksys_personality(unsigned int personality)
return old;
}
+
+asmlinkage long sys_get_pid_info(void);
+
#endif
Примечание. С обычным прототипом мне не нужно добавлять его в include/linux/syscalls.h
Вот моя функция C Syscall:
#include <linux/kernel.h>
#include <linux/syscalls.h>
//asmlinkage long get_pid_info(void) <-- works with it
SYSCALL_DEFINE0(get_pid_info)
{
printk("Hello world !\n");
return 0;
}
Теперь вот вывод сборки (включая напечатанный мой syscall)
[...]
CC get_pid_info/get_pid_info.o
AR get_pid_info/built-in.a
[...]
LD vmlinux.o
MODPOST vmlinux.o
ld: arch/x86/entry/syscall_64.o:(.rodata+0xa78): undefined reference to `sys_get_pid_info'
ld: arch/x86/entry/syscall_32.o:(.rodata+0xc18): undefined reference to `sys_get_pid_info'
make: *** [Makefile:1036: vmlinux] Error 1
Спасибо за вашу помощь! Я думаю, что это не очень трудно, но я застрял здесь ..
С наилучшими пожеланиями, Бастьен