内核具有基于中断和幻数的 API。这个 API 太低级,对程序员不友好,所以发明了 libcs。它们暴露了函数,这些函数很方便并且直接调用内核 API。
事实 1:Linux 内核 API 非常稳定,因此静态链接到旧 musl 的应用程序可以预期旧内核 API 行为仍然有效。
事实 2:将 musl 静态链接到应用程序使整个应用程序直接调用内核 API。
事实 3:使用静态链接 musl 编译的应用程序将仅使用裸内核 API 在当前和未来版本的 Linux 上运行。
那么为什么有些发行版有明确的 musl 支持呢?拥有符合 Linux 的内核 API 还不够吗?
我的一些“事实”一定是无效的,因为我无法回答自己的问题。
您的三个事实足够准确,至少可以理解 C 库(在高层次上)需要什么。
我认为无效的是您对“明确的musl支持”的理解。从 musl 的角度来看,存在三种类型的分布:
与任何其他二进制文件一样,您可以在任何 Linux 发行版上使用依赖于 musl 的二进制文件,只要您还提供所需的库即可。如果它是静态链接的,则没有可提供的库。对发行版本身没有具体要求。
您可能想知道上面的第三种类型。在不依赖于它的发行版中提供 musl 是为了让想要使用 musl 构建二进制文件的用户的生活更简单:这些发行版提供了 musl 库(通常是静态和动态的)、头文件和编译器支持使用 musl 构建二进制文件。这意味着用户可以开始使用 musl 构建二进制文件,而无需自己安装 musl 并配置他们的编译器。
一般来说,一些发行版支持给定特性,而另一些不支持,这并不意味着后者不能支持该特性。这意味着最终用户需要完成所涉及的工作。