I'm trying to register a kprobe to retrieve the address of a syscall. But all my attempts seem to return -22 as the error code. The sample code below (incomplete but contains the related functions) tries to register a kernel probe for the sys_mkdir call.
It doesn't seem to matter if I specify pre or post handlers, simply registering the probe doesn't work.
Note: I'm trying to use kprobes as a replacement for the unexported kallsyms_lookup_name that is no longer exported in kernel 5.7 and above.
unsigned long lookup_name(const char *name) { int ret; struct kprobe kp; unsigned long retval; kp.symbol_name = name; ret = register_kprobe(&kp); if (ret < 0) { printk(KERN_DEBUG "register_kprobe failed for symbol %s, returned %d\n", name, ret); return 0; } retval = (unsigned long)kp.addr; unregister_kprobe(&kp); return retval; } static int __init mod_init(void) { int (*fn)(unsigned long param); fn = (void*)lookup_name("__x64_sys_mkdir"); }