  Le HOWTO ELF
  Daniel Barlow <daniel.barlow@linux.org>
  v1.29, 14 Juillet 1996

  Ce  document  explique comment modifier votre systeme Linux afin qu'il
  puisse compiler et executer les programmes au format  executable  ELF.
  Il se decompose en trois sous parties (1) ce qu'est ELF et les raisons
  qui vous pousseront a vous y mettre, (2) comment mettre a  jour  votre
  systeme  pour utiliser ELF et (3) ce qu'il vous sera alors possible de
  faire.

  11..  QQuu''eesstt--ccee qquuee EELLFF?? IInnttrroodduuccttiioonn..

  ELF (Executable and Linking Format) est un format de donnees  binaires
  originellement   developpe  par  USL  (UNIX  System  Laboratories)  et
  desormais utilise dans Solaris et dans le Systeme 5 Version 4. De  par
  sa  flexibilite  accrue  par rapport a l'ancien format a.out que Linux
  utilisait precedemment, les  developpeurs  de  GCC  et  de  librairies
  deciderent  l'an  dernier  de  se  mettre a ELF et d'ainsi modifier le
  format standard des fichiers binaires de Linux.

  Cette flexibilite accrue a en fait deux interets  essentiels  pour  le
  programmeur d'applications moyen :

  +o  Il est bien plus simple de faire des librairies partagees avec ELF.
     Usuellement, il suffit de compiler tous les  fichiers  objets  avec
     -fPIC et d'ensuite etablir les liens avec une commande telle que :

       gcc -shared -Wl,-soname,libfoo.so.y -o libfoo.so.y.x *.o

  Si  vous  trouvez cela complexe, c'est que vous n'avez visiblement pas
  eu affaire a la procedure equivalente pour  les  librairies  partagees
  avec  a.out  ou  il faut compiler la librairie par deux fois, en ayant
  reserve la place pour toutes les  donnees  dont  vous  pensez  que  la
  librairie  va  avoir  besoin  dans  le  futur  et  en ayant enregistre
  l'espace d'adressage aupres d'une tierce partie. Tout cela est  decrit
  dans     un     document     de     plus    de    20    pages    (voir
  <ftp://tsx-11.mit.edu/pub/linux/packages/GCC/src/tools-2.17.tar.gz>
  pour les details).

  +o  Il  est  egalement  plus simple de gerer le chargement dynamique en
     memoire  (c'est-a-dire  les  programmes  qui  peuvent  charger  des
     modules  au  moment  de  l'execution). Ceci est utilise par Perl 5,
     Python et  Java  (entre  autres).  D'autres  possibilites  pour  le
     chargement  dynamique  : des Donjons Multi-Utilisateurs (Multi User
     Dungeons) ou le code supplementaire pourrait etre compile et lie au
     programme  en  fonctionnement  sans  avoir  a  l'arreter  et  a  le
     relancer.

  Cependant, il faut prendre en compte qu'ELF est peut-etre un peu moins
  rapide.  Les chiffres les plus couramment cites font etat d'une baisse
  de performance de 1 a 5%, bien que les tests effectues jusqu'a present
  indiquent  que  la  difference  est suffisamment faible pour se perdre
  dans le bruit du autres evenements qui arrivent  au  meme  moment.  Si
  vous  avez  un  visualiseur ou un moyen d'imprimer des fichiers TeX ou
  PostScript, vous pourrez  lire  speed.comp-1.0.tar.gz  qui  se  trouve
  quelque part sur SunSite.

  Le  ralentissement  vient  du  fait  que  les codes des librairies ELF
  doivent etre independants de la position (c'est  ce  que  signifie  le
  commutateur -fPIC vu ci-dessus signifie) : un registre doit alors etre
  dedie pour la conservation des offsets. C'est un  de  moins  pour  les
  variables,  alors  que  les  80x86 ont deja une penurie de registres a
  usage  general.  Notez  bien  que  les  differences  de   vitesse   ne
  s'appliquent  qu'aux  parties  du  code qui font partie des librairies
  partagees. Pour  les  applications  ou  le  noyau,  il  n'y  a  aucune
  difference de vitesse entre a.out et ELF.

  11..11..  CCee qquu''EELLFF nn''eesstt ppaass

  Il y a bon nombre d'erreurs de commises quant a ce que ELF va apporter
  a votre systeme :

     CCee nn''eesstt ppaass uunn mmooyyeenn dd''eexxeeccuutteerr ddeess pprrooggrraammmmeess SSVVRR44 oouu SSoollaarriiss
        Bien que ce soit le meme conteneur binaire  que  celui  que  les
        systemes  SVR4 utilisent, cela n'implique pas que les programmes
        SVR4 vont soudainement se mettre a fonctionner sous Linux. Il en
        va  de meme que pour un format de disque - vous pouvez conserver
        des programmes Linux sur des disques au format MSDOS  ou  Minix,
        et  vice  versa,  mais  cela ne signifie pas pour autant que ces
        systemes seront alors en mesure d'executer  les  programmes  des
        autres.

        Il est possible d'executer une application prevue pour une autre
        implementation d'Unix pour des systemes  x86  sous  Linux  (cela
        depend  de  l'application)  mais  suivre  les instructions de ce
        HOWTO _n_'_a_u_r_a _p_a_s cet effet-la. Commencez par essayer  le  module
        iBCS du noyau (quelque part sur tsx-11.mit.edu) et voyez s'il ne
        satisfait pas vos besoins.

     CCee nn''eesstt ppaass iinnttrriinnsseeqquueemmeenntt pplluuss ccoommppaacctt oouu pplluuss rraappiiddee
        Vous  pouvez  tres  bien  vous  retrouver  avec   des   fichiers
        executables plus petits compte tenu du fait que vous pouvez plus
        aisement creer des librairies partagees  de  code  commun  a  de
        nombreux  programmes.  En  general,  si  vous utilisez les memes
        options de compilation et que vous obtenez des executables  plus
        petits qu'avec a.out, ce sera du soit a un coup de chance soit a
        une version differente du compilateur. Pour ce  qui  est  de  la
        mention  plus  rapide, j'en serais surpris. Des augmentations de
        performances peuvent apparaitre si  vos  fichier  compiles  sont
        plus  petits,  du  fait  de  la  baisse  des transferts avec des
        fichiers d'echange ou des domaines fonctionnels plus grands  qui
        rentrent dans le cache.

     IIll nn''eesstt ppaass nneecceessssaaiirree ddee rreemmppllaacceerr cchhaaccuunn ddeess eexxeeccuuttaabblleess ddee
        vvoottrree ssyysstteemmee
        A la fin  des  procedures  indiquees  ci-apres,  vous  aurez  un
        systeme  capable  de  compiler  et  d'executer  a  la  fois  des
        programmes a.out et ELF. Les nouveaux programmes seront compiles
        par  defaut  en  ELF  bien  que  cela  puisse  etre  modifie par
        l'intermediaire d'un commutateur sur la ligne  de  commande.  Il
        est  communement  admis qu'on encourt une perte de memoire quand
        on dispose d'un systeme a la fois a.out et ELF : ainsi, si  vous
        avez  les  deux sortes de programmes qui tournent en meme temps,
        il va s'en suivre deux copies de la meme librairie C en  memoire
        et  ainsi de suite. Cela dit, il semblerait que cette difference
        de vitesse est  imperceptible  en  utilisation  normale  sur  un
        systeme avec 8Mo (je n'en ai en tout cas pas remarque avec 8Mo).
        Vous perdez bien plus de memoire chaque jour quand vous utilisez
        des  programmes  gourmands  comme  Emacs!  !  !  !  !  !  ou les
        executables statiques de Mosaic ou de Netscape :-).

     RRiieenn aa vvooiirr aavveecc TToollkkiieenn
        Du moins pas dans ce contexte.

  11..22..  PPoouurrqquuooii ssee ccoonnvveerrttiirr aa EELLFF ??

  Il y a essentiellement deux raisons pour mettre a jour  votre  systeme
  pour  ELF,  la  premiere etant la flexibilite accrue decrite plus haut
  pour la programmation et la seconde etant que, au vu de  la  premiere,
  tout le monde le fera (ou l'a deja fait). Les dernieres versions de la
  librairie C et de GCC sont compilees seulement pour ELF et les  autres
  developpeurs se mettent egalement a ELF.

  Beaucoup de personnes ont pour souci la stabilite (ce qui est legitime
  bien que terre-a-terre). ELF a ete utilise sous Linux depuis Aout 1994
  et  a  ete publiquement disponible aux alentours de Mai ou Juin 1995 ;
  les problemes les plus graves ne sont plus  qu'un  lointain  souvenir.
  Vous devriez permettre quelques menus defauts -- comme avec toute mise
  a jour d'importance -  mais  la  technologie  a  laquelle  vous  allez
  adherer  n'est  plus experimentale. Pour un systeme sur lequel on fait
  un tant soit peu de developpement ou sur lequel vous avez  l'intention
  d'executer  les  programmes  precompiles  d'autres  personnes, ELF est
  presque devenu une necessite. Pensez a vous y mettre quand vous  ferez
  la mise a jour pour le noyau 2.0.

  11..33..  CCoommmmeenntt ssee ccoonnvveerrttiirr aa EELLFF

  Au  moment  ou  ce HOWTO fut originellement ecrit, il n'y avait qu'une
  seule maniere : celle decrite ci-dessous. De nos jours,  il  y  a  des
  distributions  de haute qualite faciles a mettre a jour -- a moins que
  vous n'ayez investi un temps certain a peaufiner la  configuration  de
  votre machine, vous trouverez certainement que faire une sauvegarde de
  vos donnees personnelles et reinstaller a  partir  d'une  distribution
  RedHat  ou  Debian est plus facile que de jouer avec les librairies et
  les compilateurs decrits ici.

  Je me dois d'insister. L'installation decrite ici est  un  travail  de
  plutot  faible  envergure  en elle-meme (elle peut etre faite en moins
  d'une heure, mis a part le temps de telechargement des logiciels) mais
  elle  peut  donner  lieu  a  de multiples erreurs qui risquent de vous
  laisser avec un systeme non bootable. Si vous ne vous sentez  pas  sur
  de vous dans la mise a jour des librairies partagees, si les commandes
  ldconfig et  ldd ne vous disent rien et si construire des paquetages a
  partir du code source ne vous enchante pas, vous devriez considerer la
  solution de facilite. Meme si la description ne vous  correspond  pas,
  pensez  y  tout  de  meme  : si vous voulez un systeme totalement ELF,
  _q_u_e_l_q_u_'_u_n va devoir en compiler tous les executables.

  Vous etes toujours la ?

  22..  IInnssttaallllaattiioonn

  22..11..  PPrreerreeqquuiiss

  Le but de cette mise a jour est de vous fournir un systeme qui  puisse
  compiler  et  executer  aussi  bien les programmes bases sur a.out que
  ELF, en s'assurant que  chaque  type  de  programme  soit  capable  de
  trouver la version appropriee des bibliotheques partagees. Il apparait
  aisement que cela demande plus de travail que simplement chercher dans
  /lib,  dans  /usr/lib  ou  n'importe  ou  ailleurs  selon le chemin de
  recherche indique dans la compilation, strategie dont certains  autres
  systemes se satisfont.

  Le travail necessaire est centralise au niveau d'un _c_h_a_r_g_e_u_r _d_y_n_a_m_i_q_u_e
  qui existe  en  un  seul,  ou  deux,  endroit  du  systeme.  Pour  les
  programmes  a.out,  il  est  appele /lib/ld.so et, pour les programmes
  ELF, on fait appel a /lib/ld-linux.so.1.  Le compilateur et  l'editeur
  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 approprie et se
  contentent de ca pour apparier le nom de  la  bibliotheque  au  chemin
  correspondant lors de l'execution. Cela a une consequence d'importance
  : les bibliotheques peuvent etre deplacees dans  d'autres  repertoires
  _s_a_n_s  _r_e_c_o_m_p_i_l_e_r  _l_e  _p_r_o_g_r_a_m_m_e  des  lors que ld.so (ou ld-linux.so.1
  selon le cas) a ete informe de chercher dans le nouveau repert!  !   !
  !   !  !  oire. C'est une fonctionnalite essentielle pour l'echange de
  repertoires qui va suivre.

  Le corollaire de ce qui precede  est  bien  sur  que  toute  tentative
  d'effacer  ou de deplacer ld.so ou ld-linux.so.1 pourrait provoquer _l_e
  _p_l_a_n_t_a_g_e _d_e _t_o_u_t _p_r_o_g_r_a_m_m_e _d_y_n_a_m_i_q_u_e_m_e_n_t _l_i_e  _s_u_r  _l_e  _s_y_s_t_e_m_e.  C'est
  generalement vu comme une Mauvaise Chose.

  Le  schema  general  est  alors  de  mettre  tout  ce  qui concerne le
  developpement   ELF   (compilateurs,   bibliotheques    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 systeme ou l'on
  s'attend a trouver les  bibliotheques  et  ldconfig  est  suffisamment
  malin pour distinguer les versions ELF des versions a.out.

  Il  y  a  neanmoins  quelques  exceptions  quant  au  placement  de la
  bibliotheque :

  +o  Certains vieux programmes ont ete compiles  sans  l'utilisation  de
     ld.so. Ceux-ci cesseraient alors de fonctionner si leurs librairies
     devaient etre deplacees. Ainsi libc.so* et libm.so* doivent  rester
     ou  ils  sont  dans  /lib  et les versions ELF ont vu leurs numeros
     majeurs mis a jour afin qu'ils n'ecrasent pas les  versions  a.out.
     Les vieilles bibliotheques X (avant la version 6) feraient mieux de
     rester ou elles  sont  alors  que  les  plus  recentes  (libX*so.6)
     doivent etre deplacees. Deplacer les anciennes bloquera xview et ne
     pas deplacer les nouvelles fera qu'elles seront  ecrasees  lors  de
     l'installation des bibliotheques ELF.

     Si   vous  avez  des  programmes  non  ld.so  qui  necessitent  des
     bibliotheques autre que celles citees ci-dessus (si vous  savez  de
     quels  programmes  il  s'agit, vous pouvez executer ldd sur ceux-ci
     afin de determiner quelles  bibliotheques  leurs  sont  necessaires
     _a_v_a_n_t de les bloquer), deux solutions s'offrent a vous. La premiere
     est d'extraire la librairie ELF dans un repertoire  temporaire,  de
     voir  si votre precieuse librairie va etre ecrasee et, si le cas se
     presente, de deplacer la  version  ELF  de  la  bibliotheque  dans,
     disons,  /usr/i486-linux/lib  en lieu et place de /lib.Assurez vous
     que ld.so.conf contient /usr/i486-linux/lib  et  executez  ldconfig
     puis n'y pensez plus. La seconde est de recompiler ou d'obtenir une
     nouvelle  version  du  programme  incrimine.  Cela  n'est  pas  une
     mauvaise idee, si c'est possibl!  !  !  !  !  !  e.

  +o  Si  vous  avez /usr et / sur des partitions differentes, toutes les
     bibliotheques que vous deplacerez  de  /lib  devront  se  retrouver
     autre part sur le disque racine et pas sur /usr. J'ai utilise /lib-
     aout pour les instructions qui suivent.

  22..22..  AAvvaanntt ddee ccoommmmeenncceerr :: nnootteess eett mmiisseess eenn ggaarrddeess

  +o  Il va vous falloir tourner sous un noyau posterieur au 1.1.52  aavveecc
     ssuuppppoorrtt ddeess ffiicchhiieerrss eexxeeccuuttaabblleess EELLFF. Le 1.2.13 ainsi que le 2.0.30
     font l'affaire ainsi que la plupart des noyaux de la serie 1.3 bien
     que  l'interet de tourner sous des anciens noyaux experimentaux est
     maintenant discutable avec l'arrivee du 2.0.

  +o  Il est recommande de se  munir  d'une  disquette  d'amorcage  Linux
     telle  que  la disquette de sauvetage de Slackware. Vous n'en aurez
     probablement pas besoin mais si vous n'en avez pas et que  vous  en
     ayez  besoin,  vous  serez  dans le petrin. Dans le meme esprit "il
     vaut mieux prevenir que guerir", des copies statiquement  liees  de
     mv,  ln ou d'autres commandes de manipulation de fichier pourraient
     vous aider a sortir des situations perilleuses dans lesquelles vous
     pourriez vous mettre.

  +o  Si  vous  avez  suivi le developpement de ELF depuis le debut ou si
     vous  avez  installe   certaines   versions   de   Slackware,   vos
     bibliotheques  ELF peuvent etre dans /lib/elf. Les applications que
     vous avez compilees avec celles-ci doivent etre  recompilees  avant
     d'effacer ce repertoire. /lib/elf n'est pas necessaire!

  +o  La  plupart  des installations Linux modernes se sont rejointes sur
     l'adoption du systeme de fichiers standard "FSSTND" mais il y en  a
     sans  nul doute quelques unes qui sont en retard. Si vous voyez des
     references  a  /sbin/_q_u_e_l_q_u_e  _c_h_o_s_e  et  que  vous  n'avez  pas  de
     repertoire  /sbin/,  vous  trouverez  probablement  le programme en
     question dans /bin ou /etc/. Ceci  est  particulierement  important
     quand  vous  installez  de  nouveaux  programmes: si /etc est place
     avant /sbin dans  le  chemin  de  recherche,  vous  obtiendrez  des
     erreurs parce que vous ferez appel aux anciennes versions alors que
     vous n'auriez pas du.

  +o  C'est une  bonne  idee  de  choisir  un  moment  ou  nul  n'utilise
     l'ordinateur  ou de le lancer en mode mono-utilisateur. Relancez-le
     d'une disquette d'amorcage de maniere a ne pas rester bloque,  meme
     si, pour ma part, j'aime bien jouer avec le feu...

  22..33..  NNoottiioonnss

  Tout  ce  qui  est decrit ci-apres par "sur tsx-11" peut etre trouve a
  <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 plutot que les
  sites generaux des que cela est possible. Cela  ira  plus  vite,  pour
  vous et pour les autres.

  Ces  paquetages  (que  ce  soit la version listee ou une plus recente)
  sont requis. Pensez egalement a telecharger les notes concernant votre
  version   pour   chacun   d'entre   eux:   elles   sont  de  la  forme
  release._n_o_m___d_u___p_a_q_u_e_t_a_g_e. Cela  est  particulierement  vrai  pour  les
  versions  plus recentes que celles presentees ici (l'installation a pu
  changer).

  Meme si vous avez pour habitude de compiler a partir des  sources,  je
  vous  recommande de prendre les versions binaires quand je l'indique a
  moins que vous n'ayez  _r_e_e_l_l_e_m_e_n_t  plus  besoin  de  vos  cheveux.  La
  plupart  d'entre  eux  ne  sont  pas prevus pour la compilation sur un
  systeme mixte et vous vous exposez a de graves ennuis si vous essayez.

  22..33..11..  LLeess eesssseennttiieellss

  +o  ld.so-1.7.14.tar.gz  --- le nouveau generateur de liens dynamiques.
     Il contient a la fois les sources et les versions compilees.  Notez
     que  la  version a venir necessitera une prise en charge d'ELF meme
     pour les executables a.out; si vous recuperez la version  1.8.1  ou
     plus  recente  en  lieu et place de la version mentionnee, verifiez
     que votre noyau a ete compile avec l'option support d'ELF _a_v_a_n_t  de
     l'installer.

  +o  libc-5.3.12.bin.tar.gz  ---  les  images  partagees  pour  ELF  des
     bibliotheques C et de maths, plus les bibliotheques correspondantes
     en  statique  et les fichiers include necessaires pour compiler les
     programmes. Si vous voulez le code source, preparez  vous  alors  a
     attendre pendant des heures pendant la compilation, si jamais il se
     compile (a moins que vous n'ayez deja un systeme ELF).

  +o  gcc-2.7.2.bin.tar.gz --- le paquetage  du  compilateur  C  ELF  qui
     comprend  egalement  un  compilateur C a.out qui tient compte de la
     nouvelle disposition des repertoires. Si vous vous voulez  compiler
     gcc  vous  meme  (ce que vous trouverez certainement plus simple si
     vous  utilisez   deja   ELF),   il   est   recommande   d'appliquer
     gcc-2.7.2-linux.diff.gz aux sources GNU avant de le faire.

  +o  binutils-2.6.0.12.bin.tar.gz  ---  les  utilitaires  GNU en version
     Linux. Ce sont des programmes tels que gas, ld, strings et ainsi de
     suite,  la  plupart  d'entre  eux  etant requis pour l'execution du
     compilateur C. Notez bien que les binutils GNU "vanilla" (a  savoir
     ceux  de  prep.ai.mit.edu)  ne sont pas un substitut acceptable. Si
     vous voulez reellment les  compiler  vous  meme,  faites  appel  au
     paquetage  modifie  pour Linux binutils-2.6.0.12.tar.gz plutot qu'a
     la version GNU.

  +o  ncurses-1.9.9e.tar.gz --- c'est une bibliotheque curses  compatible
     SVR4,   c'est   donc  la  bibliotheque  consideree  comme  standard
     concernant curses sous Linux. On peut en obtenir le code source sur
     des  sites GNU tels que  <ftp://prep.ai.mit.edu/gnu/> ou encore sur
     <ftp://ftp.netcom.com/pub/zm/zmbenhal>. Il y a  aussi  une  version
     compilee  du  paquetage sur tsx-11. Avant que vous installiez cela,
     vous  disposerez  d'un  systeme  de  developpement  ELF  pleinement
     fonctionnel,  je  vous  recommande donc le paquetage source si vous
     avez la moindre once de puissance pour la compilation.

  +o  gdbm-1.7.3.tar.gz est un ensemble de routines de base de donnes qui
     fait  appel  au hachage et qui fonctionne de maniere comparable aux
     routines dbm et ndbm standards d'UNIX. Le  source  est  recuperable
     sur   <ftp://prep.ai.mit.edu/gnu/>  et  vous  aurez besoin du patch
     <ftp://ftp.uk.linux.org/pub/Linux/libc/non-core/gdbm.patch> pour en
     obtenir  des  bibliotheques  partagees.  Le patch corrige egalement
     quelques petites choses (une  coquille  dans  le  Makefile  et  une
     predisposition  a  utiliser  une  mauvaise option de protection des
     fichiers).

  22..33..22..  AAuuttrreess

  Il y a d'autres bibliotheques et fichiers qui ne sont  pas  essentiels
  mais  que vous voudrez probablement avoir de toute facon. Cette  liste
  comporte seulement des paquetages qui necessitent d'etre  mis  a  jour
  pour  fonctionner  de maniere utile vis-a-vis d'ELF. Plus loin dans ce
  document, une nouvelle liste indique les programmes qui continueront a
  fonctionner  mais  qu'il vous faudra mettre a jour pour les recompiler
  en ELF.

  +o  Le paquetage ccoommppaattiibbiilliittee aa..oouutt : libc.so-4.7.6.   Il  est  marque
     optionnel parce que vos bibliotheques a.out existantes continueront
     a marcher avec vos executables actuels. Vous ne le prendrez que  si
     vous  considerez  de  continuer  a developper en a.out pour quelque
     raison que ce soit.

  +o  BBSSDD  ccuurrsseess.  Si  vous  trouvez  des  executables  qui  necessitent
     libcurses.so.1,  c'est l'ancienne version de la bibliotheque curses
     de BSD. Ils sont plutot rares, ce qui est plutot  une  bonne  chose
     car je ne peux pour l'instant pas mettre la main sur une version en
     code source de cette bibliotheque. Il est  probablement  preferable
     de  recompiler  de  tels  programmes  de maniere a fonctionner avec
     ncurses. Vous trouverez une version  compilee  de  libcurses.so  ds
     libc-5.0.9.bin.tar.gz sur les sites miroirs de tsx-11.

  +o  BBeerrkkeelleeyy  ddbb:  les  nouvelles  routines  BSD  4.4  libdb de base de
     donnees.        Le        source         est         telechargeable
     <ftp://ftp.cs.berkeley.edu/ucb/4bsd/db.1.85.tar.gz/>  et  le  patch
     pour    les    bibliotheques    partagees    sous     Linux     est
     <ftp://ftp.uk.linux.org/pub/Linux/libc/non-core/db.patch>.

  +o  CC++++:  le  paquetage  gcc  est  fourni  avec  g++,  mais  vous aurez
     egalement  besoin  de   libg++-2.7.1.4.bin.tar.gz   pour   compiler
     n'importe  quel programme C++ utile. Pour ma part, je n'utilise pas
     C++  mais je suis en mesure de comprendre qu'il n'est pas  aise  de
     compiler  cela a partir du code source d'ou la recommandation quant
     aux versions compilees.

  +o  tteerrmmccaapp ccoommppaattiibbllee GGNNUU. Le passage a  ncurses  ne  s'est  pas  fait
     simultanement  au  passage  a  ELF  -  vous  pourriez  avoir besoin
     d'executer des programmes d'autres personnes qui font appel a cette
     bibliotheque.  gdb  en est un bon exemple. Si vous avez l'intention
     de deboguer des bibliotheques partagees et que gdb est trouble  par
     celles  qui sont liees a elles-memes, vous voudrez certainement une
     copie statiquement liee de celle-ci. Dans ce  cas,  vous  trouverez
     qu'un  veritable termcap est bien moins encombrant que des routines
     compatibles termcap dans ncurses.

     termcap-2.0.8.tar.gz se trouve sur tsx-11.  Ce _n_'_e_s_t _p_a_s le Termcap
     GNU,   mais   il  lui  est  compatible  (les  differences  resident
     apparamment dans le controle des erreurs). C'est  un  paquetage  en
     version code source.

  +o  MMAAKKEEDDEEVV.   Dans  certaines implementations, cette utilitaire efface
     les entrees existantes des peripheriques pour les  recreer  par  la
     suite.  Cela  peut planter certaines versions de ld-linux.so.1 s'il
     efface  /dev/zero.  Une   nouvelle   version   est   disponible   a
     <ftp://sunsite.unc.edu/pub/Linux/system/Admin/MAKEDEV-C-1.5.tar.gz>
     ou
     <ftp://sunsite.unc.edu/pub/Linux/system/Admin/MAKEDEV-2.2.tar.gz>.

  +o  modules-2.0.0. Si vous utilisez des modules, la  mise  a  jour  des
     binutils   que   vous   allez  bientot  effectuer  va  empecher  le
     fonctionnement de tous les utilitaires de modules plus vieux que la
     1.3.69.  Les  nouvelles  versions des modules peuvent etre obtenues
     sur  <http://www.pi.se/blox/>.

  +o  Le systeme XX wwiinnddooww  comporte  un  grand  nombre  de  bibliotheques
     partagees.  Comme vos nouveaux programmes seront en ELF, et que les
     programmes ELF ne peuvent tirer  partie  des  bibliotheques  a.out,
     vous  allez  avoir  besoin d'une nouvelle installation de X si vous
     voulez faire un tant soit peu  de  developpement  sous  X.  XFree86
     3.1.2  est  diponible  sous les formats ELF et a.out. Allez par ftp
     sur ftp.xfree86.org, lisez le message "too  many  users"  que  vous
     n'allez  pas  manquer  de lire et choisissez le site miroir le plus
     proche  de  chez  vous.  Une  fois  que  vous  avez  recupere   les
     repertoires   common   et   elf,   vous   aurez   alors   a  editer
     /usr/X11R6/lib/X11/config/linux.cf   pour   modifier   les   lignes
     suivantes:

       #define LinuxElfDefault         NO
       #define UseElfFormat            NO

  en  mettant YES a la place. Autrement, une compilation de xpm conduira
  a utiliser les anciens utilitaires du passe. Notez que les executables
  de Xfree86 necessitent maintenant qu'une bibliotheque termcap partagee
  en ELF (libtermcap.so.2) soit installee.

  Si vous utilisez Motif, contactez votre fournisseur pour  savoir  s'il
  est  en  mesure de vous fournir des librairies partagees Motif en ELF.
  Ne l'utilisant pas, je ne vous suis d'aucune utilite a ce sujet.

  +o  Si vous passez a Linux 2.0 en meme temps que votre mise  a  jour  a
     ELF,  n'oubliez  pas  de consulter le fichier Documentation/Changes
     qui est fourni avec les sources du noyau pour  voir  de  quoi  vous
     aurez besoin par ailleurs.

  22..44..  RReeaarrrraannggeemmeenntt ddee vvoottrree ssyysstteemmee ddee ffiicchhiieerrss..

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

  1.

      pprriimmoorrddiiaall ------ iinnssttaallllaattiioonn ddeess eexxeeccuuttaabblleess

  2. Creez les nouveaux repertoires dans lesquels vous allez deplacer 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. Detarrez le paquetage de l'editeur de liens dynamique  ld.so-1.7.14
     dans  le  repertoire dans lequel vous mettez habituellement le code
     source et lisez de suite  le  script  ld.so-1.7.14/instldso.sh  qui
     vient  d'etre  decompresse.  Si  vous  avez  reellement  un systeme
     standard, lancez-le en tapant sh instldso.sh, mais si il y  a  quoi
     que ce soit d'anormal, installez-le a la main. Par anormal, je veux
     dire:

  +o  utiliser zsh comme shell (certaines  versions  de  zsh  definissent
     $VERSION, ce qui semble gener instldso.sh)

  +o  avoir  des liens symboliques de /lib/elf vers /lib (ce dont vous ne
     devriez pas avoir besoin mais c'est  une  bien  pietre  consolation
     quand vous etes a la recherche de votre disquette de sauvetage)

  4. Editez   /etc/ld.so.conf  pour  y  ajouter  le  nouveau  repertoire
     /usr/i486-linuxaout/lib  (et  /lib-aout  si  vous  allez  en  avoir
     besoin).   Relancez  ensuite  /sbin/ldconfig -v pour verifier qu'il
     prend en compte les nouveaux repertoires.

  5. Deplacez toutes les bibliotheques a.out dans /usr/lib et /usr/*/lib
     vers   /usr/i486-linuxaout/lib.    Notez   que   j'ai   ecrit   les
     bibliotheques et non pas tous les fichiers. Ce  sont  les  fichiers
     qui  correspondent  a  la  specification  lib*.so*  ,  lib*.sa*, ou
     lib*.a.  Ne commencez pas a deplacer 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  bibliotheques  X (libX*.so.3*), laissez-les
     egalement la car  Xview  et  d'autres  paquetages  en  ont  besoin.
     Laissez  les  fichiers  ld.so*,  ld-linux.so*  et  tous  les autres
     fichiers  commencant  par  ld.  Pour  ce   qui   est   des   autres
     bibliotheques  (s'il  en reste), si vous avez /usr sur la partition
     racine, mettez-les dans /usr/i486-linuxaout/lib. Si /usr est  monte
     separement,  mettez-les  dans /lib-aout. Lancez maintenant ldconfig
     -v.

  7. Effacez le repertoire /usr/lib/ldscripts s'il  existe,  en  vue  de
     l'installation des binutils (qui va le recreer)

  8. Effacez  toutes  les  copies de ld et de  as (_e_x_c_e_p_t_e ld86 et as86)
     que vous trouverez dans /usr/bin.

  9. Vous devez nettoyez votre arborescence /usr/include. Sur un systeme
     normal,  certains  des   fichiers  qui  se  trouvent  ici  sont des
     fonctionnalites de base  et  sont  fournis  avec  libc,  alors  que
     d'autres  proviennent  d'autres  paquetages que vous ou l'auteur de
     votre distribution avez installe. En  tenant  compte  de  cela,  je
     suggere que vous la reconstruisiez a partir de rien: renommez-la en
     /usr/include.old, et extractez libc-5.2.18.bin.tar.gz a  partir  du
     repertoire racine.

  10.
     Installez      le      paquetage      binutils.       tar     -xvzf
     binutils-2.6.0.12.bin.tar.gz -C /  est  une  bonne  maniere  de  le
     faire.

  11.
     Le  paquetage  gcc  doit  etre  extracte  a 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  ecraser  et
  que  vous  voudriez conseerver (par exemple, si vous avez installe Gnu
  ADA, vous voudrez conserver /usr/bin/gcc), et tapez juste:

  # tar -zxf gcc-2.7.2.bin.tar.gz -C /

  A cette etape, vous devriez etre en mesure d'executer  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  sur  du programme traditionnel "Hello, world". Essayez-le
  avec gcc et avec gcc -b i486-linuxaout pour verifier que les  compila-
  teurs a.out et ELF sont bien configures.

  Termine?  Pas exactement. Les bibliotheques qui ne sont pas de base ne
  sont pas encore installees  et  de  nombreux  liens  symboliques  sont
  encore a etablir. Courage...

   LLiieennss ssyymmbboolliiqquueess

  12.
     Certains  programmes (notamment de nombreux programmes X) utilisent
     /lib/cpp,  qui  sous  Linux   est   generalement   un   lien   vers
     /usr/lib/gcc-lib/i486-linux/_v_e_r_s_i_o_n/cpp. Comme l'etape precedente a
     tres certainement  efface  la  version  de  cpp  vers  laquelle  il
     pointait, vous allez devoir recreer le lien:

       # cd /lib
       # ln -s /usr/lib/gcc-lib/i486-linux/2.7.2/cpp .

  13.
     Quand  vous  avez  deplace /usr/include vers /usr/include.old, vous
     avez perdu les liens  symboliques  a  l'interieur  des  sources  du
     noyau. Faites:

  # cd /usr/include
  # ln -s ../src/linux/include/linux .
  # ln -s ../src/linux/include/asm .

  (en considerant que vos sources du noyau sont dans /usr/src/linux).

  14.
     Les  gens de FSSTND se sont justifies de l'avoir garde en deplacant
     les fichiers utmp et wtmp de /var/adm  vers  /var/run  et  /var/log
     respectivement.  Vous  allez  devoir creer des liens en fonction de
     leurs emplacements et vous aurez peut-etre a creer les  repertoires
     /var/log  et /var/adm. Je reproduis ci-dessous le resultat de ls -l
     sur mon systeme:

       $ 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  (a  partir  des  archives  de  la  LDP  telles  que
  <ftp://sunsite.unc.edu/pub/Linux/docs/fsstnd/>) pour les details.

  RReejjoouuiisssseezz--vvoouuss!!

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

  PPaaqquueettaaggeess eesssseennttiieellss eenn ccooddee ssoouurrccee

  15.
     LL''  iinnssttaallllaattiioonn  ddee  nnccuurrsseess est un travail de longue haleine bien
     que vous puissiez  profiter  du  temps  de  compilation  pour  lire
     l'Usenet.  Apres avoir decompresse le fichier tar, lisez le fichier
     INSTALL en vous considerant comme "un constructeur de  distribution
     Linux  ou  de  paquetages", a savoir que vous allez probablement le
     configurer avec une commande du style

       $ ./configure --with-normal --with-shared --disable-termcap --enable-overwrite --prefix=/usr

  Prenez egalement garde aux commentaires qui concernent le type de ter-
  minal  par defaut: dans les noyaux 1.3 et 2.0, on le definit par linux
  au moment du boot mais vous aurez peut-etre a editer /etc/inittab pour
  eviter de le redefinir en tant que console par getty.
  Si  /usr/lib/terminfo  ne se trouve pas sur le disque racine (qui con-
  tient /), vous allez avoir  affaire  au  "support  du  fallback"  avec
  ncurses.  Ceci  est  documente  dans  le fichier INSTALL mentionne ci-
  dessus: c'est simple mais penible car vous allez  devoir  compiler  la
  bibliotheque  deux fois. Si le fait d'avoir linux et vt100 comme fall-
  backs ne vous derange pas, vous  pouvez  copier  fallback.c  que  vous
  trouverez   a    <ftp://ftp.uk.linux.org/pub/Linux/libc/non-core/fall-
  back.c> sur l'existant.

  Apres avoir  installe  ncurses,  vous  allez  devoir  bidouiller  dans
  /usr/lib  car il y fait des choses non optimales qu'il est plus simple
  de reparer a la main. Notez que les contradictions entre  les  numeros
  de  version,  bien  que  peu agreables, ne sont d'aucun danger pour la
  sante humaine.

     a. /usr/lib/libncurses.so.1.9.9e devrait etre deplace vers /lib  de
        maniere  a ce que les programmes curses qui fonctionnent en mode
        mono-utilisateur continuent a le faire. Si  /usr/lib  se  trouve
        sur  votre  partition racine, cela n'est pas necessaire bien que
        cela ne fasse pas de mal.

     b. Dans /lib, etablissez un lien vers  libncurses.so.1.9.9e  appele
        libncurses.so.3.0.

     c. Vous  aurez  egalement  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 resumer, 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   ggddbbmm.  Decompressez  le  code  source  dans  un
     repertoire de  code  source,  appliquez  le  patch  gdbm.patch,  et
     consultez les fichiers README et INSTALL.

     La procedure 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 derniere etape est pour la compatibilite ascendante: certaines dis-
  tributions utilisent  libgdbm.so.2  qui  contient  le  meme  code  que
  libgdbm.so.1 mais mal numerote pour des raisons historiques.

  PPaaqquueettaaggeess  ooppttiioonnnneellss  eenn  ccooddee  ssoouurrccee. En general, vous pouvez vous
  contenter de les installer en suivant les procedures qu'ils  indiquent
  que je ne vais donc pas repeter. Il y a toutefois deux exceptions:

  17.
     Si  vous voulez tteerrmmccaapp vveerrssiioonn GGNNUU (optionnel a strictement parler
     mais necessaire pour utiliser les  executables  XFree86),  il  doit
     etre  compile a partir du code source mais cela ne devrait pas etre
     plus complique 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 _n_e _p_a_s faire make install pour ne pas compromet-
  tre  l'installation anterieure de ncurses. Si vous avez besoin de com-
  piler des choses a partir de cette bibliotheque plutot que  simplement
  executer  des executables faits avec elle, pensez a placer en lieu sur
  les fichiers d'en-tete et les bibliotheques statiques  et  a  utiliser
  les  commutateurs  -I  et -L quand vous compilerez les choses en ques-
  tion. L'aspect vague de cette description  devrait  rendre  clair  que
  l'utilisation  de  termcap est deconseillee a 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

  +o  vous n'appliquez pas PORT/linux/OTHER_PATCHES car  il  est  contenu
     dans ce patch

  +o  vous   installez   les  fichiers  d'en-tete  autre  part  que  dans
     /usr/include --- il y  a  en  effet  conflit  avec  ceux  que  gdbm
     utilise.  Pour  compiler les programmes qui necessitent libdb, vous
     devrez  ajouter   -I/usr/include/db  a  la  ligne  de  commande  du
     compilateur C.

  22..55..  AA qquuooii cceellaa ddeevvrraaiitt rreesssseemmbblleerr ((lleess ggrraannddeess lliiggnneess ddee ll''aarrbboorreess--
  cceennccee ddeess rreeppeerrttooiirreess))

  Ceci  est  un guide deliberement vague qui indique en gros ce que sont
  les fichiers que vous venez d'installer. Cela peut etre utile dans  un
  contexte de depannage ou si vous decidez d'effacer quelque chose.

  22..55..11..
   //lliibb

  +o  L'editeur  dynamique  de liensld.so (a.out) et ld-linux.so.1 (ELF).
     Chacun d'entre eux peut etre un lien symbolique mais  verifiez  que
     les fichiers vers lesquels ils pointent existent.

  +o  Les bibliotheques partagees de base libc.so.4 et libm.so.4 (a.out).
     Ce sont des liens symboliques dont il faut verifier qu'ils pointent
     vers des fichiers reels.

  +o  Les   bibliotheques   partagees   de   base  libc.so.5,  libm.so.5,
     libdl.so.1,libncurses.so.1,libtermcap.so.2,  (ELF).    Encore   des
     liens symboliques, meme remarque que ci-dessus

  22..55..22..  //uussrr//lliibb

  +o  Tous  les  fichiers  qui  ne  sont  pas  des  bibliotheques  et les
     repertoires qui etaient la auparavant.

  +o  libbfd.so*,libdb.so*, libgdbm.so*: bibliotheques partagees ELF.

  +o  Encore des liens symboliques. Pour chacune des  bibliotheques  dans
     /lib ou /usr/lib, il devrait y avoir un lien symbolique ici. Le nom
     du lien devrait etre le veritable nom du  fichier  en  enlevant  le
     numero de version. Par exemple libc,

  lrwxrwxrwx   1 root     root           14 May  2 20:09 /lib/libc.so.5 -> libc.so.5.3.12
  -rwxr-xr-x   1 bin      bin        583795 Apr 25 06:15 /lib/libc.so.5.3.12
  lrwxrwxrwx   1 root     root           12 Oct 27  1995 /usr/lib/libc.so -> /lib/libc.so.5

  Ces liens sont utilises par ld au moment de l'edition des liens.

  +o  libbsd.a,  libgmon.a, libmcheck.a, libmcheck.a et un fichier lib*.a
     pour chacune des bibliotheques partagees ELF dans /lib et /usr/lib.
     Les  bibliotheques  ELF statiques. Celles qui sont l'equivalent des
     librairies partagees ne seront pas d'une  grande  utilite  pour  la
     plupart  des gens --- quand vous utilisez ELF, vous pouvez employer
     le commutateur gcc -g avec les bibliotheques partagees,  il  n'y  a
     donc  plus  de  raison  d'utiliser les versions statiques.  _V_o_u_s _e_n
     _a_u_r_e_z _b_e_s_o_i_n si vous voulez deboguer les bibliotheques elles-memes.

  +o  crt0.o,  gcrt0.o.   fichiers de "debut de programme" en a.out; l'un
     d'entre eux est lie en tant que premier fichier dans tout programme
     a.out  que  vous  compilez, a moins que vous ne vous arrangiez pour
     qu'il n'en soit pas ainsi.

  +o  crt1.o,  crtbegin.o,  crtbeginS.o,  crtend.o,  crtendS.o,   crti.o,
     crtn.o,  gcrt1.o.   Fichiers  de  demarrage  ELF.  Ils font la meme
     chose que les fichiers *crt0.o ci-dessus pour les programmes ELF.

  22..55..33..
   //uussrr//lliibb//llddssccrriippttss

  +o  C'est la que les scripts de gestionnaires de peripheriques pour  ld
     vont, comme le nom le suggere. Cela devrait ressembler a:

       $ ls /usr/lib/ldscripts/
       elf_i386.x      elf_i386.xs     i386coff.xn     i386linux.xbn
       elf_i386.xbn    elf_i386.xu     i386coff.xr     i386linux.xn
       elf_i386.xn     i386coff.x      i386coff.xu     i386linux.xr
       elf_i386.xr     i386coff.xbn    i386linux.x     i386linux.xu

  22..55..44..  //uussrr//ii448866--lliinnuuxx//bbiinn

  +o  ar, as, gasp, ld, nm, ranlib, strip.  Ce sont des liens symboliques
     vers les binutils reels de /usr/bin.

  22..55..55..  //uussrr//ii448866--lliinnuuxxaaoouutt//bbiinn

  +o  as --- l'assembleur a.out, and gasp, son preprocesseur de macro

  +o  ar, ld, nm, ranlib, strip --- liens symboliques vers  les  binutils
     reels de /usr/bin

  22..55..66..  //uussrr//ii448866--lliinnuuxx//lliibb

  +o  ldscripts est un lien symbolique vers /usr/lib/ldscripts.

  22..55..77..  //uussrr//ii448866--lliinnuuxxaaoouutt//lliibb

  +o  lib*.so*. Images de la bibliotheque partagee a.out. Necessaire pour
     executer des programmes a.out.

  +o  lib*.sa. Bases de la bibliotheque partagee a.out. Necessaires  pour
     compiler  les  programmes  a.out  qui  utilisent  des bibliotheques
     partagees. Si vous n'en avez  pas  l'intention,  vous  pouvez  sans
     probleme les effacer.

  +o  lib*.a.  Bibliotheques  statiques  a.out. Necessaires pour compiler
     les programmes statiques a.out (a savoir quand vous  compilez  avec
     -g).  Vous  pouvez aussi les effacer si vous n'avez pas l'intention
     de compiler de tels programmes.

  +o  ldscripts est un lien symbolique vers /usr/lib/ldscripts

  22..55..88..  //uussrr//lliibb//ggcccc--lliibb//ii448866--lliinnuuxx//22..77..22

  +o  Ce repertoire contient une version de  gcc  2.7.2  configuree  pour
     compiler les programmes ELF.

  22..55..99..  //uussrr//lliibb//ggcccc--lliibb//ii448866--lliinnuuxxaaoouutt//22..77..22

  +o  Ce  repertoire  contient  une  version de gcc 2.7.2 configuree pour
     compiler les programmes a.out  qui  tient  compte  de  la  nouvelle
     arborescence  de  repertoires.   Si  vous n'avez pas l'intention de
     compiler quoi que ce  soit  en  a.out,  l'effacer  devrait  liberer
     environ  4Mo.  Notez  que  vous  devez les conserver si vous voulez
     compiler des noyaux 1.2 non-patches.

  22..66..  EErrrreeuurrss ccoommmmuunneess ------ NNee ppaanniiqquueezz ppaass!!

  +o  Vous avez deplace la mauvaise chose  et  maintenant  plus  rien  ne
     fonctionne

     Votre  shell tourne toujours et en vous donnant un peu de mal, vous
     pouvez faire  beaucoup  avec  les  commandes  integrees  du  shell.
     Souvenez  vous  que  echo  *  remplace  tres  bien  ls, et que echo
     >>filename peut etre utilise pour ajouter des lignes a un  fichier.
     N'oubliez  pas  non plus que ldconfig est lie statiquement. Si vous
     avez deplace, par exemple,  libc.so.4 vers  /lib-aout  par  erreur,
     vous  pouvez faire echo "lib-aout" >>/etc/ld.so.conf ; ldconfig -v/
     et vous retrouver sur vos pieds. Si vous avez  deplace  /lib/ld.so,
     vous  pourrez  surement faire sln /silly/place/ld.so /lib/ld.so, si
     ln est lie statiquement, et une fois de plus vous retrouver sur vos
     pieds.

  +o   bad address

     quand vous essayez d'executer quoi que ce soit d'ELF. Vous utilisez
     un noyau 1.3._x, ou _x<3. Arretez tout de suite. Ce sont probablement
     les  noyaux les plus bogues de la planete. Passez au 2.0 ou revenez
     au 1.2.13.  Certaines personnes  font  egalement  etat  de  "kernel
     panics" dans des circonstances similaires; je ne me suis pas penche
     sur la question principalement parce que je ne vois pas de  raisons
     d'utiliser  les  noyaux  de  developpement  sans suivre les mises a
     jour.

  +o   gcc: installation problem, cannot exec _q_u_e_l_q_u_e _c_h_o_s_e: No such file
     or directory

     quand  vous  essayez de faire des compilations a.out (_q_u_e_l_q_u_e _c_h_o_s_e
     est generalement cpp ou cc1). Ou bien cela est vrai  ou  bien  vous
     avez tape

       $ gcc -b -i486-linuxaout

  quand vous auriez du taper

       $ gcc -b i486-linuxaout

  Le "i486" ne commence _p_a_s par un tiret.

  +o  make: *** No targets specified and no makefile found.  Stop.

     indique  que  vous n'avez pas patche ou recompile make, ou que vous
     en avez toujours une vieille version quelque part sur le systeme.

  +o   no such file or directory: /usr/bin/gcc

     (ou n'importe quel autre fichier que vous essayez d'executer) quand
     vous  _s_a_v_e_z  qu'un  tel fichier existe. Cela veut generalement dire
     que le chargeur dynamique ELF /lib/ld-linux.so.1 n'est pas installe
     ou  est illisible pour une raison ou pour une autre. Vous auriez du
     l'installer anterieurement, aux alentours de l'etape 2.

  +o   not a ZMAGIC file, skipping

     selon ldconfig. Vous avez une vieille version du  paquetage  ld.so,
     donc recuperez-en une plus recente. Voir etape 2 de l'installation.

  +o   _setutent: Can't open utmp file

     Ce message apparait souvent en groupe de trois quand vous lancez un
     xterm.  Veuillez  consulter  la  tirade  sur FSSTND vers la fin des
     instructions d'installation.

  33..  CCoommppiillaattiioonn ddeess pprrooggrraammmmeess

  33..11..  PPrrooggrraammmmeess oorrddiinnaaiirreess

  Pour compiler un programme en ELF, utilisez gcc comme  toujours.  Pour
  compiler en a.out, utilisez gcc -b i486-linuxaout .
       $ cat >hello.c
       main() { printf("hello, world\n"); }
       ^D
       $ gcc -o hello hello.c
       $ file hello
       hello: ELF 32-bit LSB executable i386 (386 and up) Version 1
       $ ./hello
       hello, world

  Le  moment  est  peut-etre venu de repondre a la question "si l'option
  par defaut des compilateurs a.out est de produire un programme  appele
  a.out,  quel  nom  un  compilateur  ELF  donne-t-il  en sortie?''.  La
  reponse est toujours a.out.

  33..22..  CCoommppiillaattiioonn ddeess bbiibblliiootthheeqquueess

  Pour compiler libfoo.so  en  une  bibliotheque  partagee,  les  etapes
  fondamentales sont du genre:

       $ gcc -fPIC -c *.c
       $ gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0 *.o
       $ ln -s libfoo.so.1.0 libfoo.so.1
       $ ln -s libfoo.so.1 libfoo.so
       $ export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH

  Cela  generera une bibliotheque partagee appelee libfoo.so.1.0, et les
  liens appropries pour que ld (libfoo.so)  et  l'editeur  dynamique  de
  liens  (libfoo.so.1)  la  trouvent. Comme test, ajoutons le repertoire
  courant a LD_LIBRARY_PATH.

  Quand vous etes satisfaits du fonctionnement de la bibliotheque,  vous
  pourrez  la  deplacer  vers /usr/local/lib par exemple, et recreer les
  liens appropries.  Notez que le lien libfoo.so  devrait  pointer  vers
  libfoo.so.1,  ainsi  n'est-il  pas  necessaire  de  le mettre a jour a
  chaque changement du numero mineur de version. Le lien de  libfoo.so.1
  vers  libfoo.so.1.0  est  garde a jour par ldconfig que la plupart des
  systemes executent lors du processus d'amorcage.

       $ su
       # cp libfoo.so.1.0 /usr/local/lib
       # /sbin/ldconfig
       # ( cd /usr/local/lib ; ln -s libfoo.so.1 libfoo.so )

  33..33..  CCoommppiilleerr eenn aa..oouutt

  Vous pourriez avoir besoin de continuer a compiler des programmes dans
  l'ancien  format  a.out. Pour les programmes normaux, tout ce que vous
  avez a faire pour utiliser  le  compilateur  a.out  est  de  specifier
  l'option  -b i486-linuxaout quand vous appellerez gcc, et -m i386linux
  quand (si) vous appellerez ld. Si vous  devez  toujours  compiler  des
  bibliotheques  partagees DLL a.out, vous avez toute ma sympathie. A ce
  que j'en sais, la reponse la plus courte est que cela ne  marche  pas.
  Envoyez-moi un mail si vous pensez differemment.

  44..  PPaattcchheess eett eexxeeccuuttaabblleess

  Arrive  a ce point, vous pouvez, si vous le voulez, vous arreter. Vous
  avez installe tout ce  qui  est  necessaire  a  la  compilation  et  a
  l'execution de programmes ELF.

  Vous  pourriez cependant vouloir recompiler des programmes en ELF, que
  ce soit par amour du travail bien fait ou pour minimiser l'usage de la
  memoire.  Pour  la  plupart des applications destinees a l'utilisateur
  final, c'est plutot simple. Cependant certains paquetages se  reposent
  trop sur le systeme sur lequel ils tournent et pourraient planter pour
  l'une ou plusieurs des raisons qui suivent:

  +o  Conventions differentes pour  le  soulignement  dans  l'assembleur:
     dans  un executable a.out, les labels externes recoivent le prefixe
     _; pas en ELF. Cela ne fait pas de  difference  a  moins  que  vous
     n'integriez  des  instructions assembleur ecrites a la main: toutes
     les etiquettes de la forme _foo doivent etre traduites en  foo,  ou
     (si  vous  voulez  conserver  la  portabilite)  en EXTERNAL(foo) ou
     EXTERNAL est une macro qui retourne soit son argument  (si  __ELF__
     est  defini)  soit  _  concatene  avec  son  argument  dans  le cas
     contraire.

  +o  Differences de libc 5 par rapport a libc  4.  L'interface  pour  le
     support local a change, pour une fois.

  +o  L'application  ou le processus de compilation selon la connaissance
     du format binaire utilise --- emacs, par exemple, ecrit l'image  de
     sa memoire sur le disque sous format binaire, vous avez donc besoin
     de savoir quel format vos fichiers compiles utilisent.

  +o  L'application est ou comprend des bibliotheques partagees  (X11  en
     est  un  exemple  trivial). Il faudra de maniere evidente faire des
     modifications pour adapter les differentes methodes de creation  de
     bibliotheques partagees en ELF.

  Voici  maintenant deux listes: la premiere presente les programmes qui
  necessitaient des modifications pour pouvoir etre  compiles  sous  ELF
  (c'est-a-dire  dont  vous  devez  obtenir  une  nouvelle  version pour
  pouvoir les compiler en ELF) et la seconde comporte des programmes qui
  necessitent toujours des patches exterieurs.

  44..11..  MMiissee aa jjoouurr::

  +o  DDoosseemmuu.  Maintenant, dosemu tourne avec ELF. Les versions actuelles
     de          dosemu          sont          disponibles           sur
     <ftp://tsx-11.mit.edu/pub/linux/ALPHA/dosemu/>

  +o  ee22ffssuuttiillss.   Les  utilitaires  pour  e2fs  versions 0.5c et plus se
     compilent sans modifications en ELF.

  +o  EEmmaaccss. Il y a potentiellement  deux  problemes:  (i)  Emacs  a  une
     maniere  tout  a fait particuliere de se construire, a savoir qu'il
     faut en executer une version minimale, charger toutes  les  parties
     utiles  en  tant  que  lisp, et ecrire l'image de sa memoire sur le
     disque en tant que fichier binaire. (FSF)  Emacs  19.29  et  XEmacs
     19.12  (anciennement  Lucid  Emacs)  peuvent tous deux detecter que
     vous compilez en ELF et s'y adapter automatiquement.  (ii) Si  vous
     compilez  une  version de emacs sous ncurses, cela va rater a moins
     que vous n'editiez au prealable src/s/linux.h dans la  distribution
     emacs pour y ajouter la ligne #define TERMINFO quelque part pres du
     debut. Cela n'est pas necessaire pour la version 19.31  mais  l'est
     pour  la  version  XEmacs 19.13. Il semblerait que cela soit repare
     dans la 19.14.

  +o  ggddbb 44..1166. Votre copie actuelle de  gdb  continuera  de  fonctionner
     comme par le passe mais le support de la bibliotheque partagee dans
     la 4.16 est  bien  meilleur,  donc  si  vous  voulez  deboguer  des
     programmes  qui manipulent bizarrement cette zone, c'est une mise a
     jour qui vaut le coup.

  +o  LLee NNooyyaauu. Les versions 2.0 du noyau (ou plus recentes) fonctionnent
     a  merveille  avec  ELF;  vous  devez  repondre "yes" a chacune des
     questions:

       Kernel support for ELF binaries (CONFIG_BINFMT_ELF) [Y/m/n/?]
       Compile kernel as ELF - if your GCC is ELF-GCC (CONFIG_KERNEL_ELF) [Y/n/?]

  quand vous executez make config (c'est egalement valable pour la  plu-
  part  des  noyaux  de  la  serie 1.3). Si vous utilisez encore le 1.2,
  veuillez consulter la liste qui suit.

  +o  ppeerrll 55.  Perl 5.001m et + se compilent  sans  modification  sur  un
     systeme   ELF  complet  avec  chargement  dynamique.  Les  versions
     actuelles de Perl  peuvent etre obtenues sur le CPAN (Comprehensive
     Perl               Archive              Network):              voir
     <ftp://ftp.funet.fi/pub/mirrors/perl/CPAN> pour  le  site  le  plus
     proche de chez vous.

  +o  ppss  et  ttoopp.  Procps 0.98 et + marcheront avec ELF (les precedentes
     versions aussi mais elles ne sont pas en mesure de lire  les  WCHAN
     si  vous en avez besoin). Prenez en consideration que les noyaux de
     la serie 2.0 ont de toute maniere besoin de procps 0.99a ou plus.

  +o  Le programme cal dans uuttiill--lliinnuuxx 22..22 ne fonctionne  pas.  Passez  a
     version 2.5 <ftp://tsx-11.mit.edu/pub/linux/packages/utils> ou plus
     recent.

  +o  MMoossaaiicc. Je ne suis pas en mesure de le compiler par  moi-meme  mais
     l'executable  Mosaic  2.7b1  est  disponible par l'intermediaire de
     NCSA en ELF. Il a ete lie sous une configuration  X  etrange,  avec
     pour  resultat  sur  les  systemes normaux qu'il dit ne pas trouver
     libXpm.so.4.5.  Une maniere simple de reparer cela est de  l'editer
     avec precaution avec emacs ou une autre editeur qui prend en charge
     les  fichiers  executables.  Cherchez  l'occurrence  de  la  chaine
     libXpm.so.4.5^@  (ou  ^@  est  un  zero  ASCII --- caractere NUL)),
     effacez le .5 et ajoutez deux caracteres de plus apres le NUL  pour
     ne pas modifier la longueur du fichier.

  44..22..  PPaattcchh

  +o  ffiillee.  Il  fonctionne  de  toute  maniere  mais peut etre ameliore:
     <ftp://ftp.uk.linux.org/pub/Linux/libc/non-core/file.patch>.

  +o  make-3.74 --- soit vous recuperez le code source sur un site GNU et
     appliquez  le patch qui accompagne libc-5.3.12, soit vous recuperez
     l'executable make-3.74.gz sur tsx-11. Il y a un bogue dans le  make
     de  GNU  qui  ne se manifeste qu'avec les nouvelles versions ELF de
     libc --- cela vient en fait d'un bogue dans les anciennes  versions
     de  la  libc  de  GNU,  qui  etait aussi present dans la libc Linux
     jusqu'a peu. Si vous conservez votre vieux programme make en a.out,
     il continuera de fonctionner mais si vous en voulez une version ELF
     il vous faut le patch.

     Les developpeurs GNU de Make sont au courant du bogue et  devraient
     un jour sortir une version corrigee.

  +o  LLee nnooyyaauu 11..22..xx . 3 options s'offrent a vous:

     1. patcher   legerement  le  Makefile  de  maniere  a  utiliser  le
        compilateur a.out.  cd /usr/src/linux/, coupez le patch qui suit
        et  mettez-le  dans  patch  -p1.  Ou  encore  editez le Makefile
        manuellement  en  utilisant  ce  qui  suit  comme  guide;  c'est
        suffisamment  clair  (effacez  les  lignes  comportant  un  - et
        rajoutez les ligne avec un +.

          diff -u linux-1.2.13/Makefile.orig linux/Makefile
          --- linux-1.2.13/Makefile.orig  Wed Aug 16 20:53:26 1995
          +++ linux/Makefile      Fri Dec  8 16:19:49 1995
          @@ -12,9 +12,9 @@
           TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)

          -AS     =as
          -LD     =ld
          -HOSTCC =gcc -I$(TOPDIR)/include
          -CC     =gcc -D__KERNEL__ -I$(TOPDIR)/include
          +AS     =/usr/i486-linuxaout/bin/as
          +LD     =ld  -m i386linux
          +HOSTCC =gcc -b i486-linuxaout -I$(TOPDIR)/include
          +CC     =gcc -b i486-linuxaout -D__KERNEL__ -I$(TOPDIR)/include
           MAKE   =make
           CPP    =$(CC) -E
           AR     =ar

     Autrement,

     2. Appliquez le patch de H J Luqui permet de compiler le  noyau  en
        ELF  (et  ajoute  egalement  comme possibilite de faire des core
        dumps      ELF).      On      peut      le       trouver       a
        <ftp://ftp.cdrom.com/pub/linux/slackware_source/kernel-
        source/v1.2/linuxelf-1.2.13.diff.gz>.

        Si vous utilisez une distribution ELF (RedHat 2.1, Slackware  3)
        qui est fournie avec un noyau de la serie 1.2, vous vous rendrez
        certainement compte que ce patch ou un qui lui est  similaire  a
        deja ete applique.

        La meilleure idee est cependant de probablement

     3. Passer  a la 2.0!  1.2 n'a jamais ete prevu pour ELF apres tout.

     Un autre probleme va se poser pour la compilation  du  1.2.13  avec
     gcc  2.7.2  et superieur; il y avait un bogue dans asm/io.h qui est
     seulement detecte par gcc 2.7.2. Vous devez  vous  munir  du  patch
     <ftp://ftp.uk.linux.org/pub/Linux/libc/misc/io.h>.

  55..  IInnffoorrmmaattiioonnss ccoommpplleemmeennttaaiirreess

  +o  GCC-HOWTO  <GCC-HOWTO.html> comporte un grand nombre d'informations
     utiles quant au developpement de Linux (c'est du moins  ce  que  je
     pense,  j'en  suis le regisseur). Il devrait pouvoir etre obtenu au
     meme endroit que la ou vous avez trouve ce HOWTO, c'est pourquoi le
     lien ci-dessus est un lien relatif.

  +o  La  liste  de  diffusion  linux-gcc (qui est egalement le newsgroup
     linux.dev.gcc, si vous avez un  filtre  de  news  linux.*)  est  le
     meilleur  endroit pour se tenir au courant de ce qui se passe, meme
     sans y poster. N'oubliez pas que ce n'est pas  Usenet:  gardez  vos
     questions a moins que vous ne fassiez du developpement. Pour savoir
     comment rejoindre cette liste  de  diffusion,  envoyez  un  message
     contenant le mot help a majordomo@vger.rutgers.edu. Les archives de
     cette liste sont dans  <http://www.linux.ncm.com/linux-gcc/>.

  +o  Il y a une certaine masse d'information  relative  a  ce  que  fait
     cette   liste   de   diffusion   a  l'adresse  linux-gcc  web  page
     <http://ftp.uk.linux.org/~barlow/linux/gcc-list.html>,   quand   je
     pense  a  la mettre a jour. Vous y trouverez egalement un lien vers
     la derniere version de ce  HOWTO  et  les  patches  auquels  il  se
     refere. Pour les personnes des USA et ceux qui ont de mauvais acces
     sur les sites universitaires de Grande-Bretagne (a savoir quiconque
     est   en   dehors   de   l'universite),   il   y   a  un  miroir  a
     <http://www.blackdown.org/elf/elf.html>

  +o  D'autres documents sur  le  format  de  fichiers  sont  sur  tsx-11
     <ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ELF.doc.tar.gz>.    Ce
     sera probablement d'une  grande  utilite  pour  les  personnes  qui
     veulent  comprendre,  deboguer  ou bien reecrire des programmes qui
     ont directement a voir avec des objets executables.

  +o  Le document de H  J  Lu  ELF:  From  The  Programmer's  Perspective
     <ftp://tsx-11.mit.edu/pub/linux/packages/GCC/elf.latex.tar.gz>
     contient  un  grand  nombre  d'informations  tres  utiles  et  plus
     detaillees quant a la programmation avec ELF. Si vous n'avez pas de
     capacites LaTeX, il existe egalement au format PostScript.

  +o  Des informations sur la bibliotheque nnccuurrsseess et la base de  donnees
     terminfosont  disponibles  sur Eric Raymond's ncurses resource page
     <http://www.ccil.org/~esr/ncurses.html>.

  +o  Une page de manuel traite de dlopen(3) et des fonctions afferentes,
     elle est fournie avec le paquetage ld.so.

  66..  GGeenneerraalliitteess

  66..11..  CCoommmmeenntt mmee ccoonnttaacctteerr

  Envoyez  moi  un  mail a daniel.barlow@linux.org.  Ma cle publique PGP
  (ID     5F263625)     se     trouve     sur     mes     pages      web
  <http://ftp.uk.linux.org/~barlow/>, si vous tenez a confidentialite.

  Pour  toute question auquel ce document aurait du repondre mais ne l'a
  pas fait, ecrivez moi. Si vous avez une question qui n'a pas sa  place
  ici  mais  dont vous pensez que j'en possede la reponse, veuillez tout
  d'abord la poster  sur  le  newsgroup  comp.os.linux.*  approprie;  je
  reponds generalement au mail mais il m'est arrive d'oublier.

  Quiconque   s'autoriserait  a  me  rajouter  a  des  listes  d'adresse
  publicitaires s'expose a de graves consequences.
  66..22..  TTrraadduuccttiioonnss

  Si vous desirez traduire ce document, faites-le mais parlez m'en!  Les
  chances  que  je parle la langue dans laquelle vous voulez le traduire
  sont tristement faibles mais cela mis a part, je serai heureux de vous
  aider de quelque maniere que ce soit.

  Les traductions dont j'ai connaissance sont:

  +o  Italian  <http://www.psico.unipd.it/ildp/docs/HOWTO/ELF-HOWTO.html>
     par Favro Renata.  (d'autres HOWTOs sont disponibles en italien sur
     <http://www.psico.unipd.it/ildp/docs/HOWTO/INDEX.html>.

  +o  Kojima  Mitsuhiro  a  fait une traduction japonaise, disponible sur
     <http://jf.gee.kyoto-u.ac.jp/JF/index.html>.

  +o  Traduction de Pierre Tane  <ftp://ftp.lip6.fr/pub/linux/french>

  66..33..  NNoottiioonnss lleeggaalleess

  Toutes  les  marques  deposees  mentionnees  dans  ce  document   sont
  reconnues comme etant la propriete de leurs auteurs respectifs.

  Le  droit de Daniel Barlow a etre reconnu comme l'auteur de ce texte a
  ete certifie en accord avec les sections 77 et 78 du Copyright Designs
  and Patents Act 1988.

  (C)   1996   Daniel  Barlow  <daniel.barlow@linux.org>  Il  peut  etre
  reproduit et distribue en entier ou en morceaux, que  le  medium  soit
  physique  ou  electronique,  tant que l'avertissement de copyright est
  conserve dans chacune des copies. La  redistribution  commerciale  est
  permise  et  encouragee;  cependant,  l'auteur  voudrait  etre tenu au
  courant de telles distributions.

  Toutes les traductions, travaux  derives  ou  travaux  de  compilation
  incorporant  n'importe  lequel des documents HOWTO  Linux tombent sous
  le coup de cette notification de copyright.  Ainsi, vous ne pouvez pas
  produire  un  travail  derive  d'un  HOWTO et imposer des restrictions
  additionnelles quant a sa  diffusion.  Des  exceptions  a  ces  regles
  peuvent  etre  accordees sous certaines conditions; veuillez contacter
  le coordinateur des Linux HOWTOs a l'adresse donnee plus bas.

  En resume, nous voulons promouvoir la diffusion de ces informations  a
  travers  le  plus  grand  nombre  de  canaux possible. Cependant, nous
  souhaitons  conserver  le  copyright  sur  les  documents  HOWTO,   et
  voudrions etre notifies de tout projet de redistribution des HOWTOs.

  Si  vous  avez  des questions, contactez Greg Hankins, le coordinateur
  des Linux HOWTOs, a gregh@sunsite.unc.edu.

