uClibc 与 Glibc 你所不知道的区别

        CC的标准库,就是glibc这个库,里面有GCC各种标准函数的实现,还有各种unix系的函数在里面。 
        当初创建uclinux的时候,需要一个能编译比较小体积的目标文件的便宜器,这个时候就有人写了一个uc-libc库,这个库可以说是uclinux上的一个glibc移植,但是还是有很多函数没有实现,所以人们只能勉强用它来在uclinux上写程序。
        后来,有牛人又写了uclibc,这个是真正意义上的瘦身过后的glibc,完成了很多以前uc-libc不支持的函数。
        本人觉得最有价值的就是uclibc实现了pthread系列函数,以前用uc-libc只能用fork+exec来完成的多线程功能。uclibc现在也不只是用在嵌入式系统上面,一些人也喜欢在标准平台使用它来编译一些程序。 
        下面转载一家外国网站的文章,英文不好请采用google翻译。

                uClibc and Glibc are not the same -- there are a number of differences which 
may or may not cause you problems. This document attempts to list these 
differences and, when completed, will contain a full list of all relevant 
differences. 


                1) uClibc is smaller than glibc. We attempt to maintain a glibc compatible 
interface, allowing applications that compile with glibc to easily compile with 
uClibc. However, we do not include _everything_ that glibc includes, and 
therefore some applications may not compile. If this happens to you, please 
report the failure to the uclibc mailing list, with detailed error messages. 

                2) uClibc is much more configurable then glibc. This means that a developer 
may have compiled uClibc in such a way that significant amounts of 
functionality have been omitted. 

                3) uClibc does not even attempt to ensure binary compatibility across releases. 
When a new version of uClibc is released, you may or may not need to recompile 
all your binaries. 

                4) malloc(0) in glibc returns a valid pointer to something(!?!?) while in 
uClibc calling malloc(0) returns a NULL. The behavior of malloc(0) is listed 
as implementation-defined by SuSv3, so both libraries are equally correct. 
This difference also applies to realloc(NULL, 0). I personally feel glibc's 
behavior is not particularly safe. To enable glibc behavior, one has to 
explicitly enable the MALLOC_GLIBC_COMPAT option. 

                4.1) glibc's malloc() implementation has behavior that is tunable via the 
MALLOC_CHECK_ environment variable. This is primarily used to provide extra 
malloc debugging features. These extended malloc debugging features are not 
available within uClibc. There are many good malloc debugging libraries 
available for Linux (dmalloc, electric fence, valgrind, etc) that work much 
better than the glibc extended malloc debugging. So our omitting this 
functionality from uClibc is not a great loss. 

                5) uClibc does not provide a database library (libdb). 

                6) uClibc does not support NSS (/lib/libnss_*), which allows glibc to easily 
support various methods of authentication and DNS resolution. uClibc only 
supports flat password files and shadow password files for storing 
authentication information. If you need something more complex than this, 
you can compile and install pam. 

                7) uClibc's libresolv is only a stub. Some, but not all of the functionality 
provided by glibc's libresolv is provided internal to uClibc. Other functions 
are not at all implemented. 

                8) libnsl provides support for Network Information Service (NIS) which was 
originally called "Yellow Pages" or "YP", which is an extension of RPC invented 
by Sun to share Unix password files over the network. I personally think NIS 
is an evil abomination and should not be used. These days, using ldap is much 
more effective mechanism for doing the same thing. uClibc provides a stub 
libnsl, but has no actual support for Network Information Service (NIS). 
We therefore, also do not provide any of the headers files provided by glibc 
under /usr/include/rpcsvc. 

                9) uClibc's locale support is not 100% complete yet. We are working on it. 

                10) uClibc's math library only supports long double as inlines, and even 
then the long double support is quite limited. Also, very few of the 
float math functions are implemented. Stick with double and you should 
be just fine. 

                11) uClibc's libcrypt does not support the reentrant crypt_r, setkey_r and 
encrypt_r, since these are not required by SuSv3. 

                12) uClibc directly uses kernel types to define most opaque data types. 

                13) uClibc directly uses the linux kernel's arch specific 'stuct stat'. 

                14) uClibc's librt library currently lacks all aio routines, all clock 
routines, and all shm routines (only the timer routines and the mq 
routines are implemented).
我是米洛,软件开发十年经验,交流QQ/微信573581882。文章为分享,欢迎转载。

你可能感兴趣的:(技术笔记)