我对C库感到困惑

时间:2013-07-28 09:15:14

标签: c linux gnu standard-library

好的,这就是事情。

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

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

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

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

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

3 个答案:

答案 0 :(得分:4)

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

  

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

对于第二个问题,是的,您可以使用gcc编译Linux。甚至gcc本身也可以使用gcc编译,它叫做bootstrapping

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

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

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

默认情况下,glibc标头不会定义这些gnu添加项。您可以在包含相应标头之前定义预处理器宏GNU_SOURCE,或者通过为gcc调用指定-std=gnu11来启用它们。