轉載自:http://blog.163.com/huangnan0727@126/blog/static/30626184201042022011225/linux
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接口、所有的時鐘接口和共享內存接口(僅僅實現定時器接口和消息隊列接口)unix