123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- 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...
|