GNU C Library NEWS -- history of user-visible changes.  2008-10-31
Copyright (C) 1992-2007, 2008 Free Software Foundation, Inc.
See the end for copying conditions.

Please send GNU C library bug reports via <http://sources.redhat.com/bugzilla/>
using `glibc' in the "product" field.

Version 2.9

* Unified lookup for getaddrinfo: IPv4 and IPv6 addresses are now looked
  up at the same time.  Implemented by Ulrich Drepper.

* TLS descriptors for LD and GD on x86 and x86-64.
  Implemented by Alexandre Oliva.

* getaddrinfo now handles DCCP and UDPlite.
  Implemented by Ulrich Drepper.

* New fixed-size conversion macros: htobe16, htole16, be16toh, le16toh,
  htobe32, htole32, be32toh, le32toh, htobe64, htole64, be64toh, le64toh.
  Implemented by Ulrich Drepper.

* New implementation of memmem, strstr, and strcasestr which is O(n).
  Implemented by Eric Blake.

* New Linux interfaces: inotify_init1, dup3, epoll_create1, pipe2

* Implement "e" option for popen to open file descriptor with the
  close-on-exec flag set.  Implemented by Ulrich Drepper.

* Implement "b" mode for fmemopen.  In this mode writes writes don't
  implicitly add a NUL byte and seeks from the end of the buffer really
  use the buffer end, not the string length as the basis.
  Implemented by Ulrich Drepper.

* Many functions, exported and internal, now atomically set the close-on-exec
  flag when run on a sufficiently new kernel.  Implemented by Ulrich Drepper.

* Sorting rules for some Indian languages (Kannada, Gurumukhi, Telugu,
  Sinhala)
  Implemented by Pravin Satpute.

* New locales: sd_IN, sd_IN@devanagari, ks_IN@devanagari, ht_HT, en_AG, nl_AW.

Version 2.8

* New locales: bo_CN, bo_IN, shs_CA.

* New encoding: HP-ROMAN9, HP-GREEK8, HP-THAI8, HP-TURKISH8.

* Sorting rules for some Indian languages (Devanagari and Gujarati).
  Implemented by Pravin Satpute.

* IPV6 addresses in /etc/resolv.conf can now have a scope ID

* nscd caches now all timeouts for DNS entries
  Implemented by Ulrich Drepper.

* nscd is more efficient and wakes up less often.
  Implemented by Ulrich Drepper.

* More checking functions: asprintf, dprintf, obstack_printf, vasprintf,
  vdprintf, and obstack_vprintf.
  Implemented by Jakub Jelinek.

* Faster memset for x86-64.
  Implemented by Harsha Jagasia and H.J. Lu.

* Faster memcpy on x86.
  Implemented by Ulrich Drepper.

* ARG_MAX is not anymore constant on Linux.  Use sysconf(_SC_ARG_MAX).
  Implemented by Ulrich Drepper.

* Faster sqrt and sqrtf implemention for some PPC variants.
  Implemented by Stephen Munroe.

Version 2.7

* More checking functions: fread, fread_unlocked, open*, mq_open.
  Implemented by Jakub Jelinek and Ulrich Drepper.

* Extend fortification to C++.  Implemented by Jakub Jelinek.

* Implement 'm' modifier for scanf.  Add stricter C99/SUS compliance
  by not recognizing 'a' as a modifier when those specs are requested.
  Implemented by Jakub Jelinek.

* PPC optimizations to math and string functions.
  Implemented by Steven Munroe.

* New interfaces: mkostemp, mkostemp64.  Like mkstemp* but allow additional
  options to be passed.  Implemented by Ulrich Drepper.

* More CPU set manipulation functions.  Implemented by Ulrich Drepper.

* New Linux interfaces: signalfd, eventfd, eventfd_read, and eventfd_write.
  Implemented by Ulrich Drepper.

* Handle private futexes in the NPTL implementation.
  Implemented by Jakub Jelinek and Ulrich Drepper.

* Add support for O_CLOEXEC.  Implement in Hurd.  Use throughout libc.
  Implemented by Roland McGrath and Ulrich Drepper.

* Linux/x86-64 vDSO support.  Implemented by Ulrich Drepper.

* SHA-256 and SHA-512 based password encryption.
  Implemented by Ulrich Drepper.

* New locales: ber_DZ, ber_MA, en_NG, fil_PH, fur_IT, fy_DE, ha_NG, ig_NG,
  ik_CA, iu_CA, li_BE, li_NL, nds_DE, nds_NL, pap_AN, sc_IT, tk_TM, ug_CN,
  yo_NG.

+ New iconv modules: MAC-CENTRALEUROPE, ISO-8859-9E, KOI8-RU.
  Implemented by Ulrich Drepper.

Version 2.6

* New Linux interfaces: epoll_pwait, sched_getcpu.

* New generic interfaces: strerror_l.

* nscd can now cache the services database.   Implemented by Ulrich Drepper.


Version 2.5

* For Linux, the sorting of addresses returned by getaddrinfo now also
  handles rules 3, 4, and 7 from RFC 3484.  I.e., all rules are handled.
  Implemented by Ulrich Drepper.

* Allow system admin to configure getaddrinfo with the /etc/gai.conf file.
  Implemented by Ulrich Drepper.

* New Linux interfaces: splice, tee, sync_file_range, vmsplice.

* New iconv module for MIK.  Contributed by Alexander Shopov.

* For sites with broken group and/or passwd database, the auto-propagate
  option of nscd can prevent creating ID lookup entries from the results
  of a name lookup and vice versa.   This usually is no problem but some
  site might have problems with the default behavior.
  Implemented by Ulrich Drepper.

* Iterating over entire database in NIS can be slow.  With the
  SETENT_BATCH_READ option in /etc/default/nss a system admin can decide
  to trade time for memory.  The entire database will be read at once.
  Implemented by Ulrich Drepper.

* The interfaces introduced in RFC 3542 have been implemented by
  Ulrich Drepper.

* Support for the new ELF hash table format was added by Ulrich Drepper.

* Support for priority inheritance mutexes added by Jakub Jelinek and
  Ulrich Drepper.

* Support for priority protected mutexes added by Jakub Jelinek.

* New locales: nr_ZA, pa_PK, ca_AD, ca_FR, ca_IT, el_CY, tr_CY, as_IN,
  or_IN, csb_PL, fy_NL, sr_ME.

Version 2.4

* More overflow detection functions.

* New iconv converters for IBM1025, IBM1122, IBM1137, IBM1153,
  IBM1154, IBM1155, IBM1156, IBM1157, and IBM1158 contributed by Jiro Sekiba.

  More converters for IBM803, IBM901, IBM902, IBM921, IBM1008, IBM1097,
  IBM1112, IBM1123, IBM1130, IBM1140, IBM1141, IBM1142, IBM1143, IBM1144,
  IBM1145, IBM1146, IBM1147, IBM1148, IBM1149, IBM1166, IBM1167, IBM4517,
  IBM4899, IBM4909, IBM4971, IBM5347, IBM9030, IBM9066, IBM9448, IBM12712,
  IBM16804, IBM1364, IBM1371, IBM1388, IBM1390, and IBM1399 contributed
  by Masahide Washizawa.

* It is now possible to install audit libraries for the dynamic linker using
  LD_AUDIT.  Implemented by Ulrich Drepper.

* The LinuxThreads add-on, providing pthreads on Linux 2.4 kernels, is no
  longer supported.  The new NPTL implementation requires Linux 2.6 kernels.
  For a libc and libpthread that works well on Linux 2.4 kernels, we
  recommend using the stable 2.3 branch.

* The new function open_wmemstream acts like open_memstream,
  but uses a wchar_t wide character buffer.

* The new function ppoll is an improved version of poll, similar to pselect.

* New interfaces: fdopendir, openat, fstatat, fchmodat, fchownat,
  futimesat, faccessat, mkdirat, mkfifoat, mknodat,
  renameat, unlinkat, linkat, symlinkat, readlinkat.

* New Linux kernel system calls: unshare,
  inotify_init, inotify_add_watch, inotify_rm_watch.

* The euidaccess function is now also known by the alias eaccess,
  for compatibility with some other systems.

* Timezone data updated to 2006b version.

Version 2.3.6

* The following bugs are resolved with this release:

  38, 253, 549, 622, 653, 721, 758, 851, 877, 915, 934, 955, 961,
  1016, 1037, 1076, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086,
  1087, 1088, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098,
  1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109,
  1110, 1111, 1112, 1113, 1125, 1137, 1138, 1249, 1250, 1251, 1252,
  1253, 1254, 1350, 1358, 1394, 1438, 1498, 1534

  Visit <http://sources.redhat.com/bugzilla/> for the details of each bug.

* As of this release, GCC 4 can be used to compile the C Library.

* Timezone data updated to 2005m version.

Version 2.3.5

* The following bugs are resolved with this release:

  284, 592, 602, 626, 633, 640, 650, 661, 671, 681, 693, 700, 710, 719,
  722, 723, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736,
  737, 738, 739, 740, 741, 742, 743, 744, 745, 765, 767, 768, 769, 776,
  777, 787, 821, 822, 823, 825

  Visit <http://sources.redhat.com/bugzilla/> for the details of each bug.

Version 2.3.4

* Support for RFC 3678.  Real implementations exist only for Linux so far.
  Implemented by Ulrich Drepper.

* nscd can now cache entries persistently.  Expiring entries are reloaded.
  For speedups the cache can be shared in memory with client processes.
  Implemented by Ulrich Drepper.

* nscd can now perform SELinux checks.
  Implemented by Matthew Rickard <mjricka@epoch.ncsc.mil>.

* getaddrinfo queries are now cached.  Canonical name lookup is performed
  efficiently.
  Implemented by Ulrich Drepper.

* The nothrow function attribute is used when headers are used by gcc when
  compiling C code.  This can avoid significant amounts of exception
  handling data.

* The malloc functions perform more error checking and are stricter when
  it comes to reacting on errors.  The default action is to terminate
  the process after showing an error message.  Implemented by Ulrich Drepper.

* Reverse lookups of IPv6 addresses does not use bit string or .ip6.int
  lookups anymore unless explicitly requested.  Implemented by Ulrich Drepper.

* Namespaces in ld.so are implemented.  DSOs can be loaded in separate
  namespaces using the new function dlmopen().  This feature is of course,
  like most other dynamic loading functionality, not available in statically
  linked applications.  Implemented by Ulrich Drepper.

* Low-overhead boundary checking variants of string and some stdio functions
  were added.  These are to be used in conjunction with a gcc patch by
  Jakub Jelinek which adds calls to these functions if possible.
  Implemented by Jakub Jelinek and Ulrich Drepper.

* Old code for several operating systems and machine architectures that
  have not been in working condition in a long time have been removed from
  the main source tree maintained by the GNU C Library's maintainers.
  These files are now reside in the separate `ports' source module
  that is usable as an add-on when building the library.

Version 2.3.3

* New functions `dladdr1' and `dlinfo' in <dlfcn.h> provide more ways to
  interrogate the dynamic linker, compatible with the Solaris interface.

* ELF thread-local storage support (TLS) now works on PowerPC and PowerPC64;
  implemented by Paul Mackerras, Steven Munroe, and Roland McGrath.

* getifaddrs now uses the netlink interface on Linux to get its information.
  Implemented by Thorsten Kukuk.

* getaddrinfo now implements AI_V4MAPPED, AI_ALL, and AI_ADDRCONF.
  Implemented by Ulrich Drepper.

* support for non-executable stacks on x86 has been added.  Changes mostly
  by Roland McGrath.

* regex is now much faster for multibyte locales.  Changes by Jakub Jelinek
  and Ulrich Drepper.

* getaddrinfo now performs destination address selection according to
  RFC 3484.

Version 2.3.2

* Thread-safe interfaces for many functions that access locale data
  were added in version 2.3, but these features were omitted from NEWS.
  Many functions have variants with an `_l' suffix that take a `locale_t'
  object as a parameter rather than consulting the current locale.
  The new functions `newlocale', `duplocale', and `freelocale' in <locale.h>
  create and maintain `locale_t' objects.  Additionally, the new function
  `uselocale' sets "the current locale" (as used by functions not so
  parameterized) set for an individual thread.  These features were added
  in version 2.3, implemented by Ulrich Drepper and Roland McGrath.

* The functions getresuid, getresgid, setresuid, and setresgid, which
  have long been available on Linux, are now declared in <unistd.h>
  and are now also available on the Hurd.

* ELF thread-local storage support (TLS) now works on x86-64.

* The new dynamic string token $LIB is expanded in shared library names.
  This normally expands to lib, but on some 64-bit platforms to lib64 instead.

* Aldy Hernandez contributed complete software floating point support for
  PowerPC machines with no FPU.

* fexecve is implemented on Linux.

* The `btowc' function should work at least twice as fast due to
  specialized callbacks in the iconv modules.  Implemented by Bruno Haible.

* With approriate thread add-ons cancelable functions are now implemented
  in libc.so as well.  No need to call the function in libpthread.  This
  change allowed to finally disable the incorrect and expensive handling
  of weak definition in ld.so.

* Yet more PLT entries in libc.so have been removed.  We finally arrived
  at the bare minimum.  Startup times improved appropriately.

* Support for the new Linux/x86 system call interface was added.  The
  AT_SYSINFO auxiliary vector entry is recognized and handled.

Version 2.3

* Masahide Washizawa contributed iconv modules for IBM1163 and IBM1164
  charsets.

* iconv (the program and the interface) now accepts empty names (excluding
  options like //TRANSLIT) to mean "use charset of current locale".

* localedef can now transliterate characters in strings which are not in
  the provided charmap.  The information from the input locale is used.

* Prelinking support was added for ELF targets.  This requires additional
  tools and recent versions of the GNU binutils.  Contributed by Jakub Jelinek.

* Read-only stdio streams now use mmap to speed up operation by eliminating
  copying and buffer underflows.  To use add 'm' to the mode string of
  the fopen/fdopen/freopen call.  Implemented by Ulrich Drepper.

* The malloc functions were completely rewritten by Wolfram Gloger based
  on Doug Lea's malloc-2.7.0.c.

* Isamu Hasegawa contributed a completely new and POSIX-conformant
  implementation of regex.

* Bruno Haible upgraded the iconv and locale implementation to support
  Unicode 3.2.

* Contents of the LC_* and LANG environment variables in the CEN style are
  not recognized anymore.   It never was used.  Change by Ulrich Drepper.

* The runtime (ld.so, libc, libpthread for Linux) now can handle the ELF
  thread-local storage (TLS) ABI on some platforms.
  Changes by Ulrich Drepper.  SH support by Kaz Kojima.

* Bruno Haible contributed iconv converters for ISO-2022-JP-3, SHIFT JIS-X0213,
  EUC-JISX0213, and TSCII.

* New header <ifaddrs.h> with functions `getifaddrs' and `freeifaddrs':
  BSD-compatible interface for getting all network interface addresses.
  Implementation for IPv4 by Roland McGrath.

* Loading of locale data is faster due to the introduction of a locale
  archive.  Implemented by Roland McGrath and Ulrich Drepper.

* Startup times are significantly reduced by not using exported functions
  inside the library itself.  Changes by Jakub Jelinek, Roland McGrath,
  and Ulrich Drepper.

* Steven Munroe contributed a port to PowerPC64/Linux.

Version 2.2.6

* The Hurd now uses the GNU libio implementation of stdio rather than the
  old GNU stdio implementation, and uses a new ABI (libc.so.0.3).

* The Hurd on x86 now has the `ioperm' function and <sys/io.h> header file
  with the same behavior as the Linux system call of the same name.

Version 2.2.5

* Stephen Moshier implemented log2, log10, powl and cbrtl for the
  128-bit long double format.

* Masahide Washizawa contributed iconv modules for IBM1132, IBM1133, IBM1160,
  IBM1161, and IBM1162 charsets.

* Andreas Jaeger contributed a port to x86-64/Linux.

* Peter Bruin contributed a port to PowerPC/Hurd.

* libc functions using I/O streams now can handle wide-oriented streams
  as well.

* optimizations in the dynamic linker.  Binaries created by recent binutils
  versions start up quicker due to reduced time spent on relocations.

* Support for use of gcc3 added by Jakub Jelinek and HJ Lu.

Version 2.2.4

* Stephen Moshier implemented cosh, expm1, log1p, acos, sinh, tanh,
  asinh, atanh, j0 for the 128-bit long double format.

* Bruno Haible updated all the code handling Unicode in some form to
  support Unicode 3.1.

* Speed of regex for single-byte locales is back to previous levels.
  Patch by Isamu Hasegawa.

* Alpha, SPARC, and IA-64 now also using floating stacks.

* Startup time of internationalized applications greatly improved through
  iconv cache.  Use iconvconfig to generate the cache file.
  Contributed by Ulrich Drepper.

* The IA-64 specific part of ld.so was rewritten to eliminate some pretty
  severe performance problems.  Patch by David Mosberger.

* The Hurd port got a lot more functionality like AIO, various stdio
  extensions, etc.  Mainly done by Roland McGrath.

* mtrace can now lookup symbols in shared libraries.

Version 2.2.3

* Intel's IA-64 math library is largely integrated.  It provides fast and
  accurate implementatations for most basic and standard math functions
  in float, double, and long double format.

* Stephen Moshier implemented j0, j1, jn, y0, y1, yn, lgamma, erf, erfc,
  and asin for the 96-bit long double format and asin, log, tan for the
  128-bit long double format.

* The beginning of a last-bit accurate math library by IBM Haifa were added.
  The basic double functions exist today.  Contributed by Abraham Ziv
  <ziv@il.ibm.com>, Moshe Olshansky <olshansk@il.ibm.com>, Ealan Henis
  <ealan@il.ibm.com>, and Anna Reitman <reitman@il.ibm.com>.

* An asynchronous name lookup library was added.  The interface is designed
  after POSIX AIO.  The proposal was circulated beforehand to get comments.
  No negative ones came in.  Implemented by Ulrich Drepper.

* Port to S390/64bit contributed by Martin Schwidefsky
  <schwidefsky@de.ibm.com>.

* David Mosberger <davidm@hpl.hp.com> implemented the setcontext family
  of functions for Linux/IA-64.

* The RPC code is now thread safe.  Threads can now use the same service
  of different services at the same time.  Patch by Eric Norum
  <eric.norum@usask.ca> with some help by Ulrich Drepper.

* Martin Schwidefsky <schwidefsky@de.ibm.com> implemented the setcontext
  family of functions for Linux/S390.

* Ulrich Drepper <drepper@redhat.com> implemented the setcontext family
  of functions for Linux/x86.

* Port to Linux/CRIS contributed by Axis Communications.

Version 2.2.2

* Lots of headers were cleaned up.  Using the tool in the conform/ subdir
  we can now check for namespace violations and missing declarations.  The
  result is that almost all headers are now Unix-compliant (as defined in
  the upcoming XPG6).  The negative side is that some programs might need
  corrections, too, if they depend on the incorrect form of the headers in
  previous versions which defined too many symbols and included too many
  other headers.

* regex now handles multibyte character sets correctly.
  Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.

* iconv (the program) does now conform to the upcoming XPG6 and handles
  charmaps.  Instead of the charset names the path of charmaps can be
  provided and the conversion happens based on this data.
  Contributed by Ulrich Drepper.

* The locale program now provides detailed information about the installed
  locales.  While

    locale -a

  only lists the names of the supported locales

    locale -a --verbose

  provides details such as country, language, and codeset name.
  Contributed by Ulrich Drepper.

Version 2.2.1

* The gencat program now parses the input file according to the charset
  selected by the LC_CTYPE category.  This is important for stateful
  character sets.  To make generating catalogs easier there is a way
  to overwrite the charset selected by the locale: before the first
  message or $ quote line the catalog can contain a line like

    $ codeset=ISO-8859-2

  to select the charset (ISO-8859-2 in this case).

  Implemented by Shinya Hanataka and Ulrich Drepper.

* New codeset conversion modules: IBM-922  (Estonia PC codeset),
  IBM-1124 (Ukraine PC codeset), IBM-1129 (Vietnamese PC codeset).
  Contributed by Masahide Washizawa <washi@jp.ibm.com>.

* Optimized string functions for Alpha ev6 and ev67 by Richard Henderson
  <rth@redhat.com> and Rick Gorton <rick.gorton@alpha-processor.com>.

* The LANGUAGE environment variable is now ignored unless the locale is
  changed from the default "C" locale.

* The usual bug fixes.

Version 2.2

* Greg McGary added runtime support for bounds checking using gcc's
  new -fbounded-pointers option.  ix86 target is complete.  PowerPC
  is in progress.

* Thorsten Kukuk added secure mode support to nscd.

* The Berkeley db libraries have been removed.

  Related, the nss_db module is now in a separate package since it
  obviously requires a database library being available.

* Wide character I/O streams implemented by Ulrich Drepper.

* Functions from the extended socket API added by Ulrich Drepper.

* Functions feenableexcept and fedisableexcept to control the
  behaviour of individual exceptions have been added by Andreas Jaeger.

* ldconfig program added by Andreas Jaeger and Jakub Jelinek.

* The resolver code has been updated from bind 8.2.3-T5B which supports
  threads.  The integration was done by Andreas Jaeger, Adam D. Bradley,
  and Mark Kettenis.

  This change could in some situations effect backward compatibility.  Since
  now `_res' is a thread-local instead of a global variable, modifying it
  in one thread does not have any effect in other threads.

  The resolver library was also extended to allow IPv6 as the transport
  protocol for the requests.  This work was done by Stig Venaas.

* Compatibility code for K&R C compilers has been removed from the
  header files.  A ISO C compiler is needed to use the library
  (conforming to either C89 or C99 standard).

* Complete rewrite of the localedef program to support multibyte character
  sets.  Implement handling of ISO 14651 and ISO 14652.  Rewrite strcoll,
  strxfrm, wcscoll, and wcsxfrm functions.  Make isw*() functions work.
  Implemented by Ulrich Drepper.

  Bruno Haible significantly improved the generation and use of the data
  structures for the wide character tables.

* Plural handling in gettext implemented by Ulrich Drepper.

* The utmp daemon has been removed.

* The port to MIPS-Linux has been finished by Andreas Jaeger.

* A port to Hitachi SH3 and SH4 has been contributed by Kazumoto Kojima
  and Yutaka Niibe.

* POSIX clocks and timers implemented by Kaz Kylheku and Ulrich Drepper.

* POSIX barriers implemented by Kaz Kylheku.

* POSIX spawn function family implemented by Ulrich Drepper.

* POSIX spinlocks are now available.

* Timed wait functions for mutex, rwlock, and semaphores are implemented.

* the configure option --enable-kernel=X.Y.Z allows to strip out
  compatibility for kernel versions before X.Y.Z.  This is currently only
  implemented for Linux.

* the sockaddr_in6 structure changed.  The IPv6 working group added a new
  field sin6_scope_id.  This means that all programs using IPv6 should be
  recompiled.  Don't expect binary compatibility with previous glibc
  versions.

* various conversion modules for IBM character sets contributed by
  Masahide Washizawa.

* IA-64 port by Jes Sorensen and HJ Lu.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Compiling the GNU C Library for Linux/ia64
******************************************

   Please refer to the file INSTALL in the same directory as you found
this file for general information about configuring and compiling
glibc.

   For general inquiries about glibc under Linux/ia64 please use the
following mailing list linux-ia64@linuxia64.org or one of the relevant
glibc mailing lists.

Recommended Tools for Compilation
=================================

   In order for glibc-2.2 to build correctly on the ia64 you need at
least the following versions of the GNU tools (the :

   * The Cygnus toolchain snapshot for the ia64 as of August 4
     including the provided set of patches.  It is however recommend
     you use the October 24 toolchain snapshot or a more recent version.

   OR alternatively you can try the following (the Cygnus toolchain is
   the recommended solution):

   * GCC and binutils, GAS and GNU LD out of CVS from
     sources.redhat.com as of August 28, 2000 or later.  The CVS tree
     may require special patches to work properly on the ia64.

Configuring and compiling GNU Libc for Linux/ia64
=================================================

   The library requires Linux kernel version 2.4.0-test4-000728 or
later to funtion properly. Besides that it support for debug libraries
is currently untested. Hence the following options
are required for configuring the library:

   --disable-debug --enable-kernel=2.4.0

   It is also important that you make sure the library picks up the
appropriate kernel header files, if you do not have recent enough
kernel headers in /usr/src/linux/include, you should use the
--with-headers=<path> option to specify the location.

   As an example I personally use the following options to configure
the library:

   --disable-debug
   --disable-cvs
   --enable-kernel=2.4.0
   --host=ia64-linux
   --enable-add-ons=yes
   --prefix=/usr
   --with-headers=/home/jes/linux/include


Good luck

Jes Sorensen <jes@linuxcare.com>,
November 14th, 2000
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Version 2.1.3

* bug fixes


Version 2.1.2

* bug fixes


Version 2.1.1

* New ISO C 9x function _Exit, imaxabs, and imaxdiv are added.

* New xdr functions are added; some rpc functions are now 64bit clean.

* Fixed a number of bugs and memory leaks (especially in NIS+ code).

* Fixed known incompatibilities with glibc 2.0.

* New functions lock64, strchrnul, rawmemchr, getutmp and getutmpx.

* Optimized a number of functions (especially the ELF dynamic loader).

* Update timezone data files.

* lots of charmaps corrections

* some new locale definitions and charmaps


Version 2.1

* Richard Henderson corrected size of struct timeval on Linux/Alpha to
  conform to POSIX member type requirements.  Symbol versions have been
  adjusted as needed within the library, and for direct use by applications,
  but there is potential for problems if third-party libraries use
  struct timeval as part of their interface.  This does not present
  a problem for X and other "essential" system libraries.

* An additional locale model to support C++ Standard Library locale
  model and probably more was implemented by Ulrich Drepper.

* Eric Youngdale and Ulrich Drepper implemented versioning of objects on
  symbol level.

* Miles Bader provided the `argp' function family to support hierachical
  command line argument parsing, layered on top of getopt.

* strtod accepts new hexadecimal floating-point format from ISO C 9X.

* printf has two new specifiers %a and %A to print hexadecimal flaoting-point
  numbers.

* scanf recognizes the %a and %A format for scanning floating point numbers.

* the new headers <stdint.h> and <inttypes.h> from ISO C 9X provides
  information and interfaces for the available integer types.

* about 130 new math functions were added to implement the ISO C9x math
  library.

* the new header <complex.h> contains definitions of the complex math
  functions from ISO C 9X.

* the new header <tgmath.h> defines generic macros to use complex or
  real valued functions.

* Thorsten Kukuk provided an implementation for NIS+, securelevel 0, 1 and 2.

* Andreas Jaeger provided a test suite for the math library.

* Mark Kettenis implemented the utmpx interface and an utmp daemon.

* Ulrich Drepper added character set conversion functions (iconv).

* Optimized string functions have been added.

* The localedata addon is now part of glibc.

* An implementation of profiling shared libraries was added by Ulrich Drepper.

* Thorsten Kukuk and Ulrich Drepper provided an implementation for a caching
  daemon for NSS (nscd).

  Missing a better place here are some numbers on improvements.  Under
  Linux 2.1.125 un-tar-ing the kernel sources takes

				  user	system	   wall

    using local files		12.19s	 6.88s	 22.91s

    using NIS			13.92s	 8.91s	 26.34s

    using NIS & nscd		10.37s	 7.34s	 25.30s

    using NIS+			27.57s	30.37s  640.46s

    using NIS+ & nscd           10.25s   7.83s   26.51s

    using NIS & old nscd [1]	13.83s	 8.32s	 29.60s

  Keep in mind that non-namelookup related operations dominate above times.
  It was just a common complain that using NIS+ unpacking the kernel is
  horribly slow.

  [1] The old nscd implementation is not available anymore since it was
  distributed with glibc up to version 2.0.98 and thus is now replaced.

* Tim Waugh provided an implementation of the POSIX.2 wordexp function family.

* Mark Kettenis provided a Hesiod NSS module.

* The ELF dynamic loader knows how to process dynamic string tokens ($ORIGIN
  and $PLATFORM) in RPATHs and similar strings (Ulrich Drepper).

* rcmd can now handle netgroups (Dick Streefland).

* A port to the ARM was contributed by Phil Blundell, Pat Beirne and Scott
  Bambrough.

* Support for the IPv6 protocol has been added to the socket API, as per the
  latest draft standards.

* Support for Linux 2.2 has been added.

* Interface changes relative to the latest 2.0.x release:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
addseverity			NEW: Unix98
alphasort64			NEW: LFS
argp_err_exit_status		NEW: argp, GNU ext
argp_error			NEW: argp, GNU ext
argp_failure			NEW: argp, GNU ext
argp_help			NEW: argp, GNU ext
argp_parse			NEW: argp, GNU ext
argp_program_bug_address	NEW: argp, GNU ext
argp_program_version		NEW: argp, GNU ext
argp_program_version_hook	NEW: argp, GNU ext
argp_state_help			NEW: argp, GNU ext
argp_usage			NEW: argp, GNU ext
authdes_create			NEW: Secure RPC
authdes_getucred		NEW: Secure RPC
authdes_pk_create		NEW: Secure RPC
backtrace			NEW: GNU ext.
backtrace_symbols		NEW: GNU ext.
backtrace_symbols_fd		NEW: GNU ext.
cacos				NEW: ISO C 9x
cacosf				NEW: ISO C 9x
cacosh				NEW: ISO C 9x
cacoshf				NEW: ISO C 9x
cacoshl				NEW: ISO C 9x
cacosl				NEW: ISO C 9x
capget				NEW: kernel
capset				NEW: kernel
carg				NEW: ISO C 9x
cargf				NEW: ISO C 9x
cargl				NEW: ISO C 9x
casin				NEW: ISO C 9x
casinf				NEW: ISO C 9x
casinh				NEW: ISO C 9x
casinhf				NEW: ISO C 9x
casinhl				NEW: ISO C 9x
casinl				NEW: ISO C 9x
catan				NEW: ISO C 9x
catanf				NEW: ISO C 9x
catanh				NEW: ISO C 9x
catanhf				NEW: ISO C 9x
catanhl				NEW: ISO C 9x
catanl				NEW: ISO C 9x
cbc_crypt			NEW: Secure RPC
ccos				NEW: ISO C 9x
ccosf				NEW: ISO C 9x
ccosh				NEW: ISO C 9x
ccoshf				NEW: ISO C 9x
ccoshl				NEW: ISO C 9x
ccosl				NEW: ISO C 9x
cexp				NEW: ISO C 9x
cexpf				NEW: ISO C 9x
cexpl				NEW: ISO C 9x
cimag				NEW: ISO C 9x
cimagf				NEW: ISO C 9x
cimagl				NEW: ISO C 9x
clearerr_locked			REMOVED
clntunix_create			NEW: sunrpc ext
clog				NEW: ISO C 9x
clog10				NEW: ISO C 9x
clog10f				NEW: ISO C 9x
clog10l				NEW: ISO C 9x
clogf				NEW: ISO C 9x
clogl				NEW: ISO C 9x
conj				NEW: ISO C 9x
conjf				NEW: ISO C 9x
conjl				NEW: ISO C 9x
cpow				NEW: ISO C 9x
cpowf				NEW: ISO C 9x
cpowl				NEW: ISO C 9x
cproj				NEW: ISO C 9x
cprojf				NEW: ISO C 9x
cprojl				NEW: ISO C 9x
creal				NEW: ISO C 9x
crealf				NEW: ISO C 9x
creall				NEW: ISO C 9x
creat64				NEW: LFS
csin				NEW: ISO C 9x
csinf				NEW: ISO C 9x
csinh				NEW: ISO C 9x
csinhf				NEW: ISO C 9x
csinhl				NEW: ISO C 9x
csinl				NEW: ISO C 9x
csqrt				NEW: ISO C 9x
csqrtf				NEW: ISO C 9x
csqrtl				NEW: ISO C 9x
ctan				NEW: ISO C 9x
ctanf				NEW: ISO C 9x
ctanh				NEW: ISO C 9x
ctanhf				NEW: ISO C 9x
ctanhl				NEW: ISO C 9x
ctanl				NEW: ISO C 9x
des_setparity			NEW: Secure RPC
ecb_crypt			NEW: Secure RPC
endutxent			NEW: Unix98
exp10				NEW: ISO C 9x
exp10f				NEW: ISO C 9x
exp10l				NEW: ISO C 9x
exp2				NEW: ISO C 9x
exp2f				NEW: ISO C 9x
exp2l				NEW: ISO C 9x
fattach				NEW: STREAMS
fdetach				NEW: STREAMS
fdim				NEW: ISO C 9x
fdimf				NEW: ISO C 9x
fdiml				NEW: ISO C 9x
feclearexcept			NEW: ISO C 9x
fegetenv			NEW: ISO C 9x
fegetexceptflag			NEW: ISO C 9x
fegetround			NEW: ISO C 9x
feholdexcept			NEW: ISO C 9x
feof_locked			REMOVED
feraiseexcept			NEW: ISO C 9x
ferror_locked			REMOVED
fesetenv			NEW: ISO C 9x
fesetexceptflag			NEW: ISO C 9x
fesetround			NEW: ISO C 9x
fetestexcept			NEW: ISO C 9x
feupdateenv			NEW: ISO C 9x
fflush_locked			REMOVED
ffsl				NEW: GNU ext.
ffsll				NEW: GNU ext.
fgetpos64			NEW: LFS
fgets_unlocked			NEW: GNU ext.
fileno_locked			REMOVED
fma				NEW: ISO C 9x
fmaf				NEW: ISO C 9x
fmal				NEW: ISO C 9x
fmax				NEW: ISO C 9x
fmaxf				NEW: ISO C 9x
fmaxl				NEW: ISO C 9x
fmin				NEW: ISO C 9x
fminf				NEW: ISO C 9x
fminl				NEW: ISO C 9x
fmtmsg				NEW: Unix98
fopen64				NEW: LFS
fputc_locked			REMOVED
fputs_unlocked			NEW: GNU ext.
fread_unlocked			NEW: GNU ext.
freopen64			NEW: LFS
fseeko				NEW: Unix98
fsetpos64			NEW: LFS
fstatfs64			NEW: LFS
fstatvfs			NEW: Unix98
fstatvfs64			NEW: LFS
ftello				NEW: Unix98
ftello64			NEW: LFS
ftruncate64			NEW: LFS
ftw64				NEW: LFS
fwrite_unlocked			NEW: GNU ext.
gai_strerror			NEW: IPv6
gamma_r				REMOVED
gammaf_r			REMOVED
gammal_r			REMOVED
getchar_locked			REMOVED
getdate				NEW: Unix98
getdate_err			NEW: Unix98
getdate_r			NEW: GNU ext.
getmsg				NEW: STREAMS
getnameinfo			NEW: IPv6
getnetname			NEW: Secure RPC
getpmsg				NEW: STREAMS
getpt				NEW: Unix98 PTY
getrlimit64			NEW: LFS
getutxent			NEW: Unix98
getutxid			NEW: Unix98
getutxline			NEW: Unix98
glob64				NEW: GNU ext.
globfree64			NEW: GNU ext.
gnu_get_libc_release		NEW: GNU ext.
gnu_get_libc_version		NEW: GNU ext.
grantpt				NEW: Unix98 PTY
host2netname			NEW: Secure RPC
iconv				NEW: iconv
iconv_close			NEW: iconv
iconv_open			NEW: iconv
if_freenameindex		NEW: IPv6
if_indextoname			NEW: IPv6
if_nameindex			NEW: IPv6
if_nametoindex			NEW: IPv6
in6addr_any			NEW: IPv6
in6addr_loopback		NEW: IPv6
inet6_isipv4mapped		NEW: IPv6
isastream			NEW: STREAMS
iswblank			NEW: GNU ext.
key_decryptsession		NEW: Secure RPC
key_decryptsession_pk		NEW: Secure RPC
key_encryptsession		NEW: Secure RPC
key_encryptsession_pk		NEW: Secure RPC
key_gendes			NEW: Secure RPC
key_get_conv			NEW: Secure RPC
key_secretkey_is_set		NEW: Secure RPC
key_setnet			NEW: Secure RPC
key_setsecret			NEW: Secure RPC
llrint				NEW: ISO C 9x
llrintf				NEW: ISO C 9x
llrintl				NEW: ISO C 9x
llround				NEW: ISO C 9x
llroundf			NEW: ISO C 9x
llroundl			NEW: ISO C 9x
log2				NEW: ISO C 9x
log2f				NEW: ISO C 9x
log2l				NEW: ISO C 9x
lrint				NEW: ISO C 9x
lrintf				NEW: ISO C 9x
lrintl				NEW: ISO C 9x
lround				NEW: ISO C 9x
lroundf				NEW: ISO C 9x
lroundl				NEW: ISO C 9x
lseek64				NEW: LFS
makecontext			NEW: Unix98
mempcpy				NEW: GNU ext.
mmap64				NEW: LFS
moncontrol			REMOVED
modify_ldt			NEW: kernel
nan				NEW: ISO C 9x
nanf				NEW: ISO C 9x
nanl				NEW: ISO C 9x
nearbyint			NEW: ISO C 9x
nearbyintf			NEW: ISO C 9x
nearbyintl			NEW: ISO C 9x
netname2host			NEW: Secure RPC
netname2user			NEW: Secure RPC
nexttoward			NEW: ISO C 9x
nexttowardf			NEW: ISO C 9x
nexttowardl			NEW: ISO C 9x
nftw				NEW: Unix98
nftw64				NEW: LFS
open64				NEW: LFS
passwd2des			NEW: Secure RPC
pow10				NEW: GNU ext.
pow10f				NEW: GNU ext.
pow10l				NEW: GNU ext.
pread				NEW: Unix98
pread64				NEW: LFS
printf_size			NEW: GNU ext.
printf_size_info		NEW: GNU ext.
profil_counter			REMOVED
pthread_mutexattr_getkind_np	REPLACED
pthread_mutexattr_setkind_np	REPLACED
ptsname				NEW: Unix98 PTY
ptsname_r			NEW: Unix98 PTY
putc_locked			REMOVED
putchar_locked			REMOVED
putgrent			NEW: GNU ext.
putmsg				NEW: STREAMS
putpmsg				NEW: STREAMS
pututxline			NEW: Unix98
pwrite				NEW: Unix98
pwrite64			NEW: LFS
readdir64			NEW: LFS
readdir64_r			NEW: LFS
remquo				NEW: ISO C 9x
remquof				NEW: ISO C 9x
remquol				NEW: ISO C 9x
round				NEW: ISO C 9x
roundf				NEW: ISO C 9x
roundl				NEW: ISO C 9x
rtime				NEW: GNU ext.
scalbln				NEW: ISO C 9x
scalblnf			NEW: ISO C 9x
scalblnl			NEW: ISO C 9x
scandir64			NEW: LFS
sendfile			NEW: kernel
setcontext			NEW: Unix98
setrlimit64			NEW: LFS
setutxent			NEW: Unix98
sighold				NEW: Unix98
sigignore			NEW: Unix98
sigqueue			NEW: POSIX.1b
sigrelse			NEW: Unix98
sigset				NEW: POSIX.1b
sigtimedwait			NEW: POSIX.1b
sigwaitinfo			NEW: POSIX.1b
sincos				NEW: GNU ext.
sincosf				NEW: GNU ext.
sincosl				NEW: GNU ext.
statfs64			NEW: LFS
statvfs				NEW: Unix98
statvfs64			NEW: LFS
strcasestr			NEW: GNU ext.
strtoimax			NEW: ISO C 9x
strtoumax			NEW: ISO C 9x
strverscmp			NEW: GNU ext.
svcauthdes_stats		NEW: Secure RPC
svcunix_create			NEW: sunrpc etx
svcunixfd_create		NEW: sunrpc ext
swapcontext			NEW: Unix98
tcgetsid			NEW: Unix98 PTY
tdestroy			NEW: GNU ext.
tgamma				NEW: ISO C 9x
tgammaf				NEW: ISO C 9x
tgammal				NEW: ISO C 9x
tmpfile64			NEW: LFS
trunc				NEW: ISO C 9x
truncate64			NEW: LFS
truncf				NEW: ISO C 9x
truncl				NEW: ISO C 9x
umount2				NEW: kernel
unlockpt			NEW: Unix98 PTY
updwtmpx			NEW: Unix98
user2netname			NEW: Secure RPC
utmpxname			NEW: Unix98
versionsort			NEW: GNU ext.
versionsort64			NEW: GNU ext.
waitid				NEW: Unix98
wcscasecmp			NEW: GNU ext.
wcsncasecmp			NEW: GNU ext.
wcsnlen				NEW: GNU ext.
wcstoimax			NEW: ISO C 9x
wcstoll				NEW: ISO C 9x
wcstoull			NEW: ISO C 9x
wcstoumax			NEW: ISO C 9x
wcswcs				NEW: Unix98
wordexp				NEW: POSIX.2
wordfree			NEW: POSIX.2
write_profiling			REMOVED
xdecrypt			NEW: Secure RPC
xdr_authdes_cred		NEW: Secure RPC
xdr_authdes_verf		NEW: Secure RPC
xdr_cryptkeyarg			NEW: Secure RPC
xdr_cryptkeyarg2		NEW: Secure RPC
xdr_cryptkeyres			NEW: Secure RPC
xdr_getcredres			NEW: Secure RPC
xdr_key_netstarg		NEW: Secure RPC
xdr_key_netstres		NEW: Secure RPC
xdr_keybuf			NEW: Secure RPC
xdr_keystatus			NEW: Secure RPC
xdr_netnamestr			NEW: Secure RPC
xdr_sizeof			NEW: Secure RPC
xdr_unixcred			NEW: sunrpc ext
xencrypt			NEW: Secure RPC
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Version 2.0.6

* more bug fixes


Version 2.0.5

* more bug fixes

* inet_ntoa is thread-safe

* updwtmp is moved from libutil to libc

* rewrite of cbrt function

* update of timezone data

Version 2.0.4

* more bug fixes

Version 2.0.3

* more bug fixes

Version 2.0.2

* more bug fixes

* add atoll function

* fix complex problems in Berkeley DB code

* fix math functions

Version 2.0.1

* fixed lots of header problems (especially Linux/GNU specific)

* dynamic loader preserves all registers

* Roland McGrath provided support for handling of auxiliary objects in
  the ELF dynamic loader.

* support for parallel builds is improved

Version 2.0

* GNU extensions are no longer declared by default.  To enable them you
  must define the macro `_GNU_SOURCE' in your program or compile with
  `-D_GNU_SOURCE'.

* The library has changed from using GNU ld symbol aliases to using weak
  symbols where available.  The ELF object file format supports weak
  symbols; GNU ld also supports weak symbols in the a.out format.  (There
  is also now support for other GNU ld extensions in ELF.  Use the
  `--with-elf' option to configure to indicate you have ELF, and
  `--with-gnu-ld' if using GNU ld.)  This change resulted in the deletion
  of many files which contained only symbol aliases, reducing the size of
  the source and the compiled library; many other files were renamed to
  less cryptic names previously occupied by the symbol alias files.
  There is a new header file <elf.h> for programs which operate on
  files in the ELF format.

* Converted to Autoconf version 2, so `configure' has more options.
  Run `configure --help' to see the details.

* The library can now be configured to build profiling, highly-optimized
  (but undebuggable), and/or shared libraries (ELF with GNU ld only).  The
  `--enable-profile', `--enable-omitfp', and `--enable-shared' options to
  `configure' enable building these extra libraries.  The shared library is
  built by default when using both ELF and GNU ld.  When shared libraries
  are enabled, the new library `-ldl' is available for arbitrary run-time
  loading of shared objects; its interface is defined in <dlfcn.h>.  The
  new header file <link.h> gives access to the internals of the run-time
  dynamic linker, `ld.so'.  The shell script `ldd' is similar to the
  application of same name on other systems and it provides information
  about dynamically linked binaries.

* The C library now provides the run-time support code for profiling
  executables compiled with `-pg'.  Programs can control the profiling code
  through the interface in <sys/gmon.h>.  The `gmon.out' files written by
  the GNU C library can be read only by GNU `gprof' (from GNU binutils);
  the support for this file format was contributed by David Mosberger-Tang.

* The math code has been replaced with a math library based on fdlibm from
  Sun, and modified by JT Conklin and Ulrich Drepper with i387 support, by
  Ian Taylor with `float' functions and by Ulrich Drepper with `long double'
  functions.  The math functions now reside in a separate library,  so
  programs using them will need to use `-lm' their linking commands.

* John C. Bowman contributed optimized ix87 assembler inline functions.

* Ulrich Drepper has contributed support for an `/etc/nsswitch.conf'
  mechanism similar to that found in Solaris 2.  This is now used for the
  group, passwd, hosts, networks, services, protocols, rpc, ethers,
  shadow, netgroup, publickey, and alias databases.  The `nsswitch.conf'
  file controls what services are used for each individual database.  This
  works by loading shared libraries with names specified in `nsswitch.conf',
  so service modules can be changed or added at any time without even
  relinking any program.  Currently there are the file, db, and NIS based
  NSS services available.

* The new functions `strtoq' and `strtouq' parse integer values from
  strings, like `strtol' and `strtoul', but they return `long long int' and
  `unsigned long long int' values, respectively (64-bit quantities).

* The new functions `strtof' and `strtold' parse floating-point values from
  strings, like `strtod', but they return `float' and `long double' values,
  respectively (on some machines `double' and `long double' are the same).

* Ulrich Drepper has contributed new implementations of the floating-point
  printing and reading code used in the `printf' family of functions and
  `strtod', `strtof', and `strtold'.  These new functions are perfectly
  accurate, and much faster than the old ones.

* The implementation of the POSIX locale model was completely rewritten by
  Ulrich Drepper.  This includes the new programs `localedef' and `locale'
  to compile the POSIX locale definition.

* The former dummy implementations of the strcoll and strxfrm function are
  now replaced by fully functional code contributed by Ulrich Drepper.  The
  collation information comes from the POSIX locale definitions.

* The new header <langinfo.h> defines an interface for accessing
  various locale-dependent data (using the locale chosen with `setlocale').

* Ulrich Drepper has contributed a new suite of functions for operation on
  wide-character and multibyte-character strings, in <wchar.h>;
  and classification and case conversion of wide characters, in <wctype.h>.
  These new functions are conforming to the ISO C, Amendement 1 specification.

* There is now a second implementation of the standard I/O library available.
  It comes from GNU libg++ as was written by Per Bothner, heavily modified
  by Hongjiu Lu and made thread safe by Ulrich Drepper.

* You can now use positional parameter specifications in format strings
  for the `printf' and `scanf' families of functions.  For example,
  `printf ("Number %2$d, Mr %1$s\n", "Jones", 6);'' prints
  ``Number 6, Mr Jones''.  This is mainly useful when providing different
  format strings for different languages, whose grammars may dictate
  different orderings of the values being printed.  To support this
  feature, the interface for `register_printf_handler' has changed; see
  the header file <printf.h> for details.

* The `printf' and `scanf' families of functions now understand a new
  formatting flag for numeric conversions: the ' flag (e.g. %'d or %'f) says
  to group numbers as indicated by the locale; for `scanf' and friends, this
  says to accept as valid only a number with all the proper grouping
  separators in the right places.  In the default "C" locale, numbers are
  not grouped; but locales for specific countries will define the usual
  conventions (i.e. separate thousands with `,' in the US locale).

* The pgrp functions have been regularized, slightly incompatibly but much
  less confusingly.  The core functions are now `getpgid' and `setpgid',
  which take arguments for the PID to operate on; the POSIX.1 `getpgrp' (no
  argument) and BSD `setpgrp' (identical to `setpgid') functions are
  provided for compatibility.  There is no longer an incompatible `getpgrp'
  with an argument declared under _BSD_SOURCE; no BSD code uses it.

* The new header file <fts.h> and suite of functions simplify programs that
  operate on directory trees.  This code comes from 4.4 BSD.

* The resolver code has been updated from the BIND 4.9.5-P1 release.
  Parts of the code were heavily modified by Ulrich Drepper to fit in the
  NSS scheme used in glibc.

* There is a new malloc debugging hook `__memalign_hook'.

* There are new typedefs `ushort' for `unsigned short int' and `uint' for
  `unsigned int' in <sys/types.h>.  These are for compatibility only and
  their use is discouraged.

* The `-lmcheck' library to enable standard malloc debugging hooks is now
  done differently, so that it works even without GNU ld.

* New function `euidaccess' checks allowed access to a file like `access',
  but using the effective IDs instead of the real IDs.

* The time zone data files have been updated for the latest and greatest
  local time conventions of the countries of the world.

* The new function `dirfd' extracts the file descriptor used by a DIR stream;
  see <dirent.h>.

* The new functions `ecvt', `fcvt', and `gcvt' provide an obsolete interface
  for formatting floating-point numbers.  They are provided only for
  compatibility; new programs should use `sprintf' instead.  There are
  also equivalent function for the `long double' floating-point type and
  all functions also exist in a reentrant form.

* The new auxiliary library `-lutil' from 4.4 BSD contains various
  functions for maintaining the login-record files (primarily of use to
  system programs such as `login'), and convenient functions for
  allocating and initializing a pseudo-terminal (pty) device.

* Ulrich Drepper has contributed new support for System V style
  shared memory and IPC on systems that support it.

* Ulrich Drepper has contributed several miscellaneous new functions found
  in System V: The `hsearch' family of functions provide an effective
  implementation of hash tables; `a64l' and `l64a' provide a very simple
  binary to ASCII mapping; `drand48' and friends provide a 48-bit random
  number generator.

* Ulrich Drepper has contributed new reentrant counterparts for the
  `random' and `hsearch' families of functions; `random_r', `hsearch_r', etc.

* Ulrich Drepper has contributed new, highly-optimized versions of several
  string functions for the i486/Pentium family of processors.

* Ulrich Drepper has updated the Linux-specific code, based largely
  on work done in Hongjiu Lu's version of GNU libc for Linux.
  The GNU library now supports Linux versions 2.0.10 and later,
  using the ELF object file format (i[3456]86-*-linux).

* Andreas Schwab has ported the C library to Linux/m68k (m68k-*-linux).

* David Mosberger-Tang and Richard Henderson have ported the C library
  to Linux/Alpha (alpha-*-linux).  Richard Henderson contributed the
  dynamic linking support for ELF/Alpha.

* Richard Henderson contributed several Alpha optimized assembler function
  for arithmetic and string handling.

* Ulrich Drepper has contributed a new set of message catalog functions to
  support multiple languages using the <libintl.h> interface, for use with
  his new package GNU gettext.  Translation volunteers have contributed
  catalogs of the library's messages in Spanish, German, and Korean.

* For compatibility with XPG4, Ulrich Drepper has contributed the `gencat'
  program and the `catgets' function for reading the catalog files it
  creates.  (The <libintl.h> interface is preferred; we include the
  <nl_types.h> interface using `catgets' only for source compatibility with
  programs already written to use it.)

* New header file <values.h> gives SVID-compatible names for <limits.h>
  constants.

* Various new macros, declarations, and small header files for compatibility
  with 4.4 BSD.

* New function `group_member' is a convenient way to check if a process has
  a given effective group ID.

* When using GCC 2.7 and later, the socket functions are now declared in a
  special way so that passing an argument of type `struct sockaddr_in *',
  `struct sockaddr_ns *', or `struct sockaddr_un *' instead of the generic
  `struct sockaddr *' type, does not generate a type-clash warning.

* New function `error' declared in header file <error.h> is a convenient
  function for printing error messages and optionally exiting; this is the
  canonical function used in GNU programs.  The new functions `err', `warn',
  and friends in header file <err.h> are the canonical 4.4 BSD interface for
  doing the same thing.

* The <glob.h> interface has several new flags from 4.4 BSD that extend the
  POSIX.2 `glob' function to do ~ and {...} expansion.

* New function `unsetenv' complements `setenv' for compatibility with 4.4 BSD.
  `clearenv' which is used in POSIX.9 is also available.

* New function `getsid' returns session ID number on systems that support it.

* We have incorporated the 4.4 BSD `db' library (version 1.85).  New header
  files <db.h> and <mpool.h> provide a rich set of functions for several
  types of simple databases stored in memory and in files, and <ndbm.h> is
  an old `ndbm'-compatible interface using the `db' functions.  Link with
  `-ldb' to get these functions.

* New macro `strdupa' copies a string like `strdup', but uses local stack
  space from `alloca' instead of dynamic heap space from `malloc'.

* New function `strnlen' is like `strlen' but searches only a given maximum
  number of characters for the null terminator.  `stpncpy', `strndup' and
  `strndupa' are similar variants for the `stpcpy', `strdup' and `strdupa'
  function.

* New function `statfs' in header <sys/statfs.h>.

* The new <argz.h> and <envz.h> interfaces contributed by Miles Bader
  provide convenient functions for operating on blocks of null-terminated
  strings.

* A new suite of functions in <utmp.h> handle all the details of reading
  and writing the utmp file.

* An implementation of the NIS/YP(tm) based NSS service was contributed by
  Thorsten Kukuk.

* Paul Eggert and Ulrich Drepper modified the `strftime' function to be
  completely POSIX compliant and also implemented the extended functionality
  to handle alternate digit representation and alternate era date formats.

* Ulrich Drepper provided an implementation of the `strptime' function
  defined in XPG4.2 which transforms a string into a `struct tm' value.

* Paul Eggert provided the tzselect shell script as part of the timezone
  code.  The shell script makes it easy to select the correct timezone
  specification.

* The implementation of the malloc family of functions is completely replaced
  by a new implementation by Doug Lea with many improvements by Wolfram Gloger.
  The implementation uses the mmap function (if available) and it is
  optimized for the use in multi threaded programs.

* Ulrich Drepper contributed a MD5 "encryption" for the crypt family of
  functions.  This new functionality is usable by specifying a special
  salt string and it is compatible with implementation on *BSD systems.

* Lots of functions from the XPG4.2 standard were added by Ulrich Drepper:
  `getsubopt' to handle second level command line options, `bsd_signal'
  to access BSD style `signal' functionality, the obsolete `regexp' style
  expression matcher.

* the `lchown' function is available on system which support this
  functionality.

* The implementation of the shadow password handling function was contributed
  by Ulrich Drepper.

* David Mosberger-Tang changed the SunRPC implementation to be 64bit safe.

* POSIX.1g support was added.  The <sys/select.h> header is available,
  `isfdtype' and `pselect' are implemented.  Craig Metz contributed an
  implementation of `getaddrinfo'.

Version 1.09

* For cross-compilation you should now set `BUILD_CC' instead of `HOST_CC'.

* New header file <fstab.h> and new functions `getfsspec', `getfsent' and
  friends, for parsing /etc/fstab.  This code comes from 4.4 BSD.

* The new function `daemon' from 4.4 BSD is useful for server programs that
  want to put themselves in the background.

* Joel Sherrill has contributed support for several standalone boards that
  run without an operating system.

* `printf', `scanf' and friends now accept a `q' type modifier for long
  long int as well as `ll'.  Formats using these might be `%qu' or `%lld'.

* All of the code taken from BSD (notably most of the math and networking
  routines) has been updated from the BSD 4.4-Lite release.

* The resolver code has been updated from the BIND-4.9.3-BETA9 release.

* The new functions `getdomainname' and `setdomainname' fetch or change the
  YP/NIS domain name.  These are system calls which exist on systems which
  have YP (aka NIS).

* The time zone data files have been updated for the latest international
  conventions.

* The SunRPC programs `portmap' and `rpcinfo' are now installed in
  $(sbindir) (usually /usr/local/sbin) instead of $(bindir).

Version 1.08

* The C library now includes support for Sun RPC, from Sun's free
  RPCSRC-4.0 distribution.  The `portmap', `rpcinfo', and `rpcgen' programs
  are included.  (There is still no support for YP.)

* Tom Quinn has contributed a port of the C library to SGI machines running
  Irix 4 (mips-sgi-irix4).

* The new `lockf' function is a simplified interface to the locking
  facilities of `fcntl', included for compatibility.

* New time functions `timegm', `timelocal', and `dysize' for compatibility.

* New header file <sys/timeb.h> and new function `ftime' for compatibility.

* New header files <poll.h> and <sys/poll.h> and new function `poll' for
  compatibility.

* The error message printed by `assert' for a failed assertion now includes
  the name of the program (if using GNU ld) and the name of the calling
  function (with versions of GCC that support this).

* The `psignal' function is now declared in <signal.h>, not <stdio.h>.

* The library now includes the <sys/mman.h> header file and memory
  management functions `mmap', `munmap', `mprotect', `msync', and
  `madvise', on systems that support those facilities.

* The interface for `mcheck' has changed slightly: the function called to
  abort the program when an allocation inconsistency is detected now takes
  an argument that indicates the type of failure.  The new function
  `mprobe' lets you request a consistency check for a particular block at
  any time (checks are normally done only when you call `free' or `realloc'
  on a block).

* It is now possible to easily cross-compile the C library, building on one
  system a library to run on another machine and/or operating system.  All
  you need to do is set the variable `HOST_CC' in `configparms' to the
  native compiler for programs to run on the machine you are building on (a
  few generator programs are used on Unix systems); set `CC' to the
  cross-compiler.

* The new function `fexecve' (only implemented on the GNU system) executes
  a program file given a file descriptor already open on the file.

Version 1.07

* Brendan Kehoe has contributed most of a port to the DEC Alpha
  running OSF/1 (alpha-dec-osf1).  He says it is 75% complete.

* You can set the variable `libprefix' in `configparms' to specify a prefix
  to be prepended to installed library files; this makes it easy to install
  the GNU C library to be linked as `-lgnuc' or whatever.

* The new `stpncpy' is a cross between `stpcpy' and `strncpy': It
  copies a limited number of characters from a string, and returns the
  address of the last character written.

* You no longer need to check for whether the installed `stddef.h' is
  compatible with the GNU C library.  configure now checks for you.

* You can now define a per-stream `fileno' function to convert the
  stream's cookie into an integral file descriptor.

* ``malloc (0)'' no longer returns a null pointer.  Instead, it
  allocates zero bytes of storage, and returns a unique pointer which
  you can pass to `realloc' or `free'.  The behavior is undefined if
  you dereference this pointer.

* The C library now runs on Sony NEWS m68k machines running either
  NewsOS 3 or NewsOS 4.

* The new `syscall' function is a system-dependent primitive function
  for invoking system calls.  It has the canonical behavior on Unix
  systems, including unreliable return values for some calls (such as
  `pipe', `fork' and `getppid').

* The error code `EWOULDBLOCK' is now obsolete; it is always defined
  to `EAGAIN', which is the preferred name.  On systems whose kernels
  use two distinct codes, the C library now translates EWOULDBLOCK to
  EAGAIN in every system call function.

Version 1.06

* The GNU C Library Reference Manual is now distributed with the library.
  `make dvi' will produce a DVI file of the printed manual.
  `make info' will produce Info files that you can read on line using C-h i
  in Emacs or the `info' program.
  Please send comments on the manual to bug-glibc-manual@gnu.org.

* The library now supports SVR4 on i386s (i386-unknown-sysv4).

* Brendan Kehoe has contributed a port to Sun SPARCs running Solaris 2.

* Jason Merrill has contributed a port to the Sequent Symmetry running
  Dynix version 3 (i386-sequent-dynix).

* The library has been ported to i386s running SCO 3.2.4 (also known as SCO
  ODT 2.0; i386-unknown-sco3.2.4) or SCO 3.2 (i386-unknown-sco3.2).

* New function `memory_warnings' lets you arrange to get warnings when
  malloc is running out of memory to allocate, like Emacs gives you.

* The C library now contains the relocating allocator used in Emacs 19 for
  its editing buffers.  This allocator (ralloc) minimizes allocation
  overhead and fragmentation by moving allocated regions around whenever it
  needs to.  You always refer to a ralloc'd region with a "handle" (a
  pointer to a pointer--an object of type `void **').

* There is a new `printf' format: `%m' gives you the string corresponding
  to the error code in `errno'.

* In `scanf' formats, you can now use `%as' or `%a[' to do the normal `%s'
  or `%[' conversion, but instead of filling in a fixed-sized buffer you
  pass, the `a' modifier says to fill in a `char **' you pass with a
  malloc'd string.

* The `fnmatch' function supports the new flag bits `FNM_LEADING_DIR' and
  `FNM_CASEFOLD'.  `FNM_LEADING_DIR' lets a pattern like `foo*' match a
  name like `foo/bar'.  `FNM_CASEFOLD' says to ignore case in matching.

* `mkstemp' is a traditional Unix function to atomically create and open a
  uniquely-named temporary file.

Version 1.05

* The standard location for the file that says what the local timezone is
  has changed again.  It is now `/usr/local/etc/localtime' (or more
  precisely, `${prefix}/etc/localtime') rather than `/etc/localtime'.

* The distribution no longer contains any files with names longer than 14
  characters.

* `struct ttyent' has two new flag bits: TTY_TRUSTED and TTY_CONSOLE.
  These are set by the new `trusted' and `console' keywords in `/etc/ttys'.

* New functions `ttyslot' and `syslog' from 4.4 BSD.

Version 1.04

* The configuration process has changed quite a bit.  The `configure'
  script is now used just like the configuration scripts for other GNU
  packages.  The `sysdeps' directory hierarchy is much rearranged.
  The file `INSTALL' explains the new scheme in detail.

* The header files no longer need to be processed into ANSI C and
  traditional C versions.  There is just one set of files to install, and
  it will work with ANSI or old C compilers (including `gcc -traditional').

* Brendan Kehoe and Ian Lance Taylor have ported the library to the
  MIPS DECStation running Ultrix 4.

* The Sun 4 startup code (crt0) can now properly load SunOS 4 shared libraries.
  Tom Quinn contributed the initial code.  The GNU C library can NOT yet be
  made itself into a shared library.

* Yet further improved support for the i386, running 4.3 BSD-like systems
  (such as Mach 3 with the Unix single-server), or System V.

* New function `strncasecmp' to do case-insensitive string comparison
  with limited length.

* New function `strsep' is a reentrant alternative to `strtok'.

* New functions `scandir' and `alphasort' for searching directories.

* New function `setenv' is a better interface to `putenv'.

* Ian Lance Taylor has contributed an implementation of the SVID `ftw'
  function for traversing a directory tree.

* The GNU obstack package is now also part of the C library.
  The new function `open_obstack_stream' creates a stdio stream that
  writes onto an obstack; `obstack_printf' and `obstack_vprintf' do
  formatted output directly to an obstack.

* Miscellaneous new functions: reboot, nice, sigaltstack (4.4 BSD only),
  cfmakeraw, getusershell, getpass, swab, getttyent, seteuid, setegid.

* `FNM_FILE_NAME' is another name for `FNM_PATHNAME', used with `fnmatch'.

* The new functions `strfry' and `memfrob' do mysterious and wonderful
  things to your strings.

* There are some new test programs: test-fseek, testmb, and testrand.

* Some work has been done to begin porting the library to 4.4 BSD and Linux.
  These ports are not finished, but are a good starting place for really
  supporting those systems.

* `/etc/localtime' is now the standard location for the file that says what
  the local timezone is, rather than `/usr/local/lib/zoneinfo/localtime'.
  This follows the general principle that `/etc' is the place for all local
  configuration files.

* The C library header files now use `extern "C"' when used by the C++
  compiler, so the C library should now work with C++ code.

* The header file <bstring.h> is gone.  <string.h> now declares bcopy,
  bcmp, bzero, and ffs.  (Update: nowadays these functions are declared
  in <strings.h>.)

* Mike Haertel (of GNU e?grep and malloc fame) has written a new sorting
  function which uses the `merge sort' algorithm, and is said to be
  significantly faster than the old GNU `qsort' function.  Merge sort is
  now the standard `qsort' function.  The new algorithm can require a lot
  of temporary storage; so, the old sorting function is called when the
  required storage is not available.

* The C library now includes Michael Glad's Ultra Fast Crypt, which
  provides the Unix `crypt' function, plus some other entry points.

* The code and header files taken from 4.4 BSD have been updated with the
  latest files released from Berkeley.

----------------------------------------------------------------------
Copyright information:

Copyright (C) 1992-1999,2000,2001,2002,2003,2004,2005,2006
	Free Software Foundation, Inc.

   Permission is granted to anyone to make or distribute verbatim copies
   of this document as received, in any medium, provided that the
   copyright notice and this permission notice are preserved,
   thus giving the recipient permission to redistribute in turn.

   Permission is granted to distribute modified versions
   of this document, or of portions of it,
   under the above conditions, provided also that they
   carry prominent notices stating who last changed them.

Local variables:
version-control: never
End:
