GNU C函式庫
Template:NoteTA
腳本錯誤:沒有「Infobox」這個模塊。腳本錯誤:沒有「Check for unknown parameters」這個模塊。
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寬通用公共許可證下發佈。[1]
歷史[編輯]
glibc項目最初主要由Roland McGrath編寫,他在20世紀80年代為自由軟件基金會(FSF)工作。[2]
1988年,FSF稱glibc已基本實現ANSI C所規定的內容[3] ;到1992年,它已經實現了ANSI C-1989和POSIX.1-1990所規定的功能,並正在進行關於實現POSIX.2的工作。[4]
1995年9月,Ulrich Drepper為glibc項目做出了他的第一個貢獻,並在20世紀90年代逐漸成為glibc的核心貢獻者和維護者。[5] Drepper擔任維護員一職多年,直到2012年累計占項目總貢獻的63%。[6]
Linux libc[編輯]
在20世紀90年代初,Linux內核的開發團隊分叉了Glibc,名為「Linux libc」並單獨維護。
當FSF在1997年1月發佈glibc 2.0時,由於glibc 2.0更符合POSIX標準,內核開發者停止了Linux libc的開發。[7] glibc 2.0還具有更好的國際化和翻譯、IPv6功能、64位數據訪問、多線程支持、未來版本的兼容性,而且代碼更加可移植。[8]
最後版本的Linux libc使用的庫文件名是libc.so.5。因此,Linux上的glibc 2.x使用的庫文件名稱為libc.so.6。[9] (Alpha 和 IA64 平台的glibc使用libc.so.6.1代替). 這些以.so為後綴的文件通常被縮寫為libc6 (例如在Debian的軟件包名中),遵循一般庫的慣例。
根據Richard Stallman的說法,由於開發者們的身份模糊,FSF無法將Linux libc做出的改動合併到glibc中。GNU項目對版權相關的要求十分嚴格。[10]
成立委員會[編輯]
自2001年起,庫的開發由 [11]一個監管委員會負責,[12]但保留了Drepper主要貢獻者和維護者的身份。委員會的設立被Drepper公然說成是Richard Stallman的陰謀詭計,因而被公共爭議所包圍。[13][14][15]
遷移到git[編輯]
glibc以前被儲存在CVS倉庫中,2009年被遷移到Sourceware上的Git倉庫。.[16]
委員會解散[編輯]
2012年3月,委員會投票決定解散,並撤銷Drepper的職務,轉而由Ryan Arnold、Maxim Kuvyrkov、Joseph Myers、Carlos O'Donell和Alexandre Oliva負責glibc的維護工作。但是,他們對於glibc沒有額外的決策權。[17][18]
在委員會解散後,Debian和其他使用glibc替代品的項目又遷移回到了glibc。[19] 從2014年開始,EGLIBC不再開發,因為它「現在的目標是在glibc上直接解決問題」。[20]
2017年7月,在glibc創立30年時,Roland McGrath宣佈不再直接參與項目,並宣佈自己為名譽維護者。「過去這幾個月,甚至過去幾年,已經證明你們不再需要我了」。[2]
版本歷史[編輯]
對於大多數系統來說,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,[21] RHEL 8.0.0,[22] Debian 10 (Buster),[23] Fedora 29[24][25] |
| 2.29 | 2019-02 |
|
Ubuntu 19.04,[27] Fedora 30[28][29] |
| 2.30 | 2019-02 | Unicode 12.1.0, 動態連結器接受--preload參數來預載共享對象,Linux上增加了gettid函數, 支持民國曆, 新的日本年代被加入 ja_JP locale;總對象大小大於PTRDIFF_MAX時內存分配函數失效; Template:CVE 被修復[30] |
Ubuntu 19.10,[31] Fedora 31[32] |
| 2.31 | 2020-02 | 加入 C2x 標準支持 | Ubuntu 20.04,[33] Fedora 32[34] |
| 2.32 | 2020-08 | Unicode 13.0,'access' 屬性在GCC 10中提供更友好的警告,即 "幫助檢測緩衝區溢出和其他越界訪問"。[35] | 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可以運行在許多不同的內核和不同的硬件架構上。官方支持的硬件架構[36] 包括: 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的分支版本。[37] Glibc的一個修改過的版本也被用在 BeOS 和 Haiku中。[38]
在小型設備中的使用[編輯]
Glibc在過去因過於臃腫且速度比其他C庫較慢,遭到一些開發者們的批評,如Linus Torvalds[39] 和一些嵌入式開發程式設計師。 出於這個原因,人們創建了幾個用於在嵌入式平台替代Glibc的C標準庫。這些庫較Glibc更小。然而,許多嵌入式開發項目仍使用Glibc,因為它更加符合標準且兼容性更好。例如Openmoko[40] 和由iPaq使用的Familiar Linux(在使用GPE顯示軟件時)[41]。
相關條目[編輯]
腳本錯誤:沒有「Portal」這個模塊。
參考資料[編輯]
- ↑ 引用錯誤:無效的
<ref>標籤,未定義名稱為licensing的參考文獻內容文字。 - ↑ 2.0 2.1 Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ glibc changelog on GitHub.
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ rms-accused-of-attempting-glibc-hostile-takeover (頁面存檔備份,存於互聯網檔案館) on slashdot.com on August 19, 2001
- ↑ glibc repo (頁面存檔備份,存於互聯網檔案館) on Sourceware.com
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
- ↑ Template:Cite web
外部連結[編輯]
腳本錯誤:沒有「Side box」這個模塊。
腳本錯誤:沒有「Navbox」這個模塊。 Template:Linux內核 Template:CProLang