【转载】uclibc和glibc的差异

转载自: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

相关文章
相关标签/搜索