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. 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. 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 be avoided. These days, using ldap is much more effective mechanism for doing the same thing. uClibc provides a stub libnsl, but and has no actuall support for Network Information Service (NIS). We therefore, also do not provide any of the headers files provided by glibc under /usr/include/rpcsvc. I am open to implementing ldap based password authentication, but I do not personally intend to implement it (since I have no use for it). 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. 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 does not implement wordexp() 13) uClibc directly uses the kernel types to define most opaque data types. 14) uClibc directly uses the linux kernel's arch specific 'stuct stat'. 15) Add other things here as they come up...... ****************************** Manuel's Notes ****************************** Some general comments... The intended target for all my uClibc code is ANSI/ISO C99 and SUSv3 compliance. While some glibc extensions are present, many will eventually be configurable. Also, even when present, the glibc-like extensions may differ slightly or be more restrictive than the native glibc counterparts. They are primarily meant to be porting _aides_ and not necessarily drop-in replacements. Now for some details... time functions -------------- 1) Leap seconds are not supported. 2) /etc/timezone and the whole zoneinfo directory tree are not supported. To set the timezone, set the TZ environment variable as specified in http://www.opengroup.org/onlinepubs/007904975/basedefs/xbd_chap08.html or you may also create an /etc/TZ file of a single line, ending with a newline, containing the TZ setting. For example echo CST6CDT > /etc/TZ 3) Currently, locale specific eras and alternate digits are not supported. They are on my TODO list. 4) The extension fields tm_gmtoff and tm_zone, even prefixed with "__", are not currently supported as they aren't required by SUSv3 and I didn't need them when I wrote the time code. wide char support ----------------- 1) The only multibyte encoding to be supported will be UTF-8. The various ISO-8859-* encodings will be (optionally) supported. The internal representation of wchar's is assumed to be 31 bit unicode values in native endian representation. Also, the underlying char encoding is assumed to match ASCII in the range 0-0x7f. locale support -------------- 1) The target for support is SUSv3 locale functionality. While nl_langinfo has been extended, similar to glibc, it only returns values for related locale entries. 2) Currently, collation support is being implemented. stdio ----- 1) For printf, %a, %A, and floating point locale-specific grouping are not yet implemented. Also, conversion of large magnitude floating-point values suffers a loss of precision due to the algorithm used. The conversion function was written before uClibc had proper semi-numerical macros/functions. This code is slated to be rewritten after the i10n/i18n work is completed. 2) uClibc's printf is much stricter than glibcs, especially regarding positional args. The entire format string is parsed first and an error is returned if a problem is detected. Also, currently at most 10 positional args are allowed although this is configurable. 3) BUFSIZ is currently 256. No attempt is made at automatic tuning of internal buffer sizes for stdio streams. In fact, the stdio code in general sacrifices sophistication/performace for minimal size. 4) uClibc allows glibc-like custom printf functions. However, while not currently checked, the specifier must be <= 0x7f. 5) uClibc allows glibc-like custom streams. However, no in-buffer seeking is done. 6) uClibc's scanf still needs work. 7) The functions fcloseall() and __fpending() can behave differently than their glibc counterparts. 8) uClibc's setvbuf is more restrictive about when it can be called than glibc's is. The standards specify that setvbuf must occur before any other operations take place on the stream. 9) Right now, %m is not handled properly by printf when the format uses positional args. More to follow as I think of it...