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寬通用公共許可證下發布。

## 歷史

glibc項目最初主要由Roland McGrath編寫，他在20世紀80年代為自由軟體基金會（FSF）工作。

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宣布不再直接參與項目，並宣布自己為名譽維護者。「過去這幾個月，甚至過去幾年，已經證明你們不再需要我了」。

### 版本歷史

對於大多數系統來說，glibc的版本可以通過解析lib文件（例如，/lib/libc.so.6）獲得。

版本｜日期｜注釋｜使用該版本的作業系統

0.1 – 0.6｜1991-10 – 1992-02

1.0｜1992-02

1.01 – 1.09.3｜1992-03– 1994-12

1.90 – 1.102｜1996-05– 1997-01

2.0｜1997-01

2.0.1｜1997-01

2.0.2｜1997-02

2.0.91｜1997-12

2.0.95｜1998-07

2.1｜1999-02

2.1.1｜1999-03

2.2｜2000-11

2.2.1｜2001-01

2.2.2｜2001-02

2.2.3｜2001-03

2.2.4｜2001-07

2.3｜2002-10

2.3.1｜2002-10

2.3.2｜2003-02｜Debian 3.1 （Sarge）

2.3.3｜2003-12

2.3.4｜2004-12｜支持LSB3.0｜RHEL 4 （Update 5）

2.3.5｜2005-04｜SLES 9

2.3.6｜2005-11｜Debian 4.0 （Etch）

2.4｜2006-03｜支持LSB4.0，基本的 inotify 支持｜SLES 10

2.5｜2006-09｜完整的inotify支持｜RHEL 5

2.6｜2007-05

2.7｜2007-10｜Debian 5 （Lenny）， Ubuntu 8.04

2.8｜2008-04

2.9｜2008-12

2.10｜2009-05

2.11｜2009-10｜SLES 11， Ubuntu 10.04， eglibc used in Debian 6 （Squeeze）

2.12｜2010-05｜RHEL 6

2.13｜2011-01｜eglibc 2.13 used in Debian 7 （Wheezy）

2.14｜2011-06

2.15｜2012-03｜Ubuntu 12.04 and 12.10

2.16｜2012-06｜x32 ABI支持，遵守 C11， SystemTap

2.17｜2012-12｜64位ARM 支持｜Ubuntu 13.04， RHEL 7

2.18｜2013-08｜加入 C++11支持。支持英特爾TSX鎖精確定位。支持Xilinx MicroBlaze和IBM POWER8微架構。｜Fedora 20

2.19｜2014-02｜GNU 間接函數 （IFUNC）支持 ppc32 和 ppc64。新增功能測試宏 _DEFAULT_SOURCE，以取代 _SVID_SOURCE 和 _BSD_SOURCE。在手冊中對所有功能進行了初步的安全記錄。對 s390/s390x 的 ucontext 和 jmp_buf 進行了 ABI 更改。｜Ubuntu 14.04， Debian 8 （Jessie）所使用的eglibc 2.19， openSUSE 13， SLES 12

2.20｜2014-09｜支持文件描述鎖｜Fedora 21

2.21｜2015-02｜新的旗語實現｜Ubuntu 15.04， Fedora 22

2.22｜2015-08｜支持啟用 Google Native Client （NaCl）｜Fedora 23

2.23｜2016-02｜Unicode 8.0｜Fedora 24， Ubuntu 16.04

2.24｜2016-08｜刪除了一些過時的功能｜Fedora 25， Ubuntu 16.10 and 17.04， Debian 9 （Stretch）

2.25｜2017-02｜`getentropy` 和 `getrandom`函數，以及 `<sys/random.h>` 頭文件 被加入｜Fedora 26

2.26｜2017-08｜提高性能（malloc的線程緩存），支持Unicode 10。｜Fedora 27， Ubuntu 17.10

2.27｜2018-02｜性能提升. RISC-V 支持｜Fedora 28， Ubuntu 18.04

2.28｜2018-08｜`statx`， `renameat2`， Unicode 11.0.0｜Ubuntu 18.10， 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顯示軟體時）。

## 基本資料

- 日語原文：GNU C庫
- 作者：Roland McGrath
- 開發者：GNU計劃
- 發行日期：1987年
- 程式語言：C語言
- 作業系統：類UNIX系統
- 類型：庫
- 許可協議：LGPLv2.1