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

Izz*_*zzo 1 gcc system-calls dynamic-linking

假设我编写了一个无意义的程序,其特征是单个系统调用open

#include <fcntl.h> 

void main()
{
    int hi = open("does not exist", 0);
}
Run Code Online (Sandbox Code Playgroud)

当我编译程序并对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)
Run Code Online (Sandbox Code Playgroud)

我只识别该libc.so.6链接,但不识别其他链接。

这些其他库之一是否包含内核系统调用?或者系统调用函数有可能是静态链接的吗?(似乎不太可能)。

Ste*_*itt 5

系统调用作为函数是直接可见的,并且它们是这样链接的。每种架构都定义了自己的系统调用调用方式;在 64 位 x86 上,它涉及特定的 CPU 指令SYSCALL.

\n

C 库为大多数系统调用提供了包装器(以及为少数未包装的系统调用提供的通用系统调用函数),而 \xe2\x80\x99 就是程序链接到的内容。

\n

程序中链接的其他库是动态链接器vDSO

\n