其实都没有实体源代码klogctl.c,而是通过编译时构造出来的源代码实体,比如klogctl这个函数,glibc的反汇编如下:
直接是0x67这个系统调用:103:
Reading symbols from /usr/lib64/libc-2.28.so...
(No debugging symbols found in /usr/lib64/libc-2.28.so)
(gdb) disass klogctl
Dump of assembler code for function klogctl:0x000000000003a320 <+0>: endbr640x000000000003a324 <+4>: mov $0x67,%eax0x000000000003a329 <+9>: syscall0x000000000003a32b <+11>: cmp $0xfffffffffffff001,%rax0x000000000003a331 <+17>: jae 0x3a334 <klogctl+20>0x000000000003a333 <+19>: ret0x000000000003a334 <+20>: mov 0x384b2d(%rip),%rcx # 0x3bee680x000000000003a33b <+27>: neg %eax0x000000000003a33d <+29>: mov %eax,%fs:(%rcx)0x000000000003a340 <+32>: or $0xffffffffffffffff,%rax0x000000000003a344 <+36>: ret
从Linux的源码里才能查看到103是什么。
/glibc-2.28/sysdeps/unix/sysv/linux/syscalls.list文件里的定义,也说是映射到系统调用syslog。
klogctl EXTRA syslog i:isi klogctl
在Linux系统里有这个系统调用的定义在printk.c这个文件里
SYSCALL_DEFINE3(syslog, int, type, char __user *, buf, int, len)
{return do_syslog(type, buf, len, SYSLOG_FROM_READER);
}
所以不要纠结说,为什么在glibc里找不到相应的klogctl.c这么个文件。