Installing the GNU C Library
****************************

Before you do anything else, you should read the file `FAQ' located at
the top level of the source tree.  This file answers common questions
and describes problems you may experience with compilation and
installation.  It is updated more frequently than this manual.

   Features can be added to GNU Libc via "add-on" bundles.  These are
separate tar files, which you unpack into the top level of the source
tree.  Then you give `configure' the `--enable-add-ons' option to
activate them, and they will be compiled into the library.

   You will need recent versions of several GNU tools: definitely GCC
and GNU Make, and possibly others.  *Note Tools for Compilation::,
below.

Configuring and compiling GNU Libc
==================================

GNU libc cannot be compiled in the source directory.  You must build it
in a separate build directory.  For example, if you have unpacked the
glibc sources in `/src/gnu/glibc-2.4', create a directory
`/src/gnu/glibc-build' to put the object files in.  This allows
removing the whole build directory in case an error occurs, which is
the safest way to get a fresh start and should always be done.

   From your object directory, run the shell script `configure' located
at the top level of the source tree.  In the scenario above, you'd type

     $ ../glibc-2.4/configure ARGS...

   Please note that even though you're building in a separate build
directory, the compilation needs to modify a few files in the source
directory, especially some files in the manual subdirectory.

`configure' takes many options, but the only one that is usually
mandatory is `--prefix'.  This option tells `configure' where you want
glibc installed.  This defaults to `/usr/local', but the normal setting
to install as the standard system library is `--prefix=/usr' for
GNU/Linux systems and `--prefix=' (an empty prefix) for GNU/Hurd
systems.

   It may also be useful to set the CC and CFLAGS variables in the
environment when running `configure'.  CC selects the C compiler that
will be used, and CFLAGS sets optimization options for the compiler.

   The following list describes all of the available options for
`configure':

`--prefix=DIRECTORY'
     Install machine-independent data files in subdirectories of
     `DIRECTORY'.  The default is to install in `/usr/local'.

`--exec-prefix=DIRECTORY'
     Install the library and other machine-dependent files in
     subdirectories of `DIRECTORY'.  The default is to the `--prefix'
     directory if that option is specified, or `/usr/local' otherwise.

`--with-headers=DIRECTORY'
     Look for kernel header files in DIRECTORY, not `/usr/include'.
     Glibc needs information from the kernel's private header files.
     Glibc will normally look in `/usr/include' for them, but if you
     specify this option, it will look in DIRECTORY instead.

     This option is primarily of use on a system where the headers in
     `/usr/include' come from an older version of glibc.  Conflicts can
     occasionally happen in this case.  Note that Linux libc5 qualifies
     as an older version of glibc.  You can also use this option if you
     want to compile glibc with a newer set of kernel headers than the
     ones found in `/usr/include'.

`--enable-add-ons[=LIST]'
     Specify add-on packages to include in the build.  If this option is
     specified with no list, it enables all the add-on packages it
     finds in the main source directory; this is the default behavior.
     You may specify an explicit list of add-ons to use in LIST,
     separated by spaces or commas (if you use spaces, remember to
     quote them from the shell).  Each add-on in LIST can be an
     absolute directory name or can be a directory name relative to the
     main source directory, or relative to the build directory (that
     is, the current working directory).  For example,
     `--enable-add-ons=nptl,../glibc-libidn-2.4'.

`--enable-kernel=VERSION'
     This option is currently only useful on GNU/Linux systems.  The
     VERSION parameter should have the form X.Y.Z and describes the
     smallest version of the Linux kernel the generated library is
     expected to support.  The higher the VERSION number is, the less
     compatibility code is added, and the faster the code gets.

`--with-binutils=DIRECTORY'
     Use the binutils (assembler and linker) in `DIRECTORY', not the
     ones the C compiler would default to.  You can use this option if
     the default binutils on your system cannot deal with all the
     constructs in the GNU C library.  In that case, `configure' will
     detect the problem and suppress these constructs, so that the
     library will still be usable, but functionality may be lost--for
     example, you can't build a shared libc with old binutils.

`--without-fp'
     Use this option if your computer lacks hardware floating-point
     support and your operating system does not emulate an FPU.

     these

`--disable-shared'
     Don't build shared libraries even if it is possible.  Not all
     systems support shared libraries; you need ELF support and
     (currently) the GNU linker.

`--disable-profile'
     Don't build libraries with profiling information.  You may want to
     use this option if you don't plan to do profiling.

`--enable-omitfp'
     Use maximum optimization for the normal (static and shared)
     libraries, and compile separate static libraries with debugging
     information and no optimization.  We recommend not doing this.
     The extra optimization doesn't gain you much, it may provoke
     compiler bugs, and you won't be able to trace bugs through the C
     library.

`--disable-versioning'
     Don't compile the shared libraries with symbol version information.
     Doing this will make the resulting library incompatible with old
     binaries, so it's not recommended.

`--enable-static-nss'
     Compile static versions of the NSS (Name Service Switch) libraries.
     This is not recommended because it defeats the purpose of NSS; a
     program linked statically with the NSS libraries cannot be
     dynamically reconfigured to use a different name database.

`--without-tls'
     By default the C library is built with support for thread-local
     storage if the used tools support it.  By using `--without-tls'
     this can be prevented though there generally is no reason since it
     creates compatibility problems.

`--build=BUILD-SYSTEM'
`--host=HOST-SYSTEM'
     These options are for cross-compiling.  If you specify both
     options and BUILD-SYSTEM is different from HOST-SYSTEM, `configure'
     will prepare to cross-compile glibc from BUILD-SYSTEM to be used
     on HOST-SYSTEM.  You'll probably need the `--with-headers' option
     too, and you may have to override CONFIGURE's selection of the
     compiler and/or binutils.

     If you only specify `--host', `configure' will prepare for a
     native compile but use what you specify instead of guessing what
     your system is. This is most useful to change the CPU submodel.
     For example, if `configure' guesses your machine as
     `i586-pc-linux-gnu' but you want to compile a library for 386es,
     give `--host=i386-pc-linux-gnu' or just `--host=i386-linux' and add
     the appropriate compiler flags (`-mcpu=i386' will do the trick) to
     CFLAGS.

     If you specify just `--build', `configure' will get confused.

   To build the library and related programs, type `make'.  This will
produce a lot of output, some of which may look like errors from `make'
but isn't.  Look for error messages from `make' containing `***'.
Those indicate that something is seriously wrong.

   The compilation process can take a long time, depending on the
configuration and the speed of your machine.  Some complex modules may
take a very long time to compile, as much as several minutes on slower
machines.  Do not panic if the compiler appears to hang.

   If you want to run a parallel make, simply pass the `-j' option with
an appropriate numeric parameter to `make'.  You need a recent GNU
`make' version, though.

   To build and run test programs which exercise some of the library
facilities, type `make check'.  If it does not complete successfully,
do not use the built library, and report a bug after verifying that the
problem is not already known.  *Note Reporting Bugs::, for instructions
on reporting bugs.  Note that some of the tests assume they are not
being run by `root'.  We recommend you compile and test glibc as an
unprivileged user.

   Before reporting bugs make sure there is no problem with your system.
The tests (and later installation) use some pre-existing files of the
system such as `/etc/passwd', `/etc/nsswitch.conf' and others.  These
files must all contain correct and sensible content.

   To format the `GNU C Library Reference Manual' for printing, type
`make dvi'.  You need a working TeX installation to do this.  The
distribution already includes the on-line formatted version of the
manual, as Info files.  You can regenerate those with `make info', but
it shouldn't be necessary.

   The library has a number of special-purpose configuration parameters
which you can find in `Makeconfig'.  These can be overwritten with the
file `configparms'.  To change them, create a `configparms' in your
build directory and add values as appropriate for your system.  The
file is included and parsed by `make' and has to follow the conventions
for makefiles.

   It is easy to configure the GNU C library for cross-compilation by
setting a few variables in `configparms'.  Set `CC' to the
cross-compiler for the target you configured the library for; it is
important to use this same `CC' value when running `configure', like
this: `CC=TARGET-gcc configure TARGET'.  Set `BUILD_CC' to the compiler
to use for programs run on the build system as part of compiling the
library.  You may need to set `AR' and `RANLIB' to cross-compiling
versions of `ar' and `ranlib' if the native tools are not configured to
work with object files for the target you configured for.

Installing the C Library
========================

To install the library and its header files, and the Info files of the
manual, type `env LANGUAGE=C LC_ALL=C make install'.  This will build
things, if necessary, before installing them; however, you should still
compile everything first.  If you are installing glibc as your primary
C library, we recommend that you shut the system down to single-user
mode first, and reboot afterward.  This minimizes the risk of breaking
things when the library changes out from underneath.

   If you're upgrading from Linux libc5 or some other C library, you
need to replace the `/usr/include' with a fresh directory before
installing it.  The new `/usr/include' should contain the Linux
headers, but nothing else.

   You must first build the library (`make'), optionally check it
(`make check'), switch the include directories and then install (`make
install').  The steps must be done in this order.  Not moving the
directory before install will result in an unusable mixture of header
files from both libraries, but configuring, building, and checking the
library requires the ability to compile and run programs against the old
library.

   If you are upgrading from a previous installation of glibc 2.0 or
2.1, `make install' will do the entire job.  You do not need to remove
the old includes - if you want to do so anyway you must then follow the
order given above.

   You may also need to reconfigure GCC to work with the new library.
The easiest way to do that is to figure out the compiler switches to
make it work again (`-Wl,--dynamic-linker=/lib/ld-linux.so.2' should
work on GNU/Linux systems) and use them to recompile gcc.  You can also
edit the specs file (`/usr/lib/gcc-lib/TARGET/VERSION/specs'), but that
is a bit of a black art.

   You can install glibc somewhere other than where you configured it
to go by setting the `install_root' variable on the command line for
`make install'.  The value of this variable is prepended to all the
paths for installation.  This is useful when setting up a chroot
environment or preparing a binary distribution.  The directory should be
specified with an absolute file name.

   Glibc 2.2 includes a daemon called `nscd', which you may or may not
want to run.  `nscd' caches name service lookups; it can dramatically
improve performance with NIS+, and may help with DNS as well.

   One auxiliary program, `/usr/libexec/pt_chown', is installed setuid
`root'.  This program is invoked by the `grantpt' function; it sets the
permissions on a pseudoterminal so it can be used by the calling
process.  This means programs like `xterm' and `screen' do not have to
be setuid to get a pty.  (There may be other reasons why they need
privileges.)  If you are using a 2.1 or newer Linux kernel with the
`devptsfs' or `devfs' filesystems providing pty slaves, you don't need
this program; otherwise you do.  The source for `pt_chown' is in
`login/programs/pt_chown.c'.

   After installation you might want to configure the timezone and
locale installation of your system.  The GNU C library comes with a
locale database which gets configured with `localedef'.  For example, to
set up a German locale with name `de_DE', simply issue the command
`localedef -i de_DE -f ISO-8859-1 de_DE'.  To configure all locales
that are supported by glibc, you can issue from your build directory the
command `make localedata/install-locales'.

   To configure the locally used timezone, set the `TZ' environment
variable.  The script `tzselect' helps you to select the right value.
As an example, for Germany, `tzselect' would tell you to use
`TZ='Europe/Berlin''.  For a system wide installation (the given paths
are for an installation with `--prefix=/usr'), link the timezone file
which is in `/usr/share/zoneinfo' to the file `/etc/localtime'.  For
Germany, you might execute `ln -s /usr/share/zoneinfo/Europe/Berlin
/etc/localtime'.

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

We recommend installing the following GNU tools before attempting to
build the GNU C library:

   * GNU `make' 3.79 or newer

     You need the latest version of GNU `make'.  Modifying the GNU C
     Library to work with other `make' programs would be so difficult
     that we recommend you port GNU `make' instead.  *Really.*  We
     recommend GNU `make' version 3.79.  All earlier versions have
     severe bugs or lack features.

   * GCC 3.4 or newer, GCC 4.1 recommended

     For the 2.4 release or later, GCC 3.4 or higher is required; as of
     this writing, GCC 4.4 is the compiler we advise to use for current
     versions.  On certain machines including `powerpc64', compilers
     prior to GCC 4.0 have bugs that prevent them compiling the C
     library code in the 2.4 release.  On other machines, GCC 4.1 is
     required to build the C library with support for the correct `long
     double' type format; these include `powerpc' (32 bit), `s390' and
     `s390x'.  For other architectures special compiler-provided
     headers are needed (like `cpuid.h' on x86) which only come with
     later compiler versions.

     You can use whatever compiler you like to compile programs that
     use GNU libc, but be aware that both GCC 2.7 and 2.8 have bugs in
     their floating-point support that may be triggered by the math
     library.

     Check the FAQ for any special compiler issues on particular
     platforms.

   * GNU `binutils'

     You must use GNU `binutils' (as and ld) to build the GNU C library.
     No other assembler or linker has the necessary functionality at the
     moment.  The configure scripts checks for the appropriate version
     for the platform.  Too-old versions will prevent building glibc.

   * GNU `texinfo' 3.12f

     To correctly translate and install the Texinfo documentation you
     need this version of the `texinfo' package.  Earlier versions do
     not understand all the tags used in the document, and the
     installation mechanism for the info files is not present or works
     differently.

   * GNU `awk' 3.0, or higher

     `Awk' is used in several places to generate files.  `gawk' 3.0 is
     known to work.

   * Perl 5

     Perl is not required, but it is used if present to test the
     installation.  We may decide to use it elsewhere in the future.

   * GNU `sed' 3.02 or newer

     `Sed' is used in several places to generate files.  Most scripts
     work with any version of `sed'.  The known exception is the script
     `po2test.sed' in the `intl' subdirectory which is used to generate
     `msgs.h' for the test suite.  This script works correctly only
     with GNU `sed' 3.02.  If you like to run the test suite, you
     should definitely upgrade `sed'.


If you change any of the `configure.in' files you will also need

   * GNU `autoconf' 2.53 or higher

and if you change any of the message translation files you will need

   * GNU `gettext' 0.10.36 or later

You may also need these packages if you upgrade your source tree using
patches, although we try to avoid this.

Specific advice for GNU/Linux systems
=====================================

If you are installing GNU libc on a GNU/Linux system, you need to have
the header files from a 2.2 or newer kernel around for reference.  For
some architectures, like ia64, sh and hppa, you need at least headers
from kernel 2.3.99 (sh and hppa) or 2.4.0 (ia64).  You do not need to
use that kernel, just have its headers where glibc can access at them.
The easiest way to do this is to unpack it in a directory such as
`/usr/src/linux-2.2.1'.  In that directory, run `make config' and
accept all the defaults.  Then run `make include/linux/version.h'.
Finally, configure glibc with the option
`--with-headers=/usr/src/linux-2.2.1/include'.  Use the most recent
kernel you can get your hands on.

   An alternate tactic is to unpack the 2.2 kernel and run `make
config' as above; then, rename or delete `/usr/include', create a new
`/usr/include', and make symbolic links of `/usr/include/linux' and
`/usr/include/asm' into the kernel sources.  You can then configure
glibc with no special options.  This tactic is recommended if you are
upgrading from libc5, since you need to get rid of the old header files
anyway.

   After installing GNU libc, you may need to remove or rename
`/usr/include/linux' and `/usr/include/asm', and replace them with
copies of `include/linux' and `include/asm-$ARCHITECTURE' taken from
the Linux source package which supplied kernel headers for building the
library.  ARCHITECTURE will be the machine architecture for which the
library was built, such as `i386' or `alpha'.  You do not need to do
this if you did not specify an alternate kernel header source using
`--with-headers'.  The intent here is that these directories should be
copies of, *not* symlinks to, the kernel headers used to build the
library.

   Note that `/usr/include/net' and `/usr/include/scsi' should *not* be
symlinks into the kernel sources.  GNU libc provides its own versions
of these files.

   GNU/Linux expects some components of the libc installation to be in
`/lib' and some in `/usr/lib'.  This is handled automatically if you
configure glibc with `--prefix=/usr'.  If you set some other prefix or
allow it to default to `/usr/local', then all the components are
installed there.

   If you are upgrading from libc5, you need to recompile every shared
library on your system against the new library for the sake of new code,
but keep the old libraries around for old binaries to use.  This is
complicated and difficult.  Consult the Glibc2 HOWTO at
`http://www.imaxx.net/~thrytis/glibc' for details.

   You cannot use `nscd' with 2.0 kernels, due to bugs in the
kernel-side thread support.  `nscd' happens to hit these bugs
particularly hard, but you might have problems with any threaded
program.

Reporting Bugs
==============

There are probably bugs in the GNU C library.  There are certainly
errors and omissions in this manual.  If you report them, they will get
fixed.  If you don't, no one will ever know about them and they will
remain unfixed for all eternity, if not longer.

   It is a good idea to verify that the problem has not already been
reported.  Bugs are documented in two places: The file `BUGS' describes
a number of well known bugs and the bug tracking system has a WWW
interface at `http://sources.redhat.com/bugzilla/'.  The WWW interface
gives you access to open and closed reports.  A closed report normally
includes a patch or a hint on solving the problem.

   To report a bug, first you must find it.  With any luck, this will
be the hard part.  Once you've found a bug, make sure it's really a
bug.  A good way to do this is to see if the GNU C library behaves the
same way some other C library does.  If so, probably you are wrong and
the libraries are right (but not necessarily).  If not, one of the
libraries is probably wrong.  It might not be the GNU library.  Many
historical Unix C libraries permit things that we don't, such as
closing a file twice.

   If you think you have found some way in which the GNU C library does
not conform to the ISO and POSIX standards (*note Standards and
Portability::), that is definitely a bug.  Report it!

   Once you're sure you've found a bug, try to narrow it down to the
smallest test case that reproduces the problem.  In the case of a C
library, you really only need to narrow it down to one library function
call, if possible.  This should not be too difficult.

   The final step when you have a simple test case is to report the bug.
Do this using the WWW interface to the bug database.

   If you are not sure how a function should behave, and this manual
doesn't tell you, that's a bug in the manual.  Report that too!  If the
function's behavior disagrees with the manual, then either the library
or the manual has a bug, so report the disagreement.  If you find any
errors or omissions in this manual, please report them to the bug
database.  If you refer to specific sections of the manual, please
include the section names for easier identification.
