我很困惑与C库

好的,这是事情。

大多数人在第一次接触C语言的时候就会同时学习C标准库,我也不例外。 但是现在我正在学习linux,所以我倾向于与C库混淆。 首先,我知道你得到一个很好的旧的C标准库,因为你在你的linux发行版上安装gcc作为一个静态库。 之后,当你连接到互联网时,你会得到一个新的稳定版本的glibc。

我开始研究glibc API,这里是我搞砸了。 glibc似乎支持基于POSIX标准C库的基于POSIX C标准库(实现标准C库(包括C99,据我所知))的大量库。

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

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

接下来的问题是我听说linux是基于C语言构build的。 这是否意味着Linux自己编译自己的gcc编译器???????

    对于第一个问题,glibc遵循关于glibc的标准C和POSIX

    GNU C库主要被设计成一个便携式和高性能的C库。 它遵循所有相关标准,包括ISO C11和POSIX.1-2008。 它也是国际化的,是已知最完整的国际化接口之一。

    对于第二个问题,是的,你可以用gcc编译Linux。 甚至gcc本身也可以使用gcc编译,这就是所谓的bootstrapping 。

    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)。 这样做的方法是通过一种称为bootstrapping的技术,在这种技术中建立一个小型编译器(通常在ASM中手动编译),并构建整个内核或整个GCC。

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

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

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

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