我一直在想(出于好奇) ioctl系统调用的用户空间包装器在x86_64 Linux上的什么地方定义的。我的第一个想法是glibc -在我的Fedora 24机器上检查了安装版本上的暴露符号后,我可以看到(除非我做错了) libc将ioctl符号暴露为'W‘,这意味着它是一个具有默认实现的弱符号。不过,位于misc/ioctl.c的glibc源代码树中的默认实现似乎是一个存根,它只是将errno设置为ENOSYS并返回-1。
尽管如此,ioctl还是可以工作的(很明显,否则我的系统就不会很好用)。我意识到它可能是某个文件中的汇编代码,并以某种方式进行了组装和链接,从而覆盖了glibc公开的弱符号。我还知道,应用程序完全可以使用系统调用直接调用ioctl,可以通过glibc syscall包装器直接调用,也可以直接使用汇编调用。
也就是说,考虑到我碰巧观察到的库源代码(libdrm)包括标准的ioctl头文件/usr/include/sys/ioctl.h,并且似乎也没有包含我可以看到的包装器自己的实现,我想知道我应该在哪里查找。
这是我更深入地理解GNU/Linux系统最底层的努力的一部分。谢谢你的指点,如果之前有人问过这个问题,我很抱歉,但如果有,我看不到任何答案。
更新:我忽略了上面提到的内容,但我也检查了内核映射的虚拟vdso库-我在其中只能找到以下内容:
0000000000000a00 W clock_gettime
0000000000000db0 W getcpu
0000000000000c40 W gettimeofday
0000000000000000 A LINUX_2.6
0000000000000d90 W time
0000000000000a00 T __vdso_clock_gettime
0000000000000db0 T __vdso_getcpu
0000000000000c40 T __vdso_gettimeofday
0000000000000d90 T __vdso_time更新:关于glibc的默认定义是存根,这似乎是错误的。正如nos在评论中指出的那样,反汇编表明它正在执行真正的系统调用。我已经发布了一个答案来反映这一点。
https://stackoverflow.com/questions/41246306
复制相似问题