5

好的,事情就是这样。

大多数人在第一次接触 C 语言时同时了解 C 标准库,我也不例外。但是当我现在正在学习 linux 时,我倾向于对 C 库感到困惑。首先,我知道当您在 Linux 发行版上安装 gcc 作为静态库时,您会得到一个不错的旧 C 标准库。在那之后,只要你连接到互联网,你就会得到一个新的稳定版本的 glibc。

我开始研究 glibc API,这就是我搞砸的地方。glibc 似乎支持大量的库,基本上从 POSIX C 标准库(它实现了标准 C 库(包括我所知道的 C99))到它自己基于 POSIX 标准 C 库的扩展。

这是否意味着 glibc 实际上修改或添加了 POSIX C 标准库中的函数?甚至添加全新的标题集?因为我看到一些不在标准 C 库中但实际上包含在标准 C 头文件中的函数(例如 strnlen()

还提到我提到的“glibc 制作全新的头文件集”,是因为我开始看到一些看起来非常独特的头文件,例如 linux/blahblah.h 或 sys/syscalls.h <=(这些只有 glibc 支持的库?)

下一个问题是我居然听说linux是基于C语言构建的。这是否意味着linux用它自己的gcc编译器编译自己??????

4

3 回答 3

5

对于第一个问题,glibc 遵循标准 C 和 POSIX,来自About glibc

GNU C 库主要设计为可移植的高性能 C 库。它遵循所有相关标准,包括 ISO C11 和 POSIX.1-2008。它也是国际化的,并且具有已知的最完整的国际化接口之一。

对于第二个问题,是的,您可以使用 gcc 编译 Linux。甚至 gcc 本身也可以使用 gcc 进行编译,这称为bootstrapping

于 2013-07-28T09:44:46.900 回答
2

Glibc 实现了 POSIX、ANSI 和 ISO C 标准,并添加了自己的“绒毛”,它称之为“glibc 扩展”。它们都“混合在一起”的原因是因为它们将库作为一个包编写,没有单独的 POSIX-only glibc。

<linux/blah>不是 glibc 的一部分。它是一组专门为操作系统编写的头文件,由 glibc 之外的人编写,让程序员可以访问 Linux 内核 API。它是 Linux 内核的“一部分”并与它一起安装,并用于内核黑客攻击。<sys/blah>是 glibc 的一部分,并且是特定于 Linux 的。它提供了对相当抽象的 Linux 系统 API 的访问。

至于你的第二个问题,是的。Linux 是用 C 编写的,因为它(根据 Linus 的说法)是唯一用于内核和系统编程的编程语言。这样做的方法是通过一种称为引导的技术,其中构建了一个小型编译器(通常在 ASM 中手动)并构建整个内核或整个 GCC。

于 2013-07-28T13:48:13.207 回答
1

还有一件事需要注意:libc 的目的之一是从实际的系统内核中抽象出来。因此,libc 是您的应用程序中特定于内核的一部分。如果你有一个不同的内核和不同的系统调用,你需要一个专门编译的 libc。AFAIK,因此 libc 通常链接为共享库。

在 linux 上,我们通常安装 glibc,因为 linux 系统通常是 GNU/Linux 系统,在 linux 内核之上具有 GNU 工具链。

是的,glibc 确实在某些方面扩展了标准:asprintf()例如,该函数起源于 gnu-addition。随后它几乎成为了 C11 标准,但在它成为其中的一部分之前,它的使用将需要基于 glibc 的系统,或者与 glibc 静态链接。

默认情况下,glibc 头文件不定义这些 gnu 添加。GNU_SOURCE您可以通过在包含适当的标头之前定义预处理器宏或通过指定-std=gnu11gcc 调用来打开它们。

于 2013-07-28T13:47:45.347 回答