2. Installation

Contenu de cette section

2.1 Prérequis

Le but de cette mise à jour est de vous fournir un système qui puisse compiler et exécuter aussi bien les programmes basés sur a.out que ELF, en s'assurant que chaque type de programme soit capable de trouver la version appropriée des bibliothèques partagées. Il apparaît aisément que cela demande plus de travail que simplement chercher dans /lib, dans /usr/lib ou n'importe où ailleurs selon le chemin de recherche indiqué dans la compilation, stratégie dont certains autres systèmes se satisfont.

Le travail nécessaire est centralisé au niveau d'un chargeur dynamique qui existe en un seul, ou deux, endroit du système. Pour les programmes a.out, il est appelé /lib/ld.so et, pour les programmes ELF, on fait appel à /lib/ld-linux.so.1. Le compilateur et l'éditeur de liens n'encodent pas les chemins absolus des librairies dans les programmes qu'ils produisent ; ils fournissent en effet le nom de la librairie et son chemin absolu au chargeur dynamique approprié et se contentent de ça pour apparier le nom de la bibliothèque au chemin correspondant lors de l'exécution. Cela a une conséquence d'importance : les bibliothèques peuvent être déplacées dans d'autres répertoires sans recompiler le programme dès lors que ld.so (ou ld-linux.so.1 selon le cas) a été informé de chercher dans le nouveau répert! ! ! ! ! ! oire. C'est une fonctionnalité essentielle pour l'échange de répertoires qui va suivre.

Le corollaire de ce qui précède est bien sûr que toute tentative d'effacer ou de déplacer ld.so ou ld-linux.so.1 pourrait provoquer le plantage de tout programme dynamiquement lié sur le système. C'est généralement vu comme une Mauvaise Chose.

Le schéma général est alors de mettre tout ce qui concerne le développement ELF (compilateurs, bibliothèques et fichiers d'inclusions) dans /usr/{bin,lib,include} et de mettre ce qui concerne a.out dans /usr/i486-linuxaout/{bin, lib, include}. Le fichier /etc/ld.so.conf est la liste de tous les endroits du système où l'on s'attend à trouver les bibliothèques et ldconfig est suffisamment malin pour distinguer les versions ELF des versions a.out.

Il y a néanmoins quelques exceptions quant au placement de la bibliothèque :

2.2 Avant de commencer : notes et mises en gardes

2.3 Notions

Tout ce qui est décrit ci-après par "sur tsx-11" peut être trouvé à ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ , ftp://sunsite.unc.edu/pub/Linux/GCC/ , et d'autres sites miroir (NdT: comme ftp://ftp.lip6.fr/pub/linux/ pour la France). Veuillez consulter le site miroir le plus proche de chez vous plutôt que les sites généraux dès que cela est possible. Cela ira plus vite, pour vous et pour les autres.

Ces paquetages (que ce soit la version listée ou une plus récente) sont requis. Pensez également à télécharger les notes concernant votre version pour chacun d'entre eux: elles sont de la forme release.nom_du_paquetage. Cela est particulièrement vrai pour les versions plus récentes que celles présentées ici (l'installation a pu changer).

Même si vous avez pour habitude de compiler à partir des sources, je vous recommande de prendre les versions binaires quand je l'indique à moins que vous n'ayez réellement plus besoin de vos cheveux. La plupart d'entre eux ne sont pas prévus pour la compilation sur un système mixte et vous vous exposez à de graves ennuis si vous essayez.

Les essentiels

Autres

Il y a d'autres bibliothèques et fichiers qui ne sont pas essentiels mais que vous voudrez probablement avoir de toute façon. Cette liste comporte seulement des paquetages qui nécessitent d'être mis à jour pour fonctionner de manière utile vis-à-vis d'ELF. Plus loin dans ce document, une nouvelle liste indique les programmes qui continueront à fonctionner mais qu'il vous faudra mettre à jour pour les recompiler en ELF.

2.4 Réarrangement de votre système de fichiers.

Bien! Pour la suite, veuillez noter que quand j'écris "effacer", je veux dire "sauvegarder puis effacer" :-). Une bonne inspiration et on y va...

  1. primordial --- installation des exécutables

  2. Créez les nouveaux répertoires dans lesquels vous allez déplacer ce qui concerne a.out
    mkdir -p /usr/i486-linuxaout/bin
    mkdir -p /usr/i486-linuxaout/include
    mkdir -p /usr/i486-linuxaout/lib
    mkdir /lib-aout
    
  3. Détarrez le paquetage de l'éditeur de liens dynamique ld.so-1.7.14 dans le répertoire dans lequel vous mettez habituellement le code source et lisez de suite le script ld.so-1.7.14/instldso.sh qui vient d'être décompressé. Si vous avez réellement un système standard, lancez-le en tapant sh instldso.sh, mais si il y a quoi que ce soit d'anormal, installez-le à la main. Par anormal, je veux dire:
  4. Editez /etc/ld.so.conf pour y ajouter le nouveau répertoire /usr/i486-linuxaout/lib (et /lib-aout si vous allez en avoir besoin). Relancez ensuite /sbin/ldconfig -v pour vérifier qu'il prend en compte les nouveaux répertoires.
  5. Déplacez toutes les bibliothèques a.out dans /usr/lib et /usr/*/lib vers /usr/i486-linuxaout/lib. Notez que j'ai écrit les bibliothèques et non pas tous les fichiers. Ce sont les fichiers qui correspondent à la spécification lib*.so* , lib*.sa*, ou lib*.a. Ne commencez pas à déplacer par exemple /usr/lib/gcc-lib.
  6. Regardez maintenant dans /lib. Laissez tranquille les fichiers libc.so*, libm.so*, et libdl.so*. Si vous disposez de liens symboliques vers les bibliothèques X (libX*.so.3*), laissez-les également là car Xview et d'autres paquetages en ont besoin. Laissez les fichiers ld.so*, ld-linux.so* et tous les autres fichiers commençant par ld. Pour ce qui est des autres bibliothèques (s'il en reste), si vous avez /usr sur la partition racine, mettez-les dans /usr/i486-linuxaout/lib. Si /usr est monté séparément, mettez-les dans /lib-aout. Lancez maintenant ldconfig -v.
  7. Effacez le répertoire /usr/lib/ldscripts s'il existe, en vue de l'installation des binutils (qui va le recréer)
  8. Effacez toutes les copies de ld et de as (excepté ld86 et as86) que vous trouverez dans /usr/bin.
  9. Vous devez nettoyez votre arborescence /usr/include. Sur un système normal, certains des fichiers qui se trouvent ici sont des fonctionnalités de base et sont fournis avec libc, alors que d'autres proviennent d'autres paquetages que vous ou l'auteur de votre distribution avez installé. En tenant compte de cela, je suggère que vous la reconstruisiez à partir de rien: renommez-la en /usr/include.old, et extractez libc-5.2.18.bin.tar.gz à partir du répertoire racine.
  10. Installez le paquetage binutils. tar -xvzf binutils-2.6.0.12.bin.tar.gz -C / est une bonne manière de le faire.
  11. Le paquetage gcc doit être extracté à partir de la racine. Il installe quelques fichiers dans /usr/bin et bien plus encore dans /usr/lib/gcc-lib/i486-linux/2.7.2 et /usr/lib/gcc-lib/i486-linuxaout/2.7.2. Tapez:
    $ tar ztf gcc-2.7.2.bin.tar.gz
    
    pour voir ce qu'il contient, sauvegardez tout ce qu'il va écraser et que vous voudriez conseerver (par exemple, si vous avez installé Gnu ADA, vous voudrez conserver /usr/bin/gcc), et tapez juste:
    # tar -zxf gcc-2.7.2.bin.tar.gz -C /
    
    A cette étape, vous devriez être en mesure d'exécuter gcc -v et de compiler des programmes tests. Essayez:
    $ gcc -v
    Reading specs from /usr/lib/gcc-lib/i486-linux/2.7.2/specs
    gcc version 2.7.2
    $ gcc -v -b i486-linuxaout
    Reading specs from /usr/lib/gcc-lib/i486-linuxaout/2.7.2/specs
    gcc version 2.7.2
    $ ld -V
    ld version 2.6 (with BFD 2.6.0.2)
      Supported emulations:
       elf_i386 
       i386linux 
       i386coff 
    
    suivi bien sûr du programme traditionnel "Hello, world". Essayez-le avec gcc et avec gcc -b i486-linuxaout pour vérifier que les compilateurs a.out et ELF sont bien configurés. Terminé? Pas exactement. Les bibliothèques qui ne sont pas de base ne sont pas encore installées et de nombreux liens symboliques sont encore à établir. Courage...

    Liens symboliques

  12. Certains programmes (notamment de nombreux programmes X) utilisent /lib/cpp, qui sous Linux est généralement un lien vers /usr/lib/gcc-lib/i486-linux/version/cpp. Comme l'étape précédente a très certainement effacé la version de cpp vers laquelle il pointait, vous allez devoir recréer le lien:
    # cd /lib
    # ln -s /usr/lib/gcc-lib/i486-linux/2.7.2/cpp .
    
  13. Quand vous avez déplacé /usr/include vers /usr/include.old, vous avez perdu les liens symboliques à l'intérieur des sources du noyau. Faites:
    # cd /usr/include
    # ln -s ../src/linux/include/linux .
    # ln -s ../src/linux/include/asm .
    
    (en considérant que vos sources du noyau sont dans /usr/src/linux).
  14. Les gens de FSSTND se sont justifiés de l'avoir gardé en déplaçant les fichiers utmp et wtmp de /var/adm vers /var/run et /var/log respectivement. Vous allez devoir créer des liens en fonction de leurs emplacements et vous aurez peut-être à créer les répertoires /var/log et /var/adm. Je reproduis ci-dessous le résultat de ls -l sur mon système:
    $ 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
    
    Consultez FSSTND (à partir des archives de la LDP telles que ftp://sunsite.unc.edu/pub/Linux/docs/fsstnd/ ) pour les détails.

    Réjouissez-vous!

    A cet instant, vous devriez disposer d'un environnement de développement ELF pleinement fonctionnel (enfin plus ou moins). Relaxez vous et fêtez cela pendant quelques minutes.

    Paquetages essentiels en code source

  15. L' installation de ncurses est un travail de longue haleine bien que vous puissiez profiter du temps de compilation pour lire l'Usenet. Après avoir décompressé le fichier tar, lisez le fichier INSTALL en vous considérant comme "un constructeur de distribution Linux ou de paquetages", à savoir que vous allez probablement le configurer avec une commande du style
    $ ./configure --with-normal --with-shared --disable-termcap --enable-overwrite --prefix=/usr
    
    Prenez également garde aux commentaires qui concernent le type de terminal par défaut: dans les noyaux 1.3 et 2.0, on le définit par linux au moment du boot mais vous aurez peut-être à éditer /etc/inittab pour éviter de le redéfinir en tant que console par getty. Si /usr/lib/terminfo ne se trouve pas sur le disque racine (qui contient /), vous allez avoir affaire au "support du fallback" avec ncurses. Ceci est documenté dans le fichier INSTALL mentionné ci-dessus: c'est simple mais pénible car vous allez devoir compiler la bibliothèque deux fois. Si le fait d'avoir linux et vt100 comme fallbacks ne vous dérange pas, vous pouvez copier fallback.c que vous trouverez à ftp://ftp.uk.linux.org/pub/Linux/libc/non-core/fallback.c sur l'existant. Après avoir installé ncurses, vous allez devoir bidouiller dans /usr/lib car il y fait des choses non optimales qu'il est plus simple de réparer à la main. Notez que les contradictions entre les numéros de version, bien que peu agréables, ne sont d'aucun danger pour la santé humaine.
    1. /usr/lib/libncurses.so.1.9.9e devrait être déplacé vers /lib de manière à ce que les programmes curses qui fonctionnent en mode mono-utilisateur continuent à le faire. Si /usr/lib se trouve sur votre partition racine, cela n'est pas nécessaire bien que cela ne fasse pas de mal.
    2. Dans /lib, établissez un lien vers libncurses.so.1.9.9e appelé libncurses.so.3.0.
    3. Vous aurez également besoin des liens /usr/lib/libncurses.so, /usr/lib/libcurses.so et /usr/lib/libtermcap.so qui doivent tous pointer vers /lib/libncurses.so.3.0.
    Pour résumer, cela donne:
    # cd /lib
    # mv /usr/lib/libncurses.so.1.9.9e .
    # ln -s libncurses.so.1.9.9e libncurses.so.3.0 
    # cd /usr/lib
    # ln -s /lib/libncurses.so.3.0 libncurses.so
    # ln -s /lib/libncurses.so.3.0 libcurses.so
    # ln -s /lib/libncurses.so.3.0 libtermcap.so
    
  16. Installation de gdbm. Décompressez le code source dans un répertoire de code source, appliquez le patch gdbm.patch, et consultez les fichiers README et INSTALL. La procédure de compilation sera alors du genre:
    $ tar zxf gdbm-1.7.3.tar.gz
    $ patch -p0 < gdbm.patch
    $ cd gdbm-1.7.3
    $ ./configure --prefix=/usr
    $ make 
    $ make progs
    $ su
    # make install
    # make install-compat
    # cd /usr/lib
    # ln -s libgdbm.so.1 libgdbm.so
    # ln -s libgdbm.so.1 libgdbm.so.2
    # ldconfig
    
    La dernière étape est pour la compatibilité ascendante: certaines distributions utilisent libgdbm.so.2 qui contient le même code que libgdbm.so.1 mais mal numéroté pour des raisons historiques.

    Paquetages optionnels en code source. En général, vous pouvez vous contenter de les installer en suivant les procédures qu'ils indiquent que je ne vais donc pas répéter. Il y a toutefois deux exceptions:

  17. Si vous voulez termcap version GNU (optionnel à strictement parler mais nécessaire pour utiliser les exécutables XFree86), il doit être compilé à partir du code source mais cela ne devrait pas être plus compliqué que
    $ tar zxf termcap-2.0.8.tar.gz
    $ cd termcap-2.0.8
    $ make
    $ su
    # cp libtermcap.so.2.0.8 /usr/lib
    # ldconfig
    
    Je vous recommande de ne pas faire make install pour ne pas compromettre l'installation antérieure de ncurses. Si vous avez besoin de compiler des choses à partir de cette bibliothèque plutôt que simplement exécuter des exécutables faits avec elle, pensez à placer en lieu sûr les fichiers d'en-tête et les bibliothèques statiques et à utiliser les commutateurs -I et -L quand vous compilerez les choses en question. L'aspect vague de cette description devrait rendre clair que l'utilisation de termcap est déconseillée à moins que vous n'ayez de bonnes raisons.
  18. Pour libdb, c'est quelque chose du genre:
    $ tar zxf db.1.85.tar.gz
    $ patch -p0 <db.patch
    $ cd db.1.85/PORT/linux
    $ make
    $ su
    # mkdir /usr/include/db
    # ldconfig
    # cp libdb.so.1.85.3 /usr/lib ; ( cd /usr/lib && ln -s libdb.so.1 libdb.so )
    # cp ../../include/*.h /usr/include/db
    
    Veuillez noter

2.5 A quoi cela devrait ressembler (les grandes lignes de l'arborescence des répertoires)

Ceci est un guide délibérément vague qui indique en gros ce que sont les fichiers que vous venez d'installer. Cela peut être utile dans un contexte de dépannage ou si vous décidez d'effacer quelque chose.

/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.2

/usr/lib/gcc-lib/i486-linuxaout/2.7.2

2.6 Erreurs communes --- Ne paniquez pas!


Chapitre suivant, Chapitre Précédent

Table des matières de ce chapitre, Table des matières générale

Début du document, Début de ce chapitre