Glibc Installation HOWTO

Kai Schlachter


<linux (at) murphyslantech.de>
      

2004-03-19
Revision History                                                             
Revision 1.01            2004-03-19            Revised by: KC                
Initial Release, reviewed by LDP                                             
-----------------------------------------------------------------------------

Table of Contents
1. Preface
    1.1. Copyright
    1.2. Revision History
    1.3. Thanks
   
   
2. Introduction
    2.1. Why?
    2.2. What?
   
   
3. Preparations
    3.1. Stuff you will need
    3.2. Special things you need to do
   
   
4. The installation of glibc itself
    4.1. Obtaining and compiling the source
    4.2. The installation
    4.3. After the kernel is booted...
   
   
5. Troubleshooting??if something goes wrong...
    5.1. Errors with configure or make while trying to compile glibc
    5.2. Something goes wrong during make install
   
   

-----------------------------------------------------------------------------
Chapter 1. Preface

1.1. Copyright

Copyright (c) 2004 by Kai Schlachter

Permission is granted to copy, distribute and/or modify this document under
the terms of the GNU Free Documentation License, Version 1.2 or any later
version published by the Free Software Foundation; with no Invariant
Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the
license is located at [http://www.gnu.org/licenses/fdl.html] http://
www.gnu.org/licenses/fdl.html.
-----------------------------------------------------------------------------

1.2. Revision History

 

  * v1.01: Fixed some missplaced quotation marks
   

-----------------------------------------------------------------------------
1.3. Thanks

I especially want to thank Nico Schmoigl for helping me get my crashed system
back up after I ran make install for glibc while my system was still fully
running. This was the main reason I wrote this mini-HOWTO.

Thanks also go to all the other people who helped me along the way; getting
the HOWTO in correct format, finding all the typos, etc.
-----------------------------------------------------------------------------

Chapter 2. Introduction

In this HOWTO I will explain how you install a new version of glibc on your
system.

I wrote this manual because I want to save others from the problems I
encountered.

This HOWTO is a kind of guideline, made up from settings and ways of doing
things that worked out for me. No liability for the contents of this document
can be accepted. Use the concepts, examples and other content at your own
risk. You are strongly recommended to make a backup of your system before
major installations and backups at regular intervals.

If you have any suggestions, found another bug in some distribution and how
to fix it, please let me know by writing me an e-mail: <
linux_at_murphyslantech.de>.
-----------------------------------------------------------------------------

2.1. Why?

 Yes, that's a good question. Why would you need to install a new glibc?
Well, there are several reasons:

  * you are a developer and you need the new functions of the library
   
  * you wanted to compile a new program that needs the new library
   
  * you like the thrill of errors and bugs in new versions ;-)
   

-----------------------------------------------------------------------------
2.2. What?

 If you do not know what glibc is by now, don't worry! When I first had
problems with a new program I wanted to compile, I only knew that my version
of glibc was not sufficient for the compile. Now that I know more, I will try
to explain in a very simple way what glibc does.

The glibc package contains a library written in the programming language of
C. Libraries are a very useful thing in programming; instead of inventing the
wheel from scratch for operations such as computing the square-root of a
number, such common functions are stored in separate files??the so-called
libraries. When a new version of a library is published it often contains
some new functions, uses more efficient algorithms for already implemented
functions, and so on.

This is the reason why some programs complain about an older version of
glibc: the current version just does not contain all the functions the
program needs in order to run.

I know this is not technically correct in all detail, but it gives you a
basic understanding of the architecture behind.
-----------------------------------------------------------------------------

Chapter 3. Preparations

 As an installation of glibc is not an easy task. You need to do a lot of
things in advance, especially in the event that something goes wrong. (That
is what happened to me on my first glibc install, and I did not make any
preparations.)
-----------------------------------------------------------------------------

3.1. Stuff you will need

Basically, you need two different things: software that is already running on
your machine (eg., pre-installed by your distribution) and packages of
source-code for different programs.
-----------------------------------------------------------------------------

3.1.1. Software you will need

 

  * a running gcc
   
  * an older version of glibc ;-)
   
  * GNU-binutils
   
  * GNU-make
   
  * the GNU-core-utils
   
  * GNU-tar
   
  * bash or any shell you prefer
   
  * very useful but not a must: Midnight Commander
   
  * an editor you like (vi, jed, etc.)
   

-----------------------------------------------------------------------------
3.1.2. Sources you will need

 

  * bashor the shell you like
   
  * GNU-tar
   
  * GNU-core-utils
   
  * GNU-make
   
  * of course:glibc
   
  * possibly: gcc
   

-----------------------------------------------------------------------------
3.2. Special things you need to do

Since you are going to substitute the basic library many programs rely on,
you can imagine the problems that may occur.

For me, it so happened that everything went fine until I typed in make
install. At about halfway through the installation process I got an error
telling me that rm was not able to run, and I found out that even all the
common commands like cp, ls, mv, ln, tar, etc., did not work; all told me
that they were not able to find parts of the library they needed.

But there is help available. You can force the compilation of programs with
the libraries compiled into them, so the programs do not need to look them up
from the library.

For that reason, in this chapter, we will compile all the utilities we need
for the install into a static version.
-----------------------------------------------------------------------------

3.2.1. Things you will definitely need

3.2.1.1. The GNU-Binutils

 

 1. Get the newest version from: [ftp.gnu.org/gnu/binutils] ftp.gnu.org/gnu/
    binutils; at the time of writing, this was version 2.14
   
 2. Open the package:
    tar xIvf binutils-2.14.tar.bz2                                           
   
 3. Change to the directory:
    cd binutils-2.14                                                         
   
 4. Configure the Makefiles:
    ./configure                                                              
   
 5. Compile the sources:
    make                                                                     
   
 6. Install them with:
    make install                                                             
   

 If you run into trouble with the compilation of the binutils, referring to
problems with gettext (indicated by errors like: "undeclared reference to
lib_intl" or similar) please install the newest version, available from
[ftp.gnu.org/gnu/gettext] ftp.gnu.org/gnu/gettext.

If this does not help, try disabling the native-language support by using:
./configure --no-nls                                                         

You don't need to build a static version of the binutils, though it would not
hurt, but I encountered many systems running with very old versions and ran
into errors almost every time, so I think it is a good idea to mention them
here.
-----------------------------------------------------------------------------

3.2.1.2. GNU make

The make command is responsible for the compiling of the sources, calling gcc
and all the other programs needed for a compile. Since you may need to
compile something if a problem occurs with the new glibc, it is a good idea
to have it static, otherwise it might not work after an error appears.

 

 1. Download the source from [ftp.gnu.org/gnu/make/] ftp.gnu.org/gnu/make/;
    at the time of writing the current version was 3.80
   
 2. Unpack the source, eg.:
    tar xIvf make-3.80.tar.bz2                                               
   
 3. Change to the created directory:
    cd make-3.80                                                             
   
 4. Take care that the binaries are built static:
    export CFLAGS="-static -O2 -g"                                           
   
 5. Run the configure script:
    ./configure                                                              
   
 6. Compile the stuff:
    make                                                                     
   
 7. Install the binaries:
    make install                                                             
   
 8. Make a check:
    make -v                                                                  
    You should now see the new version installed. If not, check for older
    binary files and replace them by smlinks to the new version.
   

 Congratulations! You have compiled another static-linked program.
-----------------------------------------------------------------------------

3.2.1.3. the GNU core-utils

The core-utils are commands like: cp, rm, ln, mv, etc. In case of an error in
the installation, these are an absolute requirement to help bring your system
up again, so static binaries are really necessary here.

 

 1. Again, download the source tarball from: [ftp.gnu.org/gnu/coreutils/]
    ftp.gnu.org/gnu/coreutils/; at the time of writing, version 5.0 was
    current.
   
 2. Unpack it:
    tar xIvf coreutils-5.0.tar.bz2                                           
   
 3. Change to the directory:
    cd coreutils-5.0                                                         
   
 4. Take care that the binaries are built static:
    export CFLAGS="-static -O2 -g"                                           
   
 5. Configure the package:
    ./configure                                                              
   
 6. Compile the binaries:
    make                                                                     
   
 7. And install them:
    make install                                                             
   
 8. Verify that the right core-utils are used:
    cp --version                                                             
    . You should see the correct version, otherwise remove any old binaries
    and replace them with symlinks to the new version.
   

 Now that the binaries of these very elementary tools are static, you can be
sure they will work every time you need them.
-----------------------------------------------------------------------------

3.2.1.4. GNU tar

You have already used GNU tar to unpack all the programs compiled and
installed so far. But maybe you need to compile another program which is
needed by glibc after you had a crash, and in this situation (I experienced
this myself!) it is very useful to have a working tar ready to unpack the
missing programs. With tar, we also need to take care of the bz2 compression
algorithm, which is not included in the normal source distribution of tar.

 

 1. Get the source of GNU tar from [ftp.gnu.org/gnu/tar] ftp.gnu.org/gnu/tar;
    at the time of writing, version 1.13 was up-to-date.
   
 2. As many source tarballs are compressed with bzip2, we would like to have
    the support built in, rather than working with pipes, so get the patch
    from: [ftp://infogroep.be/pub/linux/lfs/lfs-packages/4.1/tar-1.13.patch]
    ftp://infogroep.be/pub/linux/lfs/lfs-packages/4.1/tar-1.13.patch.
   
 3. Unpack the source by invoking:
    tar xzvf tar-1.13.tar.gz                                                 
   
 4. Copy the patch to the source directory of tar:
    cp tar-1.13.patch tar-1.13/                                              
   
 5. Apply the patch:
    patch -Np1 -i tar-1.13.patch                                             
   
 6. Set the compiler flags to make a static binary:
    export CFLAGS="-static -O2 -g"                                           
   
 7. Now we are ready to configure:
    ./configure                                                              
   
 8. Compile with:
    make                                                                     
   
 9. And as the next step, install the package:
    make install                                                             
   
10. Do a quick check to ensure the new version is being used from now on:
    tar --version                                                            
    The version you just installed should display, otherwise check for old
    binaries and replace them with symlinks to the new location.
   

If you experience problems with the execution of make, try to turn off
native-language support (nls). You may achieve this by invoking configure
with the option:
--disable-nls                                                                

Note: In this new version of tar, you must use the -j switch to decompress
.bzip2 files, so instead of
tar xIvf anyfile.tar.bz2                                                     
you now have to use
tar xjvf anyfile.tar.bz2                                                     
I do not know why this was changed, but it works fine.
-----------------------------------------------------------------------------

3.2.1.5. The Bash shell

 I prefer Bash as my shell; if you use a different one, please be sure you
have installed a static version of it before you install glibc.

 

 1. Get Bash from: [ftp.gnu.org/gnu/bash/] ftp.gnu.org/gnu/bash/. Download
    the newest version you can find; at the time of writing this was version
    2.05b.
   
 2. Unpack the source tree:
    tar xzvf bash-2.05b.tar.gz                                               
    which will create a directory called bash-2.05b with all the unpacked
    sources in it.
   
 3. Go to the directory:
    cd bash-2.05a                                                            
   
 4. Set everything up for building a static version:
    export CFLAGS="-static -O2 -g"                                           
   
 5. Configure the makefiles:
    ./configure                                                              
    If you would like something special in your Bash, see
    ./configure --help                                                       
    for a list of options.
   
 6. Compile everything:
    make                                                                     
   
 7. Install the compiled binaries:
    make install                                                             
    This will install the binaries to /usr/local/bin/.
   
 8. Make sure there is not another version laying around (like in my
    Suse-Linux: /bin/), by copying the file:
    cp /usr/local/bin/bash /bin/                                             
    We don't use a symlink here because both at boot-time and when starting
    Bash there might be trouble with symlinks.
   

You now have installed a static version of Bash. For that reason, the binary
is much bigger than usual, but it will run under all circumstances.

 If you prefer to use another shell, you are free to do so, but make sure it
is a statically-linked version. Feel free to email me a method to build the
shell of your choice in a static version, and chances are good that it will
be implemented in the next revision of this document.
-----------------------------------------------------------------------------

3.2.2. Software that may come in handy

3.2.2.1. Midnight Commander

 Midnight Commander is a very useful file manager, supporting many nice
features like transparent decompression of packed files, built-in copy, move
and other common commands, as well as an integrated editor.

To compile this piece of software, you will need to have glib installed; in
some distributions this is already the case. If you get an error in the make
command saying that ld could not find glib, you will need to install this
library first. You can get the sources from: [ftp.gnome.org/pub/gnome/sources
/glib/2.2/] ftp.gnome.org/pub/gnome/sources/glib/2.2/, and the installation
is straight-forward.

Here are the steps to build Midnight Commander:

 

 1. Get the source from [http://www.ibiblio.org/pub/Linux/utils/file/managers
    /mc/] http://www.ibiblio.org/pub/Linux/utils/file/managers/mc/"; at the
    time of writing, the newest version was 4.6.0.
   
 2. Unpack the sources:
    tar xzvf mc-4.6.0.tar.gz                                                 
   
 3. Change to the directory you just created:
    cd mc-4.6.0                                                              
   
 4. Set up the configuration-files:
    ./configure                                                              
   
 5. Start compiling:
    make                                                                     
   
 6. Install everything:
    make install                                                             
   

-----------------------------------------------------------------------------
Chapter 4. The installation of glibc itself

Now we come to the most important thing: the glibc install.
-----------------------------------------------------------------------------

4.1. Obtaining and compiling the source

There are several versions of glibc available, but not in all cases are new
versions really better than the old ones. The best thing you can do to find
out which works and which ones you should not use is to check out the
different forums on the Internet. If you have someone to ask, talk to him
about the topic. Maybe he already has installed the new version and might be
able to tell you that version x.y.z is a PITA, but version a.b.c works really
well!

I decided to install glibc-2.2.4, as I was told it works well, but it is your
decision which one to choose.

Ok, now let's go to work:

 1. Get the source from [ftp.gnu.org/gnu/glibc/] ftp.gnu.org/gnu/glibc/; as I
    said, I used version 2.2.4.
   
 2. Unpack the source:
    tar -xzvf glibc-2.2.4.tar.gz                                             
   
 3. In addition, you will need a package called "linuxthreads," found in the
    linuxthreads directory on [ftp.gnu.org] ftp.gnu.org. The file is called:
    glibc-linuxthreads-2.2.4.tar.gz                                          
    Make sure you get the version that corresponds to your glibc source tree.
   
 4. Copy the linuxthreads package to your glibc source directory:
    cp glibc-linuxthreads-2.2.4.tar.gz glibc-2.2.4                           
   
 5. Change to the glibc directory:
    cd glibc-2.2.4                                                           
   
 6. Unpack linuxthreads:
    tar xzvf linux-threads-2.2.4.tar.gz                                      
   
 7. Configure the package:
    ./configure --enable-add-ons=linuxthreads                                
    This will configure the package in such a way that the linuxthreads are
    included in the compile; this is necessary for compliance with other
    Linux systems. For example, programs you compile will probably not run on
    another machine if you forget to include this package.
   
 8. Afterwards, start the compilation of glibc:
    make                                                                     
    This may take some time (about half an hour on my Duron XP, running with
    1.5 GHz).
   

 Now that the library is compiled, everything is ready for the installation,
but things are not as easy this time.
-----------------------------------------------------------------------------

4.2. The installation

 To install glibc you need a system with nothing running on it, since many
processes (for example sendmail) always try to use the library and therefore
block the files from being replaced. Therefore we need a "naked" system,
running nothing except the things we absolutely need. You can achieve this by
passing the boot option
init=/bin/bash                                                               
to your kernel. Depending on your bootloader you may need to do different
things. In the following I will explain this using the two most common
bootloaders, LILO (LInux-LOader) and GNU grub, as examples.
-----------------------------------------------------------------------------

4.2.1. LILO

To start the "only-basics" system, reboot your computer and at the LILO
prompt enter the kernel image-name you like to load and append
init=/bin/bash                                                               
to it before pressing Return. If you are planing to replace your glibc more
often, it might be a good idea to add a separate configuration to your /etc/
lilo.conf. For details, refer to the man-page of LILO.
-----------------------------------------------------------------------------

4.2.2. Grub

Grub is a newer bootloader, with enhanced support for different operating
systems and and file system types (eg. it supports booting from reiserfs
partitions). If you would like to know more go to: [http://www.gnu.org/
software/grub/] http://www.gnu.org/software/grub/, where you will find all
the stuff you need.

If you already have Grub installed, you probably use the text-based front-end
to select the kernel you prefer to boot. Grub has a nice feature??instead of
returning to doing everything by hand, you can simply select your entry and
type e, which will bring up an option menu. In this menu you will see the
commands Grub executes prior to booting the kernel. Simply select the line
saying
kernel="/where/your-kernel-is and-options-are"                               
and press e again. Now you can edit this line. Here you just add
init=/bin/bash                                                               
and after pressing Return to make the changes take effect, press b to start
booting.
-----------------------------------------------------------------------------

4.3. After the kernel is booted...

 ...You will find yourself in an absolute minimal bash-environment.

You will not even be asked to enter your username or password! At this time
you are the ultimate super-user; no-one can get around you because the system
is in single-user mode, so be careful what you are doing. There are no
file-rights set or anything else!

Your prompt will probably look like this:
init-x.y#                                                                    
At this moment your root (/) has been mounted as read-only, thus you will not
be able to write the new library to your hard drive. To make it r/w, enter
the command:
mount -o remount,rw /                                                        
If your source is located on another partition you must also mount it, as it
is not done for you (for me this means mounting my raid system):
mount -t reiserfs /dev/md0 /usr/src                                          
As you see, I defined the file system type, which is needed because mount
does not look anything up in /etc/fstab.

Now you can go to the directory containing the source and type in:
make install                                                                 

If you like, now might be a good time to pray that everything works out
fine... ;-)

If everything went through properly, you will return to your prompt after the
installation without any error message. In all other cases, please see 
Chapter 5.

If everything goes fine, run:
ldconfig -v                                                                  
to update your library cache.

Congratulations! The library is successfully installed. Now type in: mount -o
remount,ro / to ensure that all the data is written to the hard drive.

Now start the reboot:
exit                                                                         
This will cause an error message saying that you have caused a kernel-panic.
If possible, restart the computer by using CTRL-ALT-DEL, otherwise use your
hardware's reset switch.

Try booting your normal kernel. If everything turns out fine, you are ready
to use the new library.
-----------------------------------------------------------------------------

Chapter 5. Troubleshooting??if something goes wrong...

If you come to this section and you have followed all the instructions above,
you probably encountered the problem of different Linux distributions, some
of which do not keep stuff where it should normally be, but somewhere else.
The Suse Linux distributions are most famous for such stupid quirks, but
there may be others having similar problems. If you encounter such a thing
and you find the cause for the trouble??and hopefully a solution??please let
me know and I will add this to my HOWTO.

I think this section will never really be complete, but I will list some
possible errors and solutions for these issues.
-----------------------------------------------------------------------------

5.1. Errors with configure or make while trying to compile glibc

Sometimes you get configuration error telling you that, for example, a
requirement is not met??typical for software or other library-packages which
are to old. I encountered this with a series of programs, especially during
the compile of all the static software. Normally there should be no problem:
get an up-to-date version of the software or libraries needed and then
compile them according to the description found in the source tree (usually
called README, INSTALL or something similar).

But there are sometimes cases where this just does not want to work. For
example, I experienced problems compiling a new version of my binutils (one
of the reasons why I mention them in the requirements), as I needed to
compile glibc. In return, the configure script for the binutils told me, 
"Your glibc is to old!" So I thought, Here the snake starts eating its tail.
Thankfully there is a solution for this problem: if you can not take one big
step, try taking smaller ones, but more of them.

In my distribution, a glibc with the version number 2.1.1 was included. To
get around the error I tried to compile version 2.1.3, which was no problem.
After I installed this version of the library, I tried to compile the
binutils once more, and this time all the requirements were met.

If you encounter such a "loop," try to find out what version of the software
required is the minimum, then download that version (I think that is one of
the reasons why so many old versions are still lying around on the FTP
servers). After successfully compiling and installing, try to build the
software that complained about the version again; in most cases you should
now be able to compile. It may be necessary that you continue to use this
method to compile missing or old software. This is what I call "the long tail
of the rat" or "domino-effect." You only wanted to do one thing, but you
needed to do many more before you could make the move you wanted to. It might
be very nasty, but there is one good side to it: afterwards you can be quite
sure that many of the programs which were really old will replaced by the
time you finish your installation.
-----------------------------------------------------------------------------

5.2. Something goes wrong during make install

The most common mistake is not to have a set of basic, static tools; in this
case you can only use the command cd, but nothing else. This is the reason
why in this HOWTO I have described in detail how to make those tools static.

The only tool not static is mount and, for good reason in my opinion, it is
included in the package of linux-utils, which also contains login, passwd,
etc. Since you are not able to use statically-linked versions in combination
with PAM or other security-related software, it would be unwise to compile
them statically under all circumstances. Of course you are free to do so if
you are really sure about what you are doing.
-----------------------------------------------------------------------------

5.2.1. Going back to a working configuration

The way back to a working configuration is quite simple if you have the
static tools: go to the directory /usr/local/lib/ and move all the newly
installed files into another location (eg. /usr/local/lib/storedaway). You
may identify them by looking at their version number, which should be the
same as the one from your glibc installation (in my example all files fitted
to the scheme lib*-2.2.4), and of course by the creation date and time. It is
quite uncommon that two different libraries have the same version number at
the same time??I, myself, have never experienced such a thing??but just to be
sure you do not delete something important to your system, check the date and
time of creation. A very useful tool in this case is the Midnight Commander,
if you have it installed.

You could try to remove the files ld-2.2.4.so and libc-2.2.4.so and run 
ldconfig -v afterwards, before removing all the crashed files. This will
enable you to use at least most of your programs and in every case you will
be able to run the Midnight Commander.

Do not forget to do at least one ldconfig -v after you have removed all the
files.
-----------------------------------------------------------------------------

5.2.1.1. Removing the causes for the crashing of the installation

A common cause for problems is that your distribution has stored all the
library files in a different location than the newly-installed routine will
use, thus it often happens that there are two versions running
simultaneously, disturbing each other. In my case, lots of trouble was caused
by a second copy of libc6.so lying around in /lib, a symbolic link from this
file to the corresponding one in /usr/local/lib fixes this problem.
