1. 程式人生 > >【轉載】uclibc和glibc的差別

【轉載】uclibc和glibc的差別

開發十年,就只剩下這套架構體系了! >>>   

轉載自:http://blog.163.com/huangnan0727@126/blog/static/30626184201042022011225/

CC的標準庫,就是glibc這個庫,裡面有GCC各種標準函式的實現,還有各種unix系的函式在裡面。 當初建立uclinux的時候,需要一個能編譯比較小體積的目標檔案的便宜器,這個時候就有人寫了一個 uc-libc庫,這個庫可以說是uclinux上的一個glibc移植,但是還是有很多函式沒有實現,所以人們只能 勉強用它來在uclinux上寫程式。後來,有牛人又寫了uclibc,這個是真正意義上的瘦身過後的glibc,完成 了很多以前uc-libc不支援的函式。本人覺得最有價值的就是uclibc實現了pthread系列函式,以前用 uc-libc只能用fork+exec來完成的多執行緒功能。uclibc現在也不只是用在嵌入式系統上面,一些人 也喜歡在標準平臺使用它來編譯一些程式。

uClibc和Glibc並不相同,兩者有許多不同之處,而且以下不同有可能給你帶來一些問題。

1. uClibc比Glibc小,雖然uClibc和Glibc在已有的介面上是相容的,而且採用uClibc編譯應用程式比採用Glibc編譯應用程式要更方便,但是uClibc並沒有包括Glibc中的所有介面實現,因此有些應用可能在uClibc中不能編譯。

2. uClibc在可配置性上比glibc要好。

3. uClibc並不能保證釋出的庫二進位制相容舊版本uClibc庫。當一個新的版本uClibc庫被髮布,則可能需要也可能不需要重新編譯應用程式。

4. 在 Glibc中呼叫malloc(0),將返回一個有效的指標,然而在uClibc中呼叫malloc(0),則返回NULL指標。根據在SuSv3中關於 malloc(0)的行為的定義,兩個庫的實現都是正確的。對於呼叫relloc(NULL,0),兩個庫的實現也不同。個人感覺Glibc的如此實現不 是特別安全。Glibc中malloc的實現可以通過MALLOC_CHECK_ 環境變數調節。這個方法主要用於malloc除錯。這些擴充套件的 malloc除錯特性在uClibc中是不可用的。在Linux上有許多有些的malloc 除錯功能的庫 (如:dmalloc,electric fence,valgrind等)比Glibc中的擴充套件的malloc除錯功能更好用。因此uClibc中去掉 這些功能特性並不會有多大損失。

5. uClibc沒有提供用於資料介面的庫(libdb)。

6. uClibc不支援NSS(/lib/libnss_*),在這方面Glibc更容易支援不同方式的認證和DNS解析。uClibc僅僅支援採用flat口令檔案或者shadow口令檔案儲存授權資訊。如果需要比這些更復雜的的授權,可以編譯安裝pam。

7. uClibc中的libresolv庫僅僅是一個樁。Glibc的libresolv庫中的部分並不是全部的功能uClibc都提供,許多函式都沒有實現。


8. 提供網路資訊服務支援(NIS)libnsl庫(最初被稱為黃頁YP),被SUN擴充套件為發明為RPC並用於網路共享Unix口令檔案。個人認為NIS是一 個令人厭惡的東西並應該使用。因此,在實現相同的功能情況下采用ldap比NIS更有效。uClibc雖然提供一個樁libnsl,但並不支援NIS。我 們因此也不提供在Glibc下提供的位於/usr/include/rpcsvc裡的標頭檔案。

9. uClibc的區域支援並不是100%的完全。正在這方面努力 

10. uClibc的資料功能函式庫內部僅僅支援long double,設定對於long double的支援也是非常有限。與此對應的只實現了較少的數學函式。如果應用程式採用double型別,則會程式會執行得較好。

11. uClibc的libcrpt庫不支援可重入crypt_r,setkey_r和encrypt_r,因為這些也不是SuSv3所規定的。

12. uClibc直接採用核心的資料型別去定義大多數透明的資料型別。

13. uClibc支援採用linux核心結構特有的結構體"struct stat"。

14. uClibc的執行時庫librt當前缺少aio介面、全部的時鐘介面和共享記憶體介面(僅僅實現定時器介面和訊息佇列介面)