]> granicus.if.org Git - apache/blob - docs/manual/dso.xml.fr
Rebuild transformations/translations
[apache] / docs / manual / dso.xml.fr
1 <?xml version="1.0" encoding="ISO-8859-1" ?>
2 <!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
3 <?xml-stylesheet type="text/xsl" href="./style/manual.fr.xsl"?>
4 <!-- French translation : Lucien GENTIS -->
5 <!-- Reviewed by : Vincent Deffontaines -->
6 <!-- English Revision : 587444 -->
7
8 <!--
9  Licensed to the Apache Software Foundation (ASF) under one or more
10  contributor license agreements.  See the NOTICE file distributed with
11  this work for additional information regarding copyright ownership.
12  The ASF licenses this file to You under the Apache License, Version 2.0
13  (the "License"); you may not use this file except in compliance with
14  the License.  You may obtain a copy of the License at
15
16      http://www.apache.org/licenses/LICENSE-2.0
17
18  Unless required by applicable law or agreed to in writing, software
19  distributed under the License is distributed on an "AS IS" BASIS,
20  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21  See the License for the specific language governing permissions and
22  limitations under the License.
23 -->
24
25 <manualpage metafile="dso.xml.meta">
26
27   <title>Support des objets dynamiques partag&eacute;s (DSO)</title>
28
29   <summary>
30     <p>La conception modulaire du serveur HTTP Apache permet &agrave; l'administrateur
31     de choisir les fonctionnalit&eacute;s &agrave; inclure dans le serveur en s&eacute;lectionnant
32     un certain nombre de modules. Les modules peuvent &ecirc;tre soit int&eacute;gr&eacute;s
33     statiquement dans le binaire <program>httpd</program> lors de la
34     compilation du serveur, soit compil&eacute;s en tant qu'objets
35     dynamiques partag&eacute;s (DSOs) qui existeront ind&eacute;pendamment du binaire
36     principal <program>httpd</program>. Les modules DSO peuvent &ecirc;tre compil&eacute;s
37     au moment de la construction du serveur, ou bien compil&eacute;s s&eacute;par&eacute;ment,
38     &agrave; l'aide de l'utilitaire des extensions d'Apache (<program>apxs</program>),
39     et associ&eacute;s au serveur ult&eacute;rieurement.</p>
40
41     <p>Ce document d&eacute;crit l'utilisation des modules DSO ainsi que les dessous
42     de leur fonctionnement.</p>
43   </summary>
44
45
46 <section id="implementation"><title>Impl&eacute;mentation</title>
47
48 <related>
49 <modulelist>
50 <module>mod_so</module>
51 </modulelist>
52 <directivelist>
53 <directive module="mod_so">LoadModule</directive>
54 </directivelist>
55 </related>
56
57     <p>Le support DSO pour le chargement de modules individuels d'Apache est
58     assur&eacute; par un module nomm&eacute; <module>mod_so</module> qui doit &ecirc;tre compil&eacute;
59     statiquement dans le coeur d'Apache. Il s'agit du seul module avec le
60     module <module>core</module> &agrave; ne pas pouvoir &ecirc;tre compil&eacute; en tant que
61     module DSO lui-m&ecirc;me. Pratiquement tous les autres modules d'Apache
62     distribu&eacute;s peuvent &ecirc;tre compil&eacute;s en tant que modules DSO en s&eacute;lectionnant
63     pour chacun d'entre eux le mode de construction DSO &agrave; l'aide de l'option
64     <code>--enable-<em>module</em>=shared</code> du script
65     <program>configure</program>, comme d&eacute;crit dans la
66     <a href="install.html">Documentation de l'installation</a>. Une fois
67     compil&eacute; en tant que module DSO, un module peut &ecirc;tre charg&eacute; en m&eacute;moire au
68     d&eacute;marrage ou red&eacute;marrage du serveur &agrave; l'aide de la commande
69     <directive module="mod_so">LoadModule</directive> du module
70     <module>mod_so</module>, plac&eacute;e
71     dans votre fichier <code>httpd.conf</code>.</p>
72
73     <p>Un nouvel utilitaire a &eacute;t&eacute; introduit afin de simplifier la cr&eacute;ation de
74     fichiers DSO pour les modules d'Apache
75     (particuli&egrave;rement pour les modules tiers) ; il s'agit du programme nomm&eacute;
76     <program>apxs</program> (<dfn>APache
77     eXtenSion</dfn>). On peut l'utiliser pour construire des modules de type
78     DSO <em>en dehors</em> de l'arborescence des sources d'Apache. L'id&eacute;e est
79     simple : &agrave; l'installation d'Apache, la proc&eacute;dure <code>make install</code>
80     du script <program>configure</program> installe les fichiers d'en-t&ecirc;tes
81     d'Apache et positionne, pour la plateforme de compilation,  les drapeaux du compilateur et de
82     l'&eacute;diteur de liens &agrave; l'int&eacute;rieur du programme
83     <program>apxs</program>, qui sera utilis&eacute; pour la construction de fichiers DSO.
84     Il est ainsi possible d'utiliser le programme <program>apxs</program>
85     pour compiler ses sources de modules Apache sans avoir besoin de
86     l'arborescence des sources de la distribution d'Apache, et sans avoir &agrave;
87     r&eacute;gler les drapeaux du compilateur et de l'&eacute;diteur de liens pour le support DSO.</p>
88 </section>
89
90 <section id="usage"><title>Mode d'emploi succinct</title>
91
92     <p>Afin que vous puissiez vous faire une id&eacute;e des fonctionnalit&eacute;s DSO
93     d'Apache 2.x, en voici un r&eacute;sum&eacute; court et concis :</p>
94
95     <ol>
96       <li>
97         Construire et installer un module Apache <em>faisant partie de la
98         distribution</em>, par exemple <code>mod_foo.c</code>,
99         en tant que module DSO <code>mod_foo.so</code> :
100
101 <example>
102 $ ./configure --prefix=/chemin/vers/r&eacute;pertoire-installation
103 --enable-foo=shared<br />
104 $ make install
105 </example>
106       </li>
107
108       <li>
109         Construire et installer un module Apache <em>tiers</em>, par exemple
110         <code>mod_foo.c</code>, en tant que module DSO <code>mod_foo.so</code> :
111
112 <example>
113 $ ./configure --add-module=<var>type_de_module</var>:
114 /chemin/vers/module_tiers/mod_foo.c \<br />
115 <indent>
116   --enable-foo=shared<br />
117 </indent>
118 $ make install
119 </example>
120       </li>
121
122       <li>
123         Configurer Apache pour <em>pouvoir installer ult&eacute;rieurement</em> des
124         modules partag&eacute;s :
125
126 <example>
127 $ ./configure --enable-so<br />
128 $ make install
129 </example>
130       </li>
131
132       <li>
133         Construire et installer un module Apache <em>tiers</em>, par exemple
134         <code>mod_foo.c</code>, en tant que module DSO
135         <code>mod_foo.so</code> <em>en dehors</em> de l'arborescence des sources
136         d'Apache &agrave; l'aide du programme <program>apxs</program> :
137
138 <example>
139 $ cd /chemin/vers/module_tiers<br />
140 $ apxs -c mod_foo.c<br />
141 $ apxs -i -a -n foo mod_foo.la
142 </example>
143       </li>
144     </ol>
145
146     <p>Dans tous les cas, une fois le module partag&eacute; compil&eacute;, vous devez
147     ajouter une directive <directive module="mod_so">LoadModule</directive>
148     dans le fichier <code>httpd.conf</code> pour qu'Apache active le module.</p>
149 </section>
150
151 <section id="background"><title>Les dessous du fonctionnement des DSO</title>
152
153     <p>Les cl&ocirc;nes modernes d'UNIX proposent un astucieux m&eacute;canisme
154     commun&eacute;ment appel&eacute; &eacute;dition de liens et chargement dynamiques d'
155     <em>Objets Dynamiques Partag&eacute;s</em> (DSO), qui permet de construire un
156     morceau de programme dans un format sp&eacute;cial pour le rendre chargeable
157     &agrave; l'ex&eacute;cution dans l'espace d'adressage d'un programme ex&eacute;cutable.</p>
158
159     <p>Ce chargement peut s'effectuer de deux mani&egrave;res : automatiquement par
160     un programme syst&egrave;me appel&eacute; <code>ld.so</code> quand un programme
161     ex&eacute;cutable est d&eacute;marr&eacute;, ou manuellement &agrave; partir du programme en cours
162     d'ex&eacute;cution via sa propre interface syst&egrave;me vers le chargeur Unix &agrave; l'aide
163     des appels syst&egrave;me <code>dlopen()/dlsym()</code>.</p>
164
165     <p>Dans la premi&egrave;re m&eacute;thode, les DSO sont en g&eacute;n&eacute;ral appel&eacute;s
166     <em>biblioth&egrave;ques partag&eacute;es</em> ou encore <em>biblioth&egrave;ques DSO</em>, et
167     poss&egrave;dent des noms du style
168     <code>libfoo.so</code> ou <code>libfoo.so.1.2</code>. Ils r&eacute;sident dans un
169     r&eacute;pertoire syst&egrave;me (en g&eacute;n&eacute;ral <code>/usr/lib</code>)
170     et le lien avec le programme ex&eacute;cutable est &eacute;tabli &agrave; la compilation en
171     ajoutant <code>-lfoo</code> &agrave; la commande de l'&eacute;diteur de liens. Les
172     r&eacute;f&eacute;rences &agrave; la biblioth&egrave;que sont ainsi cod&eacute;es en dur dans le fichier du
173     programme ex&eacute;cutable de fa&ccedil;on &agrave; ce qu'au d&eacute;marrage du programme, le
174     chargeur Unix soit capable de localiser <code>libfoo.so</code> dans
175     <code>/usr/lib</code>, dans des chemins cod&eacute;s en dur &agrave; l'aide d'options de
176     l'&eacute;diteur de liens comme <code>-R</code> ou dans des chemins d&eacute;finis par la
177     variable d'environnement
178     <code>LD_LIBRARY_PATH</code>. Le chargeur peut d&egrave;s lors r&eacute;soudre tous les symboles
179     (jusque l&agrave; non encore r&eacute;solus) du DSO dans le programme ex&eacute;cutable.</p>
180
181     <p>Les symboles du programme ex&eacute;cutable ne sont en g&eacute;n&eacute;ral pas
182     r&eacute;f&eacute;renc&eacute;s par le DSO (car c'est une biblioth&egrave;que de code &agrave; usage g&eacute;n&eacute;ral
183     et r&eacute;utilisable),
184     et ainsi aucune r&eacute;solution suppl&eacute;mentaire n'est n&eacute;cessaire. De son c&ocirc;t&eacute;,
185     le programme ex&eacute;cutable ne doit accomplir aucune action particuli&egrave;re
186     pour utiliser les
187     symboles du DSO car toutes les r&eacute;solutions sont effectu&eacute;es par le chargeur
188     Unix. En fait, le code permettant d'invoquer
189     <code>ld.so</code> fait partie du code de d&eacute;marrage pour l'ex&eacute;cution qui
190     est li&eacute; dans tout programme ex&eacute;cutable non statiquement li&eacute;.
191     L'avantage du chargement dynamique du code d'une biblioth&egrave;que partag&eacute;e est
192     &eacute;vident : le code de la biblioth&egrave;que ne doit &ecirc;tre stock&eacute; qu'une seule fois
193     dans une biblioth&egrave;que syst&egrave;me telle que <code>libc.so</code>, ce qui permet
194     d'&eacute;conomiser de l'espace disque pour les autres programmes.</p>
195
196     <p>Dans la seconde m&eacute;thode, les DSO sont en g&eacute;n&eacute;ral appel&eacute;s <em>objets
197     partag&eacute;s</em> ou <em>fichiers DSO</em>, et peuvent &ecirc;tre nomm&eacute;s avec
198     l'extension de son choix (bien que le nom conseill&eacute; soit du style
199     <code>foo.so</code>). Ces fichiers r&eacute;sident en g&eacute;n&eacute;ral dans un r&eacute;pertoire
200     sp&eacute;cifique &agrave; un programme, et aucun lien n'est automatiquement &eacute;tabli avec
201     le programme ex&eacute;cutable dans lequel ils sont utilis&eacute;s.
202     Le programme ex&eacute;cutable charge manuellement le DSO &agrave; l'ex&eacute;cution dans son
203     espace d'adressage &agrave; l'aide de l'appel syst&egrave;me <code>dlopen()</code>.
204     A ce moment, aucune r&eacute;solution de symboles du DSO n'est effectu&eacute;e pour le
205     programme ex&eacute;cutable. Par contre le chargeur Unix
206     r&eacute;soud automatiquement tout symbole du DSO (non encore r&eacute;solu)
207     faisant partie de l'ensemble de symboles export&eacute; par le programme
208     ex&eacute;cutable et ses biblioth&egrave;ques DSO d&eacute;j&agrave; charg&eacute;es (et en particulier tous
209     les symboles de la biblioth&egrave;que &agrave; tout faire <code>libc.so</code>).
210     De cette fa&ccedil;on, le DSO prend connaissance de l'ensemble de symboles du
211     programme ex&eacute;cutable comme s'il avait &eacute;t&eacute; li&eacute; statiquement avec lui
212     auparavant.</p>
213
214     <p>Finalement, pour tirer profit de l'API des DSO, le programme ex&eacute;cutable
215     doit r&eacute;soudre certains symboles du DSO &agrave; l'aide de l'appel syst&egrave;me
216     <code>dlsym()</code> pour une utilisation ult&eacute;rieure dans les tables de
217     distribution, <em>etc...</em> En d'autres termes, le programme ex&eacute;cutable doit
218     r&eacute;soudre manuellement tous les symboles dont il a besoin pour pouvoir les
219     utiliser.
220     Avantage d'un tel m&eacute;canisme : les modules optionnels du programme n'ont pas
221     besoin d'&ecirc;tre charg&eacute;s (et ne gaspillent donc pas de ressources m&eacute;moire)
222     tant qu'il ne sont pas n&eacute;cessaires au programme en question. Si n&eacute;cessaire,
223     ces modules peuvent &ecirc;tre charg&eacute;s dynamiquement afin d'&eacute;tendre les
224     fonctionnalit&eacute;s de base du programme.</p>
225
226     <p>Bien que ce m&eacute;canisme DSO paraisse &eacute;vident, il comporte au moins une
227     &eacute;tape difficile : la r&eacute;solution des symboles depuis le programme ex&eacute;cutable
228     pour le DSO lorsqu'on utilise un DSO pour &eacute;tendre les fonctionnalit&eacute;s d'un
229     programme (la seconde m&eacute;thode). Pourquoi ? Parce que la "r&eacute;solution
230     inverse" des symboles DSO &agrave; partir du jeu de symboles du programme
231     ex&eacute;cutable d&eacute;pend de la conception de la biblioth&egrave;que (la biblioth&egrave;que n'a
232     aucune information sur le programme qui l'utilise) et n'est ni standardis&eacute;e
233     ni disponible sur toutes les plateformes. En pratique, les symboles globaux
234     du programme ex&eacute;cutable ne sont en g&eacute;n&eacute;ral pas r&eacute;export&eacute;s et donc
235     indisponibles pour l'utilisation dans un DSO. Trouver une m&eacute;thode pour
236     forcer l'&eacute;diteur de liens &agrave; exporter tous les symboles globaux est le
237     principal probl&egrave;me que l'on doit r&eacute;soudre lorsqu'on utilise un DSO pour
238     &eacute;tendre les fonctionnalit&eacute;s d'un programme au moment de son ex&eacute;cution.</p>
239
240     <p>L'approche des biblioth&egrave;ques partag&eacute;es est la plus courante, parce que
241     c'est dans cette optique que le m&eacute;canisme DSO a &eacute;t&eacute; con&ccedil;u ; c'est cette
242     approche qui est ainsi
243     utilis&eacute;e par pratiquement tous les types de biblioth&egrave;ques que fournit le
244     syst&egrave;me d'exploitation. Par contre, les objets partag&eacute;s sont relativement
245     peu utilis&eacute;s pour &eacute;tendre les fonctionnalit&eacute;s d'un programme.</p>
246
247     <p>En 1998, seule une poign&eacute;e de logiciels distribu&eacute;s
248     utilisaient le m&eacute;canisme DSO pour r&eacute;ellement &eacute;tendre leurs fonctionnalit&eacute;s
249     au moment de l'ex&eacute;cution : Perl 5 (via son m&eacute;canisme XS et le module
250     DynaLoader), le serveur Netscape, <em>etc...</em> A partir de la
251     version 1.3, Apache rejoignit ce groupe, car Apache
252     pr&eacute;sentait d&eacute;j&agrave; un concept modulaire pour &eacute;tendre ses fonctionnalit&eacute;s, et
253     utilisait en interne une approche bas&eacute;e sur une liste de distribution pour
254     relier des modules externes avec les fonctionnalit&eacute;s de base d'Apache.
255     Ainsi, Apache &eacute;tait vraiment pr&eacute;destin&eacute; &agrave; l'utilisation des DSO pour
256     charger ses modules au moment de l'ex&eacute;cution.</p>
257 </section>
258
259 <section id="advantages"><title>Avantages et inconv&eacute;nients</title>
260
261     <p>Les fonctionnalit&eacute;s ci-dessus bas&eacute;es sur les DSO pr&eacute;sentent les
262     avantages suivants :</p>
263
264     <ul>
265       <li>Le paquetage du serveur est plus flexible &agrave; l'ex&eacute;cution car le
266       processus serveur effectif peut &ecirc;tre assembl&eacute; &agrave; l'ex&eacute;cution via la
267       directive <directive module="mod_so">LoadModule</directive> du fichier de
268       configuration <code>httpd.conf</code> plut&ocirc;t que par des options du script
269       <program>configure</program> &agrave; la compilation. Par exemple,
270       on peut ainsi ex&eacute;cuter diff&eacute;rentes instances du serveur
271       (standard et version SSL, version minimale et version &eacute;toff&eacute;e
272       [mod_perl, PHP], <em>etc...</em>) &agrave; partir d'une seule installation
273       d'Apache.</li>
274
275       <li>Le paquetage du serveur peut &ecirc;tre facilement &eacute;tendu avec des modules
276       tiers, m&ecirc;me apr&egrave;s l'installation. Ceci pr&eacute;sente en tout cas un gros
277       avantage pour les mainteneurs de paquetages destin&eacute;s aux distributions,
278       car ils peuvent cr&eacute;er un paquetage Apache de base, et des paquetages
279       additionnels contenant des extensions telles que PHP, mod_perl, mod_fastcgi,
280       <em>etc...</em></li>
281
282       <li>Une facilit&eacute; de prototypage des modules Apache car la paire
283       DSO/<program>apxs</program> vous permet d'une part de travailler en
284       dehors de l'arborescence des sources d'Apache, et d'autre part de n'avoir
285       besoin que de la commande <code>apxs -i</code>
286       suivie d'un <code>apachectl restart</code> pour introduire une nouvelle
287       version de votre module fra&icirc;chement d&eacute;velopp&eacute; dans le serveur Apache
288       en cours d'ex&eacute;cution.</li>
289     </ul>
290
291     <p>Inconv&eacute;nients des DSO :</p>
292
293     <ul>
294       <li>Le m&eacute;canisme DSO n'est pas disponible sur toutes les plates-formes
295       car tous les syst&egrave;mes d'exploitation ne supportent pas le chargement
296       dynamique de code dans l'espace d'adressage d'un programme.</li>
297
298       <li>Le serveur est environ 20 % plus lent au d&eacute;marrage
299       &agrave; cause des r&eacute;solutions de symboles suppl&eacute;mentaires que le chargeur
300       Unix doit effectuer.</li>
301
302       <li>Le serveur est environ 5 % plus lent &agrave; l'ex&eacute;cution
303       sur certaines plates-formes, car le code ind&eacute;pendant de la position (PIC)
304       n&eacute;cessite parfois des manipulations compliqu&eacute;es en assembleur pour
305       l'adressage relatif qui ne sont pas toujours aussi rapides que celles
306       que permet l'adressage absolu.</li>
307
308       <li>Comme les modules DSO ne peuvent pas &ecirc;tre li&eacute;s avec d'autres
309       biblioth&egrave;ques bas&eacute;es sur DSO (<code>ld -lfoo</code>) sur toutes les
310       plates-formes
311       (par exemple, les plates-formes bas&eacute;es sur a.out ne fournissent en
312       g&eacute;n&eacute;ral pas cette fonctionnalit&eacute; alors que les plates-formes bas&eacute;es sur
313       ELF le font), vous ne pouvez pas utiliser le m&eacute;canisme DSO pour tous les
314       types de modules. Ou en d'autres termes, les modules compil&eacute;s comme
315       fichiers DSO sont contraints de n'utiliser que les symboles du coeur
316       d'Apache, de la biblioth&egrave;que C
317       (<code>libc</code>) et toutes autres biblioth&egrave;ques statiques ou
318       dynamiques utilis&eacute;es par le coeur d'Apache, ou d'archives statiques
319       (<code>libfoo.a</code>) contenant du code ind&eacute;pendant de la
320       position (PIC).
321       Il y a deux solutions pour utiliser un autre type de code : soit le
322       coeur d'Apache contient d&eacute;j&agrave; lui-m&ecirc;me une r&eacute;f&eacute;rence au code, soit vous
323       chargez le code vous-m&ecirc;me via <code>dlopen()</code>.</li>
324     </ul>
325
326 </section>
327
328 </manualpage>