系统调用函数如何链接到可执行文件?

系统调用函数如何链接到可执行文件?

假设我编写了一个无意义的程序,其特征是单个系统调用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 库为大多数系统调用(以及通用系统调用函数对于一些未包装的系统调用),这就是您的程序链接到的内容。

您的程序中链接的其他库是动态链接器虚拟DSO

相关内容