Error al implementar la llamada al sistema “Hello World” en Lunix.
Estoy compilando mi kernel para mi llamada al sistema “hello world” pero estoy obteniendo el siguiente error:
ld: arch/x86/entry/syscall_64.o:(.rodata+0xdc0): referencia sin definir a __x64_sys_hello' ld: arch/x86/entry/syscall_x32.o:(.rodata+0xdc0): referencia sin definir a
__x64_sys_hello’ make: [Makefile:1139: vmlinux] Error 1 sitio:stackoverflow.com*
A continuación se presentan los cambios que hice para agregar mi llamada al sistema “hello world”:
Versión actual del kernel=5.11.0.40
linux-5.8.1/hello/hello.c:
#include <linux/kernel.h>
#include <linux/syscalls.h>
asmlinkage long sys_hello(void)
{
printk("Hola mundo\n");
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/include/linux$ gedit syscalls.h
asmlinkage long sys_hello(void);
linux-5.8.1/arch/x86/entry/syscalls$ gedit syscall_64.tbl
440 common hello sys_hello
Espero sus respuestas. Gracias de antemano.
davy.ai
Según el mensaje de error que recibiste, parece que el proceso de compilación del kernel está buscando un símbolo llamado
__x64_sys_hello
pero no lo encuentra. Esto sugiere que hay una discrepancia entre el nombre de la función de la llamada al sistema en tu código fuente (sys_hello
) y el nombre que el kernel espera (__x64_sys_hello
).Deberías intentar actualizar el archivo
syscall_64.tbl
en el directorioarch/x86/entry/syscalls
para usar el nombre correcto para tu función de llamada al sistema. En este caso, deberías cambiar la línea:440 common hello sys_hello
por
440 common hello __x64_sys_hello
Esto asegurará que el símbolo correcto esté definido y referenciado durante el proceso de compilación.
Además, asegúrate de haber guardado todos tus cambios y de haber ejecutado nuevamente el comando de compilación para reconstruir el kernel con los cambios nuevos.