glibc是GNU發布的libc庫,即c運行庫。glibc是linux系統中最底層的api,幾乎其它任何運行庫都會依賴於glibc。glibc除了封裝linux操作系統所提供的系統服務外,它本身也提供了許多其它一些必要功能服務的實現。由於 glibc 囊括了幾乎所有的 UNIX 通行的標準,可以想見其內容包羅萬象。而就像其他的 UNIX 系統一樣,其內含的檔案群分散於系統的樹狀目錄結構中,像一個支架一般撐起整個操作系統。在 GNU/Linux 系統中,其C函式庫發展史點出了GNU/Linux 演進的幾個重要里程碑,用 glibc 作為系統的C函式庫,是GNU/Linux演進的一個重要里程碑。
newlib c庫是一個開源的c函數庫,包括libc和libm兩部分。它支持ANSI C庫標準,針對不同處理器架構進行優化,輕量級,適用於嵌入式系統。
一. GLIBC
glibc是一種按照LGPL許可協議發布的C函數庫,是程序運行時使用到的一些API集合,它們一般是已預先編譯好,以二進位代碼形式存在於Linux類系統中,glibc通常作為GNU C編譯程序的一個部分發布。 它最初是自由軟體基金會為其GNU操作系統所寫,但目前最主要的應用是配合Linux內核,成為GNU/Linux操作系統一個重要的組成部分。
在通用的PC和Server中,Linux(ubuntu, Redhat, CentOS etc.)默認提供對glibc的支持;但是在嵌入式應用中,考慮到系統對os大小的要求和簡化系統的複雜度等因素,並不一定支持glibc,而是支持uClibc、newLib等針對嵌入式應用的C函數庫。這就要求在嵌入式系統開發的過程中,需要評估應用對glibc的依賴程度,評估程序開發或移植的工作量和複雜度。
glibc是linux系統中最底層的api(應用程序開發介面),幾乎其它任何的運行庫都會依賴於glibc。glibc除了封裝linux操作系統所提供的系統服務外,它本身也提供了許多其它一些必要功能服務的實現,關於glibc功能的介紹可以在其官方網站上獲取到詳細的手冊資料(
http://www.gnu.org/software/libc/manual/)。
主要的功能如下(摘自glibc手冊):
(1)Error Reporting,進行錯誤類型的檢測和報告(how errors detected by the library are reported)
(2)Language Features, support for standard parts of the C language, including things like the sizeof operator and the symbolic constant NULL, how to write functions accepting variable numbers of arguments, and constants describing the ranges and other properties of the numerical types. There is also a simple debugging mechanism which allows you to put assertions in your code, and have diagnostic messages printed if the tests fail.
(3)Memory, 動態內存的分配和管理 (describes the GNU library’s facilities for managing and using virtual and real memory, including dynamic allocation of virtual memory. If you do not know in advance how much memory your program needs, you can allocate it dynamically instead, and manipulate it via pointers.)
(4) 字元、字元串及數組的處理 Character Handling is about character classification functions (such as isspace) and functions for performing case conversion. String and Array Utilities, include functions for manipulating strings (null-terminated character arrays) and general byte arrays, including operations such as copying and comparison.
(5)標準IO的支持
(6)文件操作的支持(File System Interface, such as functions for deleting and renaming them and for creating new directories. also contains information about how you can access the attributes of a file, such as its owner and file protection modes. )
(7)進程間通訊的支持(Pipes and FIFOs, Pipes allow communication between two related processes (such as between a parent and child), while FIFOs allow communication between processes sharing a common file system on the same machine. )
(8)網路的支持(socket)
(9) 虛擬終端設備的管理,及系統的安全訪問(Low-Level Terminal Interface, change the attributes of a terminal device. disable echo of characters typed by the user, for example, read this chapter. )
(10)數學及運算庫的支持(定點運算和浮點庫)
(11)查找和分類的支持(Searching and Sorting)
(12)模式匹配的支持(Pattern Matching)
(13)時間及定時器的管理
(14)不同字符集的編碼轉換
(15)國際化的支持,選擇不同的語言種類和國家
(16)Non-Local Exits (provide a facility for goto-like jumps which can jump from one function to another.)
(17)信號量的支持(Signal Handling, establish a handler that is called when a particular kind of signal is delivered, and how to prevent signals from arriving during critical sections of your program.)
(18)進程編程和進程式控制制(process and Job control)
(19)用戶管理和系統管理(User Database and System Management) 等
二. uClibc
uClibc 是一個面向嵌入式Linux系統的小型的C標準庫。最初uClibc是為了支持uClinux而開發,這是一個不需要內存管理單元的Linux版本,因此適合於微控制器系統(uCs;此處”u”是代表”micro”的μ的羅馬化).[2]
uClibc比一般用於Linux發行版的C庫GNU C Library (glibc)要小得多,glibc目標是要支持最大範圍的硬體和內核平台的所有C標準,而uClibc專註於嵌入式Linux.很多功能可以根據空間需求進行取捨。
uClibc運行於標準的以及無MMU的Linux系統上,支持tile, i386,x86 64,ARM (big/little endian), AVR32,Blackfin,h8300,m68k,MIPS (big/little endian), PowerPC,SuperH (big/little endian), SPARC,和v850等處理器。
uClibc和Glibc並不相同,兩者有許多不同之處,而且以下不同有可能給你帶來一些問題.
1.uClibc比Glibc小,雖然uClibc和Glibc在已有的介面上是兼容的,而且採用uClibc編譯應用程序比採用Glibc編譯應用程序要更方便,但是uClibc並沒有包括Glibc中的所有介面實現,因此有些應用可能在uClibc中不能編譯。
2.uClibc在可配置性上比Glibc要好。
3.uClibc並不能保證發布的庫二進位兼容舊版本uClibc庫。當一個新的版本uClibc庫被發布,則可能需要也可能不需要重新編譯應用程序。
4.uClibc沒有提供用於數據介面的庫(libdb)。
5.uClibc不支持NSS(/lib/libnss_*),在這方面Glibc更容易支持不同方式的認證和DNS解析。uClibc僅僅支持採用flat口令文件或者shadow口令文件存儲授權信息。如果需要比這些更複雜的的授權,可以編譯安裝pam。
6.uClibc中的libresolv庫僅僅是一個樁。Glibc的libresolv庫中的部分並不是全部的功能uClibc都提供,許多函數都沒有實現。
7.提供網路信息服務支持(NIS)libnsl庫(最初被稱為黃頁YP),被SUN擴展為發明為RPC並用於網路共享Unix口令文件
。個人認為NIS是一個令人厭惡的東西並應該使用。因此,在實現相同的功能情況下採用ldap比NIS更有效。uClibc雖然提供一個樁libnsl,但並不支持NIS。我們因此也不提供在Glibc下提供的位於/usr/include/rpcsvc里的頭文件。
8.uClibc的區域支持並不是100%的完全。正在這方面努力
9.uClibc的數據功能函數庫內部僅僅支持long double,設置對於long double的支持也是非常有限。與此對應的只實現了較少的數學函數。如果應用程序採用double類型,則會程序會運行得較好。
10.uClibc的libcrpt庫不支持可重入crypt_r,setkey_r和encrypt_r,因為這些也不是SuSv3所規定的。
11.uClibc直接採用內核的數據類型去定義大多數透明的數據類型。
12.uClibc支持採用linux內核結構特有的結構體”struct stat”。
13.uClibc的運行時庫librt當前缺少aio介面、全部的時鐘介面和共享內存介面(僅僅實現定時器介面和消息隊列介面)
三. newlib
Newlib是一個面向嵌入式系統的C運行庫。最初是由Cygnus Solutions收集組裝的一個源代碼集合,取名為newlib,現在由Red Hat維護。
對於與GNU兼容的嵌入式C運行庫,Newlib並不是唯一的選擇,但是newlib是比較優秀和成熟度比較高的一個。newlib具有獨特的體系結構,使得它能夠非常好地滿足深度嵌入式系統的要求。newlib可移植性強,具有可重入特性、功能完備等特點,已廣泛應用於各種嵌入式系統中。
newlib 是一個用於嵌入式系統的開放源代碼的C語言程序庫,由libc和libm兩個庫組成,特點是輕量級,速度快,可移植到很多CPU結構上。newlib實現了許多複雜的功能,包括字元串支持,浮點運算,內存分配(如malloc)和I/O流函數(printf,fprinf()等)。其中libc提供了c 語言庫的實現,而libm提供了浮點運算支持。
在使用gcc編譯器時,對gcc指定不同的配置選項時,使用的C語言庫就不同,默認情況是下使用glibc,可以通過–with-newlib選擇使用newlib.
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/223344.html