背景:了解ioctl()从用户空间到内核空间的整个调用链。内核那边已经理清了,glibc这边不太好弄。晚上各种查,捣鼓出了一点结果。
首先从下载的glibc源码里找ioctl(),没发现比较直接的代码实现(主要是没看到陷入内核的相关代码)。后来不得已,干脆调试glibc代码得了,以前没调试过,不妨现在一试。
调试glibc代码,主要参考这两篇:使用gdb调试glibc和用gdb追踪glibc代码执行过程。大致过程是:
(1) 安装glibc符号表:$sudo apt-get install libc6-dbg
(2)下载glibc源码:$sudo apt-get source libc6-dev
a. 命令执行完后,在当前目录下生成eglibc-xxx目录,里面就是glibc源码。我自己生成的目录为~/eglibc-2.15
(3)编译生成带有调试信息的可执行文件:$gcc -g -o xxx xxx.c
(4)调试xxx:gdb xxx
a. 指定源码搜索路径:directory ~/eglibc-2.15
其实~/eglibc-2.15这个目录范围很广,如果知道自己要调试的库函数所在的具体路径,就直接指定这个路径。就鄙人这个情况,我是不知道ioctl()是在哪个路径哪个文件下的,