2. Installation

Contenu de cette section

2.1 Principe

Le but de cette conversion est de vous offrir un système qui puisse créer et exécuter aussi bien des programmes a.out qu'ELF, chaque type de binaire étant capable de trouver les ensembles de bibliothèques partagées dont il a besoin. Cela demande par conséquent un peu plus de finesse dans la stratégie de recherche des bibliothèques que le traditionnel "allons voir dans /lib, /usr/lib et partout où cela a été indiqué par compilation", qui suffit à beaucoup de systèmes.

Sous Linux, l'esclave responsable de la recherche des bibliothèques se nomme /lib/ld.so. Le compilateur et l'éditeur de liens n'encodent pas leur chemin d'accès absolu dans le programme exécutable ; au lieu de cela, ils mettent le nom de la bibliothèque nécessaire et le chemin absolu vers ld.so, et laissent ce dernier terminer le travail à l'exécution du programme. Cette méthode apporte une caractéristique importante : les bibliothèques dont un programme a besoin peuvent être déplacées dans d'autres répertoires sans qu'il soit nécessaire de recompiler l'application, à condition que l'on indique à ld.so ce nouveau répertoire. C'est essentiel pour l'opération d'interversion de répertoires qui va suivre.

Par corollaire, bien entendu, toute tentative de suppression ou de déplacement de ld.so se soldera par l'arrêt immédiat du fonctionnement de tout programme utilisant des bibliothèques partagées. En général, ce n'est pas bon, mais pas bon du tout...

En ce qui concerne les binaires ELF, il est fourni un éditeur de liens dynamiques supplémentaire. Il s'agit de /lib/ld-linux.so.1 : il effectue exactement le même travail que ld.so, mais pour les programmes ELF. Il utilise les mêmes fichiers de support et outils de configuration que celui-ci (ldd, ldconfig, et /etc/ld.so.conf).

Le but de la manipulation, donc, est de faire que tous les outils de développement ELF (compilateurs, fichiers d'en-têtes et bibliothèques) aillent dans /usr/{bin,lib,include} ; c'est-à-dire là où se trouvent actuellement ceux pour a.out, et que tous les outils a.out soient déplacés dans /usr/i486-linuxaout/{bin, lib, include}. Le fichier /etc/ld.so.conf contiendra tous les endroits où les bibliothèques sont susceptibles d'être trouvées, et ldconfig est suffisamment intelligent pour faire la distinction entre ELF et a.out.

Toutefois, il y a des exceptions, dans quelques cas particuliers.

2.2 Pièges à éviter avant de commencer

2.3 Vous aurez besoin de...

Les paquetages suivants sont disponibles dans le répertoire GCC des sites miroirs Linux français.
ftp://ftp.ibp.fr/pub/linux/tsx-11/packages/GCC/ .

Les archives suivantes (soit les versions citées ici, soit des versions plus récentes) sont nécessaires. Téléchargez également toutes les notes et documentations que vous trouverez, et lisez-les. Les fichiers s'appellent en général release.nom_du_paquetage. Ce conseil s'applique particulièrement si vous récupérez des versions plus récentes que celles dont nous parlons ici, car les procédures d'installation peuvent avoir changé.

2.4 Réorganisation de votre arborescence de fichiers

Bien... Notez que dans tout ce qui va suivre, lorsque nous disons "supprimer", cela sous-entend naturellement "faire une sauvegarde, puis supprimer" :-). Notez également que ces instructions sont destinées aux personnes n'ayant jamais expérimenté ELF. Ceux qui ont déjà essayé doivent en principe être capable de s'adapter, le cas échéant. Allons-y !

  1. Créez les nouveaux répertoires dans lesquels vous allez déplacer tout ce qui concerne le format a.out :
    mkdir -p /usr/i486-linuxaout/bin
    mkdir -p /usr/i486-linuxaout/include
    mkdir -p /usr/i486-linuxaout/lib
    mkdir /lib-aout
    
  2. Désarchivez le paquetage contenant l'éditeur de liens dynamiques ld.so-1.7.3 dans le répertoire où vous placez généralement le code source, puis lisez le script ld.so-1.7.3/instldso.sh qu'il contient. Si vous avez vraiment un système Linux standard, exécutez-le en tapant "sh instldso.sh", mais si vous n'êtes pas certain que tout est bien où il faut, faites l'installation à la main, on n'est jamais trop prudent. Cela concerne aussi les cas suivants :
  3. Éditez /etc/ld.so.conf afin d'y ajouter le nouveau répertoire /usr/i486-linuxaout/lib (ainsi que /lib-aout si vous en avez besoin). Puis, relancez "/sbin/ldconfig -v"pour vérifier qu'il prenne bien en compte ces nouveaux chemins d'accès.
  4. Déplacez toutes vos bibliothèques a.out de /usr/*/lib dans /usr/i486-linuxaout/lib. Notez bien que nous avons dit "bibliothèques", et non pas "tout". Il s'agit des fichiers correspondant aux expressions lib*.so*, lib*.sa* et lib*.a. Ne commencez pas à déplacer /usr/lib/gcc-lib ou faire toute autre ânerie du genre.
  5. Maintenant, examinez le répertoire /lib. Ne touchez pas à libc.so*, libm.so* et libdl.so*. Si vous avez des liens symboliques vers des bibliothèques X (libX*.so.3*), laissez-les également : XView et quelques autres applications peuvent en avoir besoin. Ne touchez pas à ld.so*, ld-linux.so* et tout autre fichier dont le nom commence par ld. En ce qui concerne toutes les autres bibliothèques (s'il vous en reste) : si votre partition /usr est sur la racine, mettez-les dans /usr/i486-linuxaout/lib. Si /usr est montée séparément, mettez-les alors dans /lib-aout. Puis, lancez ldconfig -v.
  6. Supprimez le répertoire /usr/lib/ldscripts s'il existe, en vue de l'installation des binutils (ce qui le recréera).
  7. Supprimez toute copie de ld et as (sauf ld86 et as86) que vous trouverez dans /usr/bin.
  8. Certaines version du GNU tar semblent avoir des problèmes avec les liens symboliques dans le répertoire de destination. Vous avez alors deux options :
    1. Utilisez cpio au lieu de tar, il n'a pas ce problème. L'incantation magique, à exécuter depuis le répertoire racine, est : zcat /votre/repertoire/libc-5.0.9.tar.gz | cpio -iv
    2. (si vous n'avez pas cpio) Avant d'installer les fichiers de la libc, vous aurez intérêt à faire un tour dans /usr/include pour y faire un peu de ménage. C'est délicat, et pénible. Beaucoup de paquetages (comme ncurses) sont installés dans /usr/include par les concepteurs de distributions, et ne sont pas fournis avec la bibliothèque C standard. Sauvegardez toute cette arborescence, et utilisez tar tzf pour regarder ce qui se trouve dans les archives que vous allez installer : supprimez les répertoires qui vont être recréés, pour partir sur des bases saines. Puis, installez libc-5.0.9.bin.tar.gz depuis la racine.
  9. Installez le paquetage binutils. La commande "tar -xvzf binutils-2.6.2l.17.bin.tar.gz -C /" constitue une excellente méthode pour cette opération.
  10. Vous avez maintenant installé tout le nécessaire pour l'exécution de programmes ELF. Les médecins conseillent aux personnes travaillant devant un écran vidéo de faire des pauses régulières, pour reposer leurs yeux et leurs nerfs ; c'est sans doute ici, le moment opportun pour vous octroyer un peu de détente. Mais n'oubliez pas où vous en êtes ! Selon la version de gcc que vous utilisiez auparavant, il se peut que votre système ne soit pas en état de compiler des programmes en a.out avant que vous n'installiez le nouveau compilateur.
  11. Sauvegardez, puis supprimez tout ce qui se trouve dans /usr/lib/gcc-lib/{i486-linux, i486-linuxelf, i486-linuxaout}/. Si vous utilisez un pilote gcc non standard (comme Gnu ADA), copiez-le aussi dans un endroit sûr. Installez alors le paquetage GCC, toujours depuis la racine.
  12. Certaines applications (particulièrement les programmes X) utilisent /lib/cpp, qui est en général, sous Linux, un lien vers /usr/lib/gcc-lib/i486-linux/version/cpp. Comme l'opération précédente a supprimé toute version de cpp vers laquelle ce lien pointait, il va vous falloir le recréer :
    $ cd /lib
    $ ln -s /usr/lib/gcc-lib/i486-linux/2.7.0/cpp .
    
  13. L'équipe du FSSTND ont un jour justifié leur choix de déplacer les fichiers utmp et wtmp de /var/adm vers /var/run et /var/log, respectivement. Vous devrez ajouter quelques liens symboliques en fonction de l'endroit où ils se trouvent sur votre système, et vous pourrez même avoir à créer ces répertoires /var/log et /var/adm. Voici la sortie donnée par ls -l sur un système correctement installé selon cette nouvelle arborescence :
    $ 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 le document FSSTND pour comprendre toute l'histoire.
  14. Si vous avez l'intention de continuer à pouvoir compiler des programmes selon l'ancien format a.out, il est temps d'installer libc.so 4.7.x. Décompactez l'archive depuis la racine, vous êtes sans doute maintenant capable d'effectuer cette opération sans autre explication. Cette étape est bien entendu facultative.

C'est terminé ! Vous pouvez maintenant effectuer quelques tests simples :


$ 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

suivis, comme il se doit, par le traditionnel programme "Hello, world". Essayez de le compiler avec gcc et gcc -b i486-linuxaout, afin de vérifier que les deux formats, ELF et a.out, soient correctement gérés.

2.5 Ce à quoi l'arborescence doit maintenant ressembler.

Voici un vague aperçu des fichiers que vous venez d'installer, qui pourra vous servir de guide pour déterminer une éventuelle erreur, ou les fichiers que vous pouvez effacer.

/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 Erreurs courantes (pas de panique !)

... avec un grand sourire.

Vous avez déplacé le mauvais fichier et plus rien ne fonctionne

Toutefois, vous avez encore un shell à disposition, et avec un peu d'astuce, on peut faire énormément de choses avec ses commandes internes. Sachez que "echo *" peut remplacer de manière satisfaisante ls, et que "echo >>fichier" peut servir à ajouter des lignes dans un fichier. Également, n'oubliez pas que ldconfig est compilé en statique. Si vous avez déplacé par erreur, disons, libc.so.4 vers /lib-aout, vous pouvez faire "echo "lib-aout" >>/etc/ld.so.conf ; ldconfig -v/" pour récupérer la main. Si vous avez déplacé /lib/ld.so, vous pouvez peut-être faire "sln /place/idiote/ld.so /lib/ld.so" si vous disposez d'une version statique de la commande ln.

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

"Fichier ou répertoire inexistant" ... alors que pourtant, vous savez que ce programme gcc est là. Cela signifie en général que l'éditeur de liens dynamiques ELF /lib/ld-linux.so.1 n'est pas installé, ou est illisible pour une raison quelconque. Vous devez l'avoir mis en place, en principe, vers l'étape 2 de la section précédente.

not a ZMAGIC file, skipping

vous dit ldconfig. Vous possédez une ancienne version de l'ensemble ld.so, procurez-vous une archive récente. Là encore, voyez l'étape 2 de la section précédente.

bad address

"Mauvaise adresse" à chaque tentative d'exécution de n'importe quel programme ELF. Vous utilisez une version 1.3.x du noyau, où x<3. Prenez une version à jour, supérieure à 1.3.3, ou utilisez une version 1.2.

_setutent: Can't open utmp file

Ce message apparaît plusieurs fois lorsque vous lancez un xterm. Allez lire ce qui est dit à propos du FSSTND vers la fin de la procédure d'installation.

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

lors de compilations a.out ("quelque chose" correspond généralement à cpp ou cc1). Soit il s'agit réellement d'une erreur d'installation, soit vous avez tapé

$ gcc -b -i486-linuxaout

au lieu de

$ gcc -b i486-linuxaout

Notez que le "i486" ne commence pas par un tiret.


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