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