假设我编写了一个无意义的程序,其特征是单个系统调用open
:
#include <fcntl.h>
void main()
{
int hi = open("does not exist", 0);
}
当我编译程序并对ldd
输出发出命令时,我得到以下信息:
linux-vdso.so.1 (0x00007ffddd741000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6835328000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6835584000)
我只识别该libc.so.6
链接,但不识别其他链接。
这些其他库之一是否包含内核系统调用?或者系统调用函数有可能是静态链接的吗? (似乎不太可能)。
答案1
系统调用作为函数并不直接可见,并且它们也不是这样链接的。每种架构都定义了自己的系统调用调用方式;在 64 位 x86 上,它涉及特定的CPU指令,SYSCALL
。
C 库为大多数系统调用(以及通用系统调用函数对于一些未包装的系统调用),这就是您的程序链接到的内容。