Previous Next Contents

2. Installation

2.1 Background

The aim of this conversion is to leave you with a system which can build and run both a.out and ELF programs, with each type of program being able to find its appropriate breed of shared libraries. This obviously requires a bit more intelligence in the library search routines than the simple `look in /lib, /usr/lib and anywhere else that the program was compiled to search' strategy that some other systems can get away with.

The beastie responsible for searching out libraries in linux is /lib/ld.so. The compiler and linker do not encode absolute library pathnames into the programs they output; instead they put the library name and the absolute path to ld.so in, and leave ld.so to match the library name to the appropriate place at runtime. This has one very important effect --- it means that the libraries that a program uses can be moved to other directories without recompiling the program, provided that ld.so is told to search the new directory. This is essential functionality for the directory swapping operation that follows.

The corollary of the above, of course, is that any attempt to delete or move ld.so will cause every dynamically linked program on the system to stop working. This is generally regarded as a Bad Thing.

For ELF binaries, an alternate dynamic loader is provided. This is /lib/ld-linux.so.1, and does exactly the same thing as ld.so, but for ELF programs. ld-linux.so.1 uses the same support files and programs (ldd, ldconfig, and /etc/ld.so.conf) as the a.out loader ld.so does.

The basic plan, then, is that ELF development things (compilers, include files and libraries) go into /usr/{bin,lib,include} where your a.out ones currently are, and the a.out things will be moved into /usr/i486-linuxaout/{bin, lib, include}. /etc/ld.so.conf lists all the places on the system where libraries are expected to be found, and ldconfig is intelligent enough to distinguish between ELF and a.out variants.

There are a couple of exceptions to the library placement, though.

2.2 Before you start --- Notes and Caveats

2.3 You will need ...

The following packages are available from ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ and ftp://sunsite.unc.edu/pub/Linux/GCC/. Both sites are widely mirrored; please take the time to look up your nearest mirror site and use that instead of the master sites where possible. It's faster for both you and everyone else.

These packages (either the listed version or a later one) are required. Also download and read through the release notes for each of them: these are the files named release.packagename. This applies especially if you get newer versions than are listed here, as procedures may have changed.

2.4 Rearranging your filesystem

Sooo... Note that in all that follows, when I say `remove' I naturally mean `backup then remove' :-). Also, these instructions directly apply only to people who haven't yet messed with ELF --- those who have are expected to have the necessary nous to adapt as appropriate. Let's go!

  1. Make the new directories that you will move a.out things to

    mkdir -p /usr/i486-linuxaout/bin
    mkdir -p /usr/i486-linuxaout/include
    mkdir -p /usr/i486-linuxaout/lib
    mkdir /lib-aout
    

  2. Untar the dynamic linker package ld.so-1.7.3 in the directory you usually put source code, then read through the ld.so-1.7.3/instldso.sh script just unpacked. If you have a really standard system, run it by doing sh instldso.sh, but if you have anything at all unusual then do the install by hand instead. `Anything at all unusual' includes
  3. Edit /etc/ld.so.conf to add the new directory /usr/i486-linuxaout/lib (and /lib-aout if you're going to need one). Then rerun /sbin/ldconfig -v to check that it is picking up the new directories.
  4. Move all the a.out libraries in /usr/*/lib to /usr/i486-linuxaout/lib. Note, I said `libraries' not `everything'. That's files matching the specification lib*.so* , lib*.sa*, or lib*.a. Don't start moving /usr/lib/gcc-lib or anything silly like that around.
  5. Now look at /lib. Leave intact libc.so*, libm.so*, and libdl.so*. If you have symlinks to X libraries (libX*.so.3*) leave them there too --- XView and some other packages may require them. Leave ld.so*, ld-linux.so* and any other files starting with ld. As for the remaining libraries (if you have any left): if you have /usr on the root partition, put them in /usr/i486-linuxaout/lib. If you have /usr mounted separately, put them in /lib-aout. Now run ldconfig -v
  6. Remove the directory /usr/lib/ldscripts if it's there, in preparation for installing the binutils (which will recreate it)
  7. Remove any copies of ld and as (except for ld86 and as86) that you can find in /usr/bin.
  8. Some versions of GNU tar appear to have problems dealing with symbolic links in the destination directory. You have two options here:
    1. (preferred) Use cpio instead of tar, it doesn't have this problem. zcat /wherever/you/put/it/libc-5.0.9.tar.gz | cpio -iv is the magic incantation here, to be executed from the root directory.
    2. (if you don't have cpio installed) Before installing the libc images you might want to go through /usr/include and remove some parts. This is icky. Many packages (such as ncurses) are installed into /usr/include by distribution maintainers and are not supplied with the C library. Backup the /usr/include tree, use tar tzf to see what's in the archive before untarring it, then delete the bits of /usr/include that it actually fills. Then untar the libc-5.0.9.bin.tar.gz package from root.
  9. Install the binutils package. tar -xvzf binutils-2.5.2.l17.bin.tar.gz -C / is one perfectly good way to do this.
  10. You have now installed everything you need to run ELF executables. Medical experts recommend that VDU workers take regular breaks away from the screen; this would be an opportune moment. Don't forget what you were doing, though; depending on the version of gcc you were previously using, you may have left yourself unable to compile programs in a.out until you unpack the new gcc.
  11. Backup and remove everything in /usr/lib/gcc-lib/{i486-linux, i486-linuxelf, i486-linuxaout}/ If you use a non-standard gcc driver (eg if you use Gnu ADA), copy that somewhere safe also. Then install the gcc package, again by untarring from root.
  12. Some programs (notably various X programs) use /lib/cpp, which under Linux is generally a link to /usr/lib/gcc-lib/i486-linux/version/cpp. As the preceding step wiped out whatever version of cpp it was pointing to, you'll need to recreate the link:
    $ cd /lib
    $ ln -s /usr/lib/gcc-lib/i486-linux/2.7.0/cpp .
    
  13. The FSSTND people have once again justified their keep by moving the utmp and wtmp files from /var/adm to /var/run and /var/log respectively. You'll need to add some links dependent on where they currently live, and you may need to make the /var/log and /var/adm directories too. I reproduce below the ls -l output of appropriate bits on my system:
    $ ls -ld /var/adm /var/log /var/run /var/log/*tmp /var/run/*tmp
    lrwxrwxrwx   1 root     root            3 May 24 05:53 /var/adm -> log/
    drwxr-xr-x   9 root     root         1024 Aug 13 23:17 /var/log/
    lrwxrwxrwx   1 root     root           11 Aug 13 23:17 /var/log/utmp -> ../run/utmp
    -rw-r--r--   1 root     root       451472 Aug 13 23:00 /var/log/wtmp
    drwxr-xr-x   2 root     root         1024 Aug 13 23:17 /var/run/
    -rw-r--r--   1 root     root          448 Aug 13 23:00 /var/run/utmp
    
    Check the FSSTND (from LDP archives such as ftp://sunsite.unc.edu/pub/Linux/docs/fsstnd/) for the full story.
  14. This step is optional. If you're intending to continue compiling programs in a.out, this is the appropriate time to install libc.so 4.7.x. Untar it from root, as you are now no doubt fully capable of doing without further explanation.

Done! Simple tests that you can try are


$ gcc -v
Reading specs from /usr/lib/gcc-lib/i486-linux/2.7.0/specs
gcc version 2.7.0
$ gcc -v -b i486-linuxaout
Reading specs from /usr/lib/gcc-lib/i486-linuxaout/2.7.0/specs
gcc version 2.7.0
$ ld -V
ld version cygnus/linux-2.5.2l.14 (with BFD cygnus/linux-2.5.2l.11)
  Supported emulations:
   elf_i386
   i386linux
   i386coff

followed of course by the traditional ``Hello, world'' program. Try it with gcc and with gcc -b i486-linuxaout to check that both the a.out and ELF compilers are set up corectly.

2.5 What it should look like (outline directory structure)

This is a deliberately vague guide to what the files you have just installed are. It may be useful for troubleshooting or deciding what to delete.

/lib

/usr/lib

/usr/lib/ldscripts

/usr/i486-linux/bin

/usr/i486-linuxaout/bin

/usr/i486-linux/lib

/usr/i486-linuxaout/lib

/usr/lib/gcc-lib/i486-linux/2.7.0

/usr/lib/gcc-lib/i486-linuxaout/2.7.0

2.6 Common errors (Don't Panic!)

... in large friendly letters.

You moved the wrong thing and now nothing runs

You still have a shell running, though, and with a little ingenuity you can do an awful lot with shell builtins. Remember that echo * is an acceptable substitute for ls, and echo >>filename can be used to add lines to a file. Also, don't forget that ldconfig is linked static. If you moved, say, libc.so.4 to /lib-aout mistakenly, you can do echo "lib-aout" >>/etc/ld.so.conf ; ldconfig -v/ and be back up again. If you moved /lib/ld.so you may be able to do sln /silly/place/ld.so /lib/ld.so, if you have a statically linked ln, and probably be back up again.

no such file or directory: /usr/bin/gcc

... when you know there is such a file. This usually means that the ELF dynamic loader /lib/ld-linux.so.1 is not installed, or is unreadable for some reason. You should have installed it at around step 2 previously.

not a ZMAGIC file, skipping

from ldconfig. You have an old version of the ld.so package, so get a recent one. Again, see step 2 of the installation.

bad address

on attempting to run anything ELF. You're using kernel 1.3.x, where x<3. Upgrade to 1.3.3 or downgrade to 1.2.something

_setutent: Can't open utmp file

This message is often seen in multiples of three when you start an xterm. Go and read the FSSTND tirade near the end of the installation procedure.

gcc: installation problem, cannot exec something: No such file or directory

when attempting to do a.out compilations (something is usually one of cpp or cc1). Either it's right, or alternatively you typed

$ gcc -b -i486-linuxaout

when you should have typed

$ gcc -b i486-linuxaout

Note that the `i486' does not start with a dash.


Previous Next Contents