Le HOWTO ELF
 Daniel Barlow <[email protected]>
 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.

 11..  QQuu''eesstt--ccee qquuee EELLFF?? IInnttrroodduuccttiioonn..

 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.

 11..11..  CCee qquu''EELLFF nn''eesstt ppaass

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

    CCee nn''eesstt ppaass uunn mmooyyeenn dd''eexxeeccuutteerr ddeess pprrooggrraammmmeess SSVVRR44 oouu SSoollaarriiss
       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.

    CCee nn''eesstt ppaass iinnttrriinnsseeqquueemmeenntt pplluuss ccoommppaacctt oouu pplluuss rraappiiddee
       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.

    IIll nn''eesstt ppaass nneecceessssaaiirree ddee rreemmppllaacceerr cchhaaccuunn ddeess eexxeeccuuttaabblleess ddee
       vvoottrree ssyysstteemmee
       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 :-).

    RRiieenn aa vvooiirr aavveecc TToollkkiieenn
       Du moins pas dans ce contexte.

 11..22..  PPoouurrqquuooii ssee ccoonnvveerrttiirr aa EELLFF ??

 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.

 11..33..  CCoommmmeenntt ssee ccoonnvveerrttiirr aa EELLFF

 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 ?

 22..  IInnssttaallllaattiioonn

 22..11..  PPrreerreeqquuiiss

 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.

 22..22..  AAvvaanntt ddee ccoommmmeenncceerr :: nnootteess eett mmiisseess eenn ggaarrddeess

 +o  Il va vous falloir tourner sous un noyau posterieur au 1.1.52  aavveecc
    ssuuppppoorrtt ddeess ffiicchhiieerrss eexxeeccuuttaabblleess EELLFF. 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...

 22..33..  NNoottiioonnss

 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.

 22..33..11..  LLeess eesssseennttiieellss

 +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).

 22..33..22..  AAuuttrreess

 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 ccoommppaattiibbiilliittee aa..oouutt : 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  BBSSDD  ccuurrsseess.  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  BBeerrkkeelleeyy  ddbb:  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  CC++++:  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  tteerrmmccaapp ccoommppaattiibbllee GGNNUU. 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  MMAAKKEEDDEEVV.   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 XX wwiinnddooww  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.

 22..44..  RReeaarrrraannggeemmeenntt ddee vvoottrree ssyysstteemmee ddee ffiicchhiieerrss..

 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.

     pprriimmoorrddiiaall ------ iinnssttaallllaattiioonn ddeess eexxeeccuuttaabblleess

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

  LLiieennss ssyymmbboolliiqquueess

 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.

 RReejjoouuiisssseezz--vvoouuss!!

 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.

 PPaaqquueettaaggeess eesssseennttiieellss eenn ccooddee ssoouurrccee

 15.
    LL''  iinnssttaallllaattiioonn  ddee  nnccuurrsseess 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   ggddbbmm.  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.

 PPaaqquueettaaggeess  ooppttiioonnnneellss  eenn  ccooddee  ssoouurrccee. 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 tteerrmmccaapp vveerrssiioonn GGNNUU (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.

 22..55..  AA qquuooii cceellaa ddeevvrraaiitt rreesssseemmbblleerr ((lleess ggrraannddeess lliiggnneess ddee ll''aarrbboorreess--
 cceennccee ddeess rreeppeerrttooiirreess))

 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.

 22..55..11..
  //lliibb

 +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

 22..55..22..  //uussrr//lliibb

 +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.

 22..55..33..
  //uussrr//lliibb//llddssccrriippttss

 +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

 22..55..44..  //uussrr//ii448866--lliinnuuxx//bbiinn

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

 22..55..55..  //uussrr//ii448866--lliinnuuxxaaoouutt//bbiinn

 +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

 22..55..66..  //uussrr//ii448866--lliinnuuxx//lliibb

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

 22..55..77..  //uussrr//ii448866--lliinnuuxxaaoouutt//lliibb

 +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

 22..55..88..  //uussrr//lliibb//ggcccc--lliibb//ii448866--lliinnuuxx//22..77..22

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

 22..55..99..  //uussrr//lliibb//ggcccc--lliibb//ii448866--lliinnuuxxaaoouutt//22..77..22

 +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.

 22..66..  EErrrreeuurrss ccoommmmuunneess ------ NNee ppaanniiqquueezz ppaass!!

 +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.

 33..  CCoommppiillaattiioonn ddeess pprrooggrraammmmeess

 33..11..  PPrrooggrraammmmeess oorrddiinnaaiirreess

 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.

 33..22..  CCoommppiillaattiioonn ddeess bbiibblliiootthheeqquueess

 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 )

 33..33..  CCoommppiilleerr eenn aa..oouutt

 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.

 44..  PPaattcchheess eett eexxeeccuuttaabblleess

 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.

 44..11..  MMiissee aa jjoouurr::

 +o  DDoosseemmuu.  Maintenant, dosemu tourne avec ELF. Les versions actuelles
    de          dosemu          sont          disponibles           sur
    <ftp://tsx-11.mit.edu/pub/linux/ALPHA/dosemu/>

 +o  ee22ffssuuttiillss.   Les  utilitaires  pour  e2fs  versions 0.5c et plus se
    compilent sans modifications en ELF.

 +o  EEmmaaccss. 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  ggddbb 44..1166. 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  LLee NNooyyaauu. 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  ppeerrll 55.  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  ppss  et  ttoopp.  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 uuttiill--lliinnuuxx 22..22 ne fonctionne  pas.  Passez  a
    version 2.5 <ftp://tsx-11.mit.edu/pub/linux/packages/utils> ou plus
    recent.

 +o  MMoossaaiicc. 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.

 44..22..  PPaattcchh

 +o  ffiillee.  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  LLee nnooyyaauu 11..22..xx . 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>.

 55..  IInnffoorrmmaattiioonnss ccoommpplleemmeennttaaiirreess

 +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 [email protected]. 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 nnccuurrsseess 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.

 66..  GGeenneerraalliitteess

 66..11..  CCoommmmeenntt mmee ccoonnttaacctteerr

 Envoyez  moi  un  mail a [email protected].  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.
 66..22..  TTrraadduuccttiioonnss

 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>

 66..33..  NNoottiioonnss lleeggaalleess

 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  <[email protected]>  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 [email protected].