Linux 与 Windows 中的系统库

Ofe*_*lon -1 linux windows shared-libraries

我的背景是 Windows,我是 Linux 菜鸟。仍然试图围绕一些基本概念,特别是系统库:

  1. Windows 有包装系统调用的 ntdll.dll 和一个 CRT dll,它在 C 语法与 ntdll 操作系统公开服务之间进行接口。
    (为简单起见,我忽略了 user32、kernel32、kernalbase 等中间层。我也意识到 CRT 是几个 dll,这不是重点)。
  2. 似乎 Unix/Linux 几乎只有 libc,它包装系统调用直接从您的应用程序代码中调用。

这是正确的比喻吗?(ntdll + CRT) <===> libc ?

我意识到 C 和 Unix 是一起进化的,但仍然感到惊讶。是否可以将 C 接口硬连接到 Unix/Linux 的操作系统中?在 Windows 中,非 C 程序链接到底层操作系统提供的 dll。在 Linux 中是否有可能没有 OS/C 运行时边界?

bk2*_*204 5

通常,大多数程序链接到 libc,即使它们是用另一种语言编写的。它提供 C 标准库接口(如 MSVCRT)、POSIX 特性(相当于 Win32 子系统的某些部分)和系统调用的包装器。例如,Rust 使用 libc 是因为它提供了一个可移植的环境来链接。

然而,在Linux上,你不必须反对的libc链接。Go 选择直接进行系统调用,这意味着它可以发送没有运行时依赖项的静态二进制文件。这是可能的,因为 Linux 保证了稳定的内核 ABI,但并非所有操作系统都这样做(例如,macOS)。因此,除非您拥有大量资源(例如整个编程语言团队),否则这通常不是明智之举,除非您只使用少数系统调用。

我应该指出,即使 Windows 本质上也与 C 语言相关联:它使用 C 字符串(授予的,通常是宽 C 字符串)进行系统调用,并且大部分内核都是用 C 编写的。即使您从从头开始,您仍然需要一个通用的 C 接口,因为几乎每种编程语言都有与 C 交互的方式。