Le HOWTO ELF Daniel Barlow 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 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 , , et d'autres sites miroir (NdT: comme 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 ou encore sur . 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 et vous aurez besoin du 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 et le patch pour les bibliotheques partagees sous Linux est . +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 ou . +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 . +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 ) 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 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 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 +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 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 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: . +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 . 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 . 55.. IInnffoorrmmaattiioonnss ccoommpplleemmeennttaaiirreess +o GCC-HOWTO 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 . +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 , 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 +o D'autres documents sur le format de fichiers sont sur tsx-11 . 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 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 . +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 daniel.barlow@linux.org. Ma cle publique PGP (ID 5F263625) se trouve sur mes pages web , 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 par Favro Renata. (d'autres HOWTOs sont disponibles en italien sur . +o Kojima Mitsuhiro a fait une traduction japonaise, disponible sur . +o Traduction de Pierre Tane 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 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. .