summaryrefslogtreecommitdiffstats
path: root/docs/Glibc_vs_uClibc.html
diff options
context:
space:
mode:
Diffstat (limited to 'docs/Glibc_vs_uClibc.html')
-rw-r--r--docs/Glibc_vs_uClibc.html240
1 files changed, 240 insertions, 0 deletions
diff --git a/docs/Glibc_vs_uClibc.html b/docs/Glibc_vs_uClibc.html
new file mode 100644
index 000000000..c14eb8cf2
--- /dev/null
+++ b/docs/Glibc_vs_uClibc.html
@@ -0,0 +1,240 @@
+<!--#include file="header.html" -->
+
+<h2>uClibc vs. glibc</h2>
+
+<p>
+ 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.
+ <br><br></p>
+ <ol>
+ <li>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.
+ </li><br>
+ <li>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.
+ </li><br>
+ <li>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.
+ </li><br>
+ <li><ul><li> 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.
+ </li><br><li>
+ 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.
+ </li><br>
+ </ul></li>
+ <li>uClibc does not provide a database library (libdb).
+ </li><br>
+ <li>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.
+ </li><br>
+ <li>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.
+ </li><br>
+ <li>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.
+ </li><br>
+ <li>uClibc's locale support is not 100% complete yet. We are working on it.
+ </li><br>
+ <li>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.
+ </li><br>
+ <li>uClibc's libcrypt does not support the reentrant crypt_r, setkey_r and
+ encrypt_r, since these are not required by SuSv3.
+ </li><br>
+ <li>uClibc directly uses kernel types to define most opaque data types.
+ </li><br>
+ <li>uClibc directly uses the linux kernel's arch specific 'stuct stat'.
+ </li><br>
+ <li>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).
+ </li><br>
+</ol>
+<hr>
+<h3>Manuel's Notes</h3>
+
+ Some general comments...<br>
+ <p>
+ 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.
+ </p><br>
+Now for some details...<br><br>
+
+<u>time functions</u><br>
+<ol>
+<li>Leap seconds are not supported.</li><br>
+<li>/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
+</li><br>
+<li>Currently, locale specific eras and alternate digits are not supported.
+ They are on my TODO list.
+</li>
+</ol><br>
+<u>wide char support</u><br>
+<ol>
+<li>The only multibyte encoding currently supported is UTF-8. The various
+ ISO-8859-* encodings are (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.
+</li>
+<li>In the next iteration of locale support, I plan to add support for
+ (at least some) other multibyte encodings.
+</li>
+</ol>
+<u>locale support</u><br>
+<ol>
+<li>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.
+</li>
+<li>Currently, all SUSv3 libc locale functionality should be implemented
+ except for wcsftime and collating item support in regex.
+</li>
+</ol>
+<u>stdio</u><br>
+<ol>
+<li>Conversion of large magnitude floating-point values by printf suffers a loss
+ of precision due to the algorithm used.
+</li><br>
+<li>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. In locales other than C, the format string is checked
+ to be a valid multibyte sequence as well. Also, currently at most 10 positional
+ args are allowed (although this is configurable).
+</li><br>
+<li>BUFSIZ is configurable, but 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.
+</li><br>
+<li>uClibc allows glibc-like custom printf functions. However, while not
+ currently checked, the specifier must be <= 0x7f.
+</li><br>
+<li>uClibc allows glibc-like custom streams. However, no in-buffer seeking is
+ done.
+</li><br>
+<li>The functions fcloseall() and __fpending() can behave differently than their
+ glibc counterparts.
+</li><br>
+<li>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.
+</li><br>
+<li>Right now, %m is not handled properly by printf when the format uses positional
+ args.
+</li><br>
+<li>The FILEs created by glibc's fmemopen(), open_memstream(), and fopencookie()
+ are not capable of wide orientation. The corresponding uClibc routines do
+ not have this limitation.
+</li><br>
+<li>For scanf, the C99 standard states "The fscanf function returns the value of
+ the macro EOF if an input failure occurs before any conversion." But glibc's
+ scanf does not respect conversions for which assignment was surpressed, even
+ though the standard states that the value is converted but not stored.
+</li></ol><br>
+<hr><h3>Glibc bugs</h3><br>
+glibc bugs that Ulrich Drepper has refused to acknowledge or comment on
+ ( <a href="http://sources.redhat.com/ml/libc-alpha/2003-09/">http://sources.redhat.com/ml/libc-alpha/2003-09/</a> )
+<br>
+<ol>
+<li>The C99 standard says that for printf, a %s conversion makes no special
+ provisions for multibyte characters. SUSv3 is even more clear, stating
+ that bytes are written and a specified precision is in bytes. Yet glibc
+ treats the arg as a multibyte string when a precision is specified and
+ not otherwise.
+</li><br>
+<li>Both C99 and C89 state that the %c conversion for scanf reads the exact
+ number of bytes specified by the optional field width (or 1 if not specified).
+ uClibc complies with the standard. There is an argument that perhaps the
+ specified width should be treated as an upper bound, based on some historical
+ use. However, such behavior should be mentioned in the Conformance document.
+</li><br>
+<li>glibc's scanf is broken regarding some numeric patterns. Some invalid
+ strings are accepted as valid ("0x.p", "1e", digit grouped strings).
+ In spite of my posting examples clearly illustrating the bugs, they remain
+ unacknowledged by the glibc developers.
+</li><br>
+<li>glibc's scanf seems to require a 'p' exponent for hexadecimal float strings.
+ According to the standard, this is optional.
+</li><br>
+<li>C99 requires that once an EOF is encountered, the stream should be treated
+ as if at end-of-file even if more data becomes available. Further reading
+ can be attempted by clearing the EOF flag though, via clearerr() or a file
+ positioning function. For details concerning the original change, see
+ Defect Report #141. glibc is currently non-compliant, and the developers
+ did not comment when I asked for their official position on this issue.
+</li><br>
+<li>glibc's collation routines and/or localedef are broken regarding implicit
+ and explicit UNDEFINED rules.
+</li><br></ol>
+More to follow as I think of it...
+<br><br><hr>
+<h3>Profiling:</h3>
+<p>
+uClibc no longer supports 'gcc -fprofile-arcs -pg' style profiling, which
+causes your application to generate a 'gmon.out' file that can then be analyzed
+by 'gprof'. Not only does this require explicit extra support in uClibc, it
+requires that you rebuild everything with profiling support. There is both a
+size and performance penalty to profiling your applications this way, as well
+as Heisenberg effects, where the act of measuring changes what is measured.
+</p>
+<p>
+There exist a number of less invasive alternatives that do not require you to
+specially instrument your application, and recompile and relink everything.
+</p><p>
+The OProfile system-wide profiler is an excellent alternative:
+ <a href="http://oprofile.sourceforge.net/">http://oprofile.sourceforge.net/</a>
+</p><p>
+Many people have had good results using the combination of Valgrind
+to generate profiling information and KCachegrind for analysis:
+ <a href="http://developer.kde.org/~sewardj/">http://developer.kde.org/~sewardj/</a>
+ <a href="http://kcachegrind.sourceforge.net/">http://kcachegrind.sourceforge.net/</a>
+</p><p>
+Prospect is another alternative based on OProfile:
+ <a href="http://prospect.sourceforge.net/">http://prospect.sourceforge.net/</a>
+</p><p>
+And the Linux Trace Toolkit (LTT) is also a fine tool:
+ <a href="http://www.opersys.com/LTT/">http://www.opersys.com/LTT/</a>
+</p><p>
+FunctionCheck:
+ <a href="http://www710.univ-lyon1.fr/~yperret/fnccheck/">http://www710.univ-lyon1.fr/~yperret/fnccheck/</a>
+</p>
+
+<!--#include file="footer.html" -->