GNU C函式庫

GNU C库,又名glibc,是GNU计划所实现的C标准库。尽管其名字中带有“C库”,但它现在也直接支持C++(以及间接支持其他编程语言)。它是自由软件基金会(FSF)在20世纪90年代初为他们的GNU操作系统设计的。它为GNU系统,GNU/Linux系统和一些其他的类Unix系统提供了系统核心库。这些库提供了关键的API,包括ISO C11、POSIX.1-2008和BSD所规定的API和一些底层API,包括open、read、write、malloc、printf、getaddrinfo、dlopen、pthread_create、crypt、login、exit等。

glibc在GNU宽通用公共许可证下发布。

1988年,FSF称glibc已基本实现ANSI C所规定的内容 ;到1992年,它已经实现了ANSI C-1989和POSIX.1-1990所规定的功能,并正在进行关于实现POSIX.2的工作。

1995年9月,Ulrich Drepper为glibc项目做出了他的第一个贡献,并在20世纪90年代逐渐成为glibc的核心贡献者和维护者。 Drepper担任维护员一职多年,直到2012年累计占项目总贡献的63%。

Linux libc
在20世纪90年代初,Linux内核的开发團隊分叉了Glibc,名为“Linux libc”并单独维护。

当FSF在1997年1月发布glibc 2.0时,由于glibc 2.0更符合POSIX标准,内核开发者停止了Linux libc的开发。 glibc 2.0还具有更好的国际化和翻译、IPv6功能、64位数据访问、多线程支持、未来版本的兼容性,而且代码更加可移植。

最后版本的Linux libc使用的库文件名是libc.so.5。因此,Linux上的glibc 2.x使用的库文件名称为libc.so.6。 (Alpha 和 IA64 平台的glibc使用libc.so.6.1代替). 这些以.so为后缀的文件通常被缩写为libc6 (例如在Debian的软件包名中),遵循一般库的惯例。

根据Richard Stallman的说法,由于开发者们的身份模糊,FSF无法将Linux libc做出的改动合并到glibc中。GNU项目对版权相关的要求十分严格。

成立委员会
自2001年起,库的开发由 一个监管委员会负责,但保留了Drepper主要贡献者和维护者的身份。委员会的设立被Drepper公然说成是Richard Stallman的阴谋诡计,因而被公共争议所包围。

迁移到git
glibc以前被储存在CVS仓库中,2009年被迁移到Sourceware上的Git仓库。.

委员会解散
2012年3月,委员会投票决定解散,并撤-{}-销Drepper的职务,转而由Ryan Arnold、Maxim Kuvyrkov、Joseph Myers、Carlos O'Donell和Alexandre Oliva负责glibc的维护工作。但是,他们对于glibc没有额外的决策权。

在委员会解散后,Debian和其他使用glibc替代品的项目又迁移回到了glibc。 从2014年开始,EGLIBC不再开发,因为它“现在的目标是在glibc上直接解决问题”。

2017年7月,在glibc创立30年时,Roland McGrath宣布不再直接参与项目,并宣布自己为名誉维护者。“过去这几个月,甚至过去几年,已经证明你们不再需要我了”。 RHEL 8.0.0, Debian 10 (Buster), Fedora 29
|-
| 2.29 || 2019-02 ||

  • 通过将所有locale通过一个包含文件的目录的方式构建和安装
  • 优化三角函数
  • posix_spawn_file_actions_addchdir_np 和 posix_spawn_file_actions_addfchdir_np
  • popen()和system()不再运行atfork处理程序
  • 支持在C-SKY ABIV2上的Linux中运行
  • strftime的语言环境替代了年份的默认格式; 现在可以将“_”和“-”符号用于其“%EY”

| Ubuntu 19.04, Fedora 30
|-
| 2.30 || 2019-02 || Unicode 12.1.0, 动态链接器接受--preload参数来预载共享对象,Linux上增加了gettid函数, 支持民国历, 新的日本年代被加入 ja_JP locale;总对象大小大于PTRDIFF_MAX时内存分配函数失效; 被修复 || Ubuntu 19.10, Fedora 31
|-
| 2.31 || 2020-02 || 加入 C2x 标准支持 || Ubuntu 20.04, Fedora 32
|-
| 2.32 || 2020-08 || Unicode 13.0,'access' 属性在GCC 10中提供更友好的警告,即 "帮助检测缓冲区溢出和其他越界访问"。
|Ubuntu 20.10, Fedora 33
|-
|2.33
|2021-02
|加入HWCAPS标志
|Ubuntu 21.04, Fedora 34
|-
|2.34
|2021-08
|libpthread, libdl, libutil, libanl 被集成进libc中
|Ubuntu 21.10, RHEL 9.0.0, Fedora 35
|-
|2.35
|2022-02
|Unicode 14.0, C.UTF-8 locale, restartable sequences.
移除 Intel MPX 支持
|Ubuntu 22.04, Fedora 36
|-
|2.36
|2022-08
|
|Ubuntu 22.10
|-
|2.37
|2023-02
|
|
|}

功能
glibc实现了单一UNIX规范、POSIX(1c、1d和1j)所要求的功能,并实现了ISO C11、ISO C99、Berkeley Unix(BSD)接口、System V接口定义(SVID)和X/Open Portability Guide(XPG)4.2所要求的部分功能,并提供了所有符合XSI(X/Open System Interface)的系统所共有的扩展以及所有X/Open UNIX扩展。

此外,glibc还提供了在开发GNU时被认为有用或必要的扩展。

受支持的硬件和内核
glibc可以运行在许多不同的内核和不同的硬件架构上。官方支持的硬件架构 包括: 32位ARM,AArch64, C-SKY, DEC Alpha, IA-64, Motorola m68k, MicroBlaze, MIPS, Nios II, PA-RISC, PowerPC, RISC-V, s390, SPARC, 和 x86 (旧版本支持 TILE)。Glibc官方支持Hurd和Linux内核。此外,还有大量打过补丁的版本可以运行在FreeBSD和NetBSD上(因此glibc也相应地支持Debian GNU/kFreeBSD和Debian GNU/NetBSD,因为这些内核与FreeBSD和NetBSD的关联很大),以及OpenSolaris的分支版本。 Glibc的一个修改过的版本也被用在 BeOS 和 Haiku中。

在小型设备中的使用
Glibc在过去因过于臃肿且速度比其他C库较慢,遭到一些开发者们的批评,如Linus Torvalds 和一些嵌入式开发程序员。 出于这个原因,人们创建了几个用于在嵌入式平台替代Glibc的C标准库。这些库较Glibc更小。然而,许多嵌入式开发项目仍使用Glibc,因为它更加符合标准且兼容性更好。例如Openmoko 和由iPaq使用的Familiar Linux(在使用GPE显示软件时)。

相關條目
*
*

参考资料
外部链接
*

评论 (0)

  • 还没有评论,来抢沙发吧。