查看完整版本 : uClibc 与 Glibc 的区别


xiaoyun28
2007-06-08 14:38
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).