我正在阅读一个 C 头文件并正在寻找特殊函数。我找到了带有 extern
声明的函数,但我需要知道该函数的来源。考虑到包含目录由许多其他头文件组成,我如何找到该函数的相关文件?
详细来说,我在unistd.h
头文件中搜索写入函数,并且该头文件有许多包含的头文件,所以我很困惑写入函数的定义在哪里。
最佳答案
既然你提到你在 Ubuntu,你应该看看 glibc 源代码。
一般来说,系统调用的 C 库实现是通过汇编(而不是 C)使用一系列复杂的宏来完成的,对于 x86 linux 架构,这些宏位于 sysdeps/unix/sysv/linux/i386/sysdep.h (树中其他位置的各种其他文件中的一些也称为 sysdep.h 和 sysdep.S) - 调用宏以实现写入系统调用的实际文件是在编译时生成的,其中包含多个文件:
- syscalls.list
- make-syscalls.sh
- syscall-template.S
- asm/unistd.h,由内核提供 - 此处未链接,其主要贡献是
#define __NR_write 4
一般来说,最终结果没什么好看的——它从堆栈中取出三个参数并将它们放入寄存器中,并将系统调用号(4)放入eax中,然后执行历史上的“ENTER_KERNEL” “int $0x80”,但现在是某种动态 block 中的代码片段。
然后内核会处理剩下的事情。
关于c - c中外部函数的来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19914553/