]> granicus.if.org Git - apache/blob - docs/manual/dso.xml.fr
Help doc writer to spot places where:
[apache] / docs / manual / dso.xml.fr
1 <?xml version="1.0" ?>
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 : 1199481 -->
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 seront compil&eacute;s en tant
33     qu'Objets Dynamiques Partag&eacute;s (Dynamic Shared Objects ou DSOs)
34     qui m&egrave;nent une existence s&eacute;par&eacute;e du fichier binaire principal
35     <program>httpd</program>. Les modules DSO peuvent &ecirc;tre compil&eacute;s en
36     m&ecirc;me temps que le serveur, ou compil&eacute;s et ajout&eacute;s ult&eacute;rieurement via
37     l'Outil des Extensions &agrave; Apache (Apache Extension Tool ou
38     <program>apxs</program>).</p>
39     <p>Les modules peuvent aussi &ecirc;tre int&eacute;gr&eacute;s statiquement dans le
40     binaire <program>httpd</program> lors de la compilation de ce
41     dernier.</p>
42
43     <p>Ce document d&eacute;crit l'utilisation des modules DSO ainsi que les dessous
44     de leur fonctionnement.</p>
45   </summary>
46
47
48 <section id="implementation"><title>Impl&eacute;mentation</title>
49
50 <related>
51 <modulelist>
52 <module>mod_so</module>
53 </modulelist>
54 <directivelist>
55 <directive module="mod_so">LoadModule</directive>
56 </directivelist>
57 </related>
58
59     <p>Le support DSO pour le chargement de modules individuels d'Apache
60     httpd est
61     assur&eacute; par un module nomm&eacute; <module>mod_so</module> qui doit &ecirc;tre compil&eacute;
62     statiquement dans le coeur d'Apache httpd. Il s'agit du seul module avec le
63     module <module>core</module> &agrave; ne pas pouvoir &ecirc;tre compil&eacute; en tant que
64     module DSO lui-m&ecirc;me. Pratiquement tous les autres modules d'Apache httpd
65     distribu&eacute;s seront alors compil&eacute;s en tant que modules DSO. Une fois
66     compil&eacute; en tant que module DSO nomm&eacute; <code>mod_foo.so</code>, un
67     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
69     la directive <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     <p>La compilation en mode DSO peut &ecirc;tre d&eacute;sactiv&eacute;e pour certains
73     modules via l'option <code>--enable-mods-static</code> du script
74     <program>configure</program>, comme expliqu&eacute; dans la <a
75     href="install.html">Documentation sur l'installation</a>.</p>
76
77     <p>Un utilitaire permet de simplifier la cr&eacute;ation de
78     fichiers DSO pour les modules d'Apache httpd
79     (particuli&egrave;rement pour les modules tiers) ; il s'agit du programme nomm&eacute;
80     <program>apxs</program> (<dfn>APache
81     eXtenSion</dfn>). On peut l'utiliser pour construire des modules de type
82     DSO <em>en dehors</em> de l'arborescence des sources d'Apache httpd. L'id&eacute;e est
83     simple : &agrave; l'installation du serveur HTTP Apache, la proc&eacute;dure <code>make install</code>
84     du script <program>configure</program> installe les fichiers d'en-t&ecirc;tes
85     d'Apache httpd et positionne, pour la plateforme de compilation,  les drapeaux du compilateur et de
86     l'&eacute;diteur de liens &agrave; l'int&eacute;rieur du programme
87     <program>apxs</program>, qui sera utilis&eacute; pour la construction de fichiers DSO.
88     Il est ainsi possible d'utiliser le programme <program>apxs</program>
89     pour compiler ses sources de modules Apache httpd sans avoir besoin de
90     l'arborescence des sources de la distribution d'Apache, et sans avoir &agrave;
91     r&eacute;gler les drapeaux du compilateur et de l'&eacute;diteur de liens pour le support DSO.</p>
92 </section>
93
94 <section id="usage"><title>Mode d'emploi succinct</title>
95
96     <p>Afin que vous puissiez vous faire une id&eacute;e des fonctionnalit&eacute;s DSO
97     du serveur HTTP Apache 2.x, en voici un r&eacute;sum&eacute; court et concis :</p>
98
99     <ol>
100       <li>
101         <p>Construire et installer un module Apache httpd <em>faisant partie de la
102         distribution</em>, par exemple <code>mod_foo.c</code>,
103         en tant que module DSO <code>mod_foo.so</code> :</p>
104
105 <example>
106 $ ./configure --prefix=/chemin/vers/installation --enable-foo<br />
107 $ make install
108 </example>
109       </li>
110
111       <li>
112         <p>Configure le serveur HTTP Apache avec tous les modules
113         activ&eacute;s. Seul un jeu de modules de base sera charg&eacute; au
114         d&eacute;marrage du serveur. Vous pouvez modifier ce jeu de modules
115         charg&eacute;s au d&eacute;marrage en activant ou d&eacute;sactivant les directives <directive
116       module="mod_so">LoadModule</directive> correspondantes dans le
117       fichier <code>httpd.conf</code>.</p>
118
119 <example>
120 $ ./configure --enable-mods-shared=all<br />
121 $ make install
122 </example>
123
124         <p>L'argument <code>most</code> de l'option
125         <code>--enable-modules</code> indique que tous les modules
126         non-exp&eacute;rimentaux ou qui ne sont pas l&agrave; &agrave; titre d'exemple seront
127         compil&eacute;s.</p>
128       </li>
129
130       <li>
131       <p>Certains modules ne sont utilis&eacute;s que par les d&eacute;veloppeurs et
132       ne seront pas compil&eacute;s. Si vous voulez les utiliser, sp&eacute;cifiez
133       l'option <em>all</em>. Pour compiler tous les modules disponibles,
134       y compris les modules de d&eacute;veloppeurs, sp&eacute;cifiez l'option
135       <em>reallyall</em>. En outre, la directive <directive
136       module="mod_so">LoadModule</directive> peut &ecirc;tre activ&eacute;e pour tous
137       les modules compil&eacute;s via l'option du script configure
138       <code>--enable-load-all-modules</code>.</p>
139
140 <example>
141 $ ./configure --enable-mods-shared=reallyall --enable-load-all-modules<br />
142 $ make install
143 </example>
144       </li>
145
146       <li>
147         Construire et installer un module Apache httpd <em>tiers</em>, par exemple
148         <code>mod_foo.c</code>, en tant que module DSO
149         <code>mod_foo.so</code> <em>en dehors</em> de l'arborescence des sources
150         d'Apache httpd &agrave; l'aide du programme <program>apxs</program> :
151
152 <example>
153 $ cd /chemin/vers/module_tiers<br />
154 $ apxs -cia mod_foo.c
155 </example>
156       </li>
157     </ol>
158
159     <p>Dans tous les cas, une fois le module partag&eacute; compil&eacute;, vous devez
160     ajouter une directive <directive module="mod_so">LoadModule</directive>
161     dans le fichier <code>httpd.conf</code> pour qu'Apache httpd active le module.</p>
162
163     <p>Voir la <a href="programs/apxs.html">documentation sur apxs</a>
164     pour plus de d&eacute;tails.</p>
165 </section>
166
167 <section id="background"><title>Les dessous du fonctionnement des DSO</title>
168
169     <p>Les cl&ocirc;nes modernes d'UNIX proposent un m&eacute;canisme
170     appel&eacute; &eacute;dition de liens et chargement dynamiques d'
171     <em>Objets Dynamiques Partag&eacute;s</em> (DSO), qui permet de construire un
172     morceau de programme dans un format sp&eacute;cial pour le rendre chargeable
173     &agrave; l'ex&eacute;cution dans l'espace d'adressage d'un programme ex&eacute;cutable.</p>
174
175     <p>Ce chargement peut s'effectuer de deux mani&egrave;res : automatiquement par
176     un programme syst&egrave;me appel&eacute; <code>ld.so</code> quand un programme
177     ex&eacute;cutable est d&eacute;marr&eacute;, ou manuellement &agrave; partir du programme en cours
178     d'ex&eacute;cution via sa propre interface syst&egrave;me vers le chargeur Unix &agrave; l'aide
179     des appels syst&egrave;me <code>dlopen()/dlsym()</code>.</p>
180
181     <p>Dans la premi&egrave;re m&eacute;thode, les DSO sont en g&eacute;n&eacute;ral appel&eacute;s
182     <em>biblioth&egrave;ques partag&eacute;es</em> ou encore <em>biblioth&egrave;ques DSO</em>, et
183     poss&egrave;dent des noms du style
184     <code>libfoo.so</code> ou <code>libfoo.so.1.2</code>. Ils r&eacute;sident dans un
185     r&eacute;pertoire syst&egrave;me (en g&eacute;n&eacute;ral <code>/usr/lib</code>)
186     et le lien avec le programme ex&eacute;cutable est &eacute;tabli &agrave; la compilation en
187     ajoutant <code>-lfoo</code> &agrave; la commande de l'&eacute;diteur de liens. Les
188     r&eacute;f&eacute;rences &agrave; la biblioth&egrave;que sont ainsi cod&eacute;es en dur dans le fichier du
189     programme ex&eacute;cutable de fa&ccedil;on &agrave; ce qu'au d&eacute;marrage du programme, le
190     chargeur Unix soit capable de localiser <code>libfoo.so</code> dans
191     <code>/usr/lib</code>, dans des chemins cod&eacute;s en dur &agrave; l'aide d'options de
192     l'&eacute;diteur de liens comme <code>-R</code> ou dans des chemins d&eacute;finis par la
193     variable d'environnement
194     <code>LD_LIBRARY_PATH</code>. Le chargeur peut d&egrave;s lors r&eacute;soudre tous les symboles
195     (jusque l&agrave; non encore r&eacute;solus) du DSO dans le programme ex&eacute;cutable.</p>
196
197     <p>Les symboles du programme ex&eacute;cutable ne sont en g&eacute;n&eacute;ral pas
198     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
199     et r&eacute;utilisable),
200     et ainsi aucune r&eacute;solution suppl&eacute;mentaire n'est n&eacute;cessaire. De son c&ocirc;t&eacute;,
201     le programme ex&eacute;cutable ne doit accomplir aucune action particuli&egrave;re
202     pour utiliser les
203     symboles du DSO car toutes les r&eacute;solutions sont effectu&eacute;es par le chargeur
204     Unix. En fait, le code permettant d'invoquer
205     <code>ld.so</code> fait partie du code de d&eacute;marrage pour l'ex&eacute;cution qui
206     est li&eacute; dans tout programme ex&eacute;cutable non statiquement li&eacute;.
207     L'avantage du chargement dynamique du code d'une biblioth&egrave;que partag&eacute;e est
208     &eacute;vident : le code de la biblioth&egrave;que ne doit &ecirc;tre stock&eacute; qu'une seule fois
209     dans une biblioth&egrave;que syst&egrave;me telle que <code>libc.so</code>, ce qui permet
210     d'&eacute;conomiser de l'espace disque pour les autres programmes.</p>
211
212     <p>Dans la seconde m&eacute;thode, les DSO sont en g&eacute;n&eacute;ral appel&eacute;s <em>objets
213     partag&eacute;s</em> ou <em>fichiers DSO</em>, et peuvent &ecirc;tre nomm&eacute;s avec
214     l'extension de son choix (bien que le nom conseill&eacute; soit du style
215     <code>foo.so</code>). Ces fichiers r&eacute;sident en g&eacute;n&eacute;ral dans un r&eacute;pertoire
216     sp&eacute;cifique &agrave; un programme, et aucun lien n'est automatiquement &eacute;tabli avec
217     le programme ex&eacute;cutable dans lequel ils sont utilis&eacute;s.
218     Le programme ex&eacute;cutable charge manuellement le DSO &agrave; l'ex&eacute;cution dans son
219     espace d'adressage &agrave; l'aide de l'appel syst&egrave;me <code>dlopen()</code>.
220     A ce moment, aucune r&eacute;solution de symboles du DSO n'est effectu&eacute;e pour le
221     programme ex&eacute;cutable. Par contre le chargeur Unix
222     r&eacute;soud automatiquement tout symbole du DSO (non encore r&eacute;solu)
223     faisant partie de l'ensemble de symboles export&eacute; par le programme
224     ex&eacute;cutable et ses biblioth&egrave;ques DSO d&eacute;j&agrave; charg&eacute;es (et en particulier tous
225     les symboles de la biblioth&egrave;que &agrave; tout faire <code>libc.so</code>).
226     De cette fa&ccedil;on, le DSO prend connaissance de l'ensemble de symboles du
227     programme ex&eacute;cutable comme s'il avait &eacute;t&eacute; li&eacute; statiquement avec lui
228     auparavant.</p>
229
230     <p>Finalement, pour tirer profit de l'API des DSO, le programme ex&eacute;cutable
231     doit r&eacute;soudre certains symboles du DSO &agrave; l'aide de l'appel syst&egrave;me
232     <code>dlsym()</code> pour une utilisation ult&eacute;rieure dans les tables de
233     distribution, <em>etc...</em> En d'autres termes, le programme ex&eacute;cutable doit
234     r&eacute;soudre manuellement tous les symboles dont il a besoin pour pouvoir les
235     utiliser.
236     Avantage d'un tel m&eacute;canisme : les modules optionnels du programme n'ont pas
237     besoin d'&ecirc;tre charg&eacute;s (et ne gaspillent donc pas de ressources m&eacute;moire)
238     tant qu'il ne sont pas n&eacute;cessaires au programme en question. Si n&eacute;cessaire,
239     ces modules peuvent &ecirc;tre charg&eacute;s dynamiquement afin d'&eacute;tendre les
240     fonctionnalit&eacute;s de base du programme.</p>
241
242     <p>Bien que ce m&eacute;canisme DSO paraisse &eacute;vident, il comporte au moins une
243     &eacute;tape difficile : la r&eacute;solution des symboles depuis le programme ex&eacute;cutable
244     pour le DSO lorsqu'on utilise un DSO pour &eacute;tendre les fonctionnalit&eacute;s d'un
245     programme (la seconde m&eacute;thode). Pourquoi ? Parce que la "r&eacute;solution
246     inverse" des symboles DSO &agrave; partir du jeu de symboles du programme
247     ex&eacute;cutable d&eacute;pend de la conception de la biblioth&egrave;que (la biblioth&egrave;que n'a
248     aucune information sur le programme qui l'utilise) et n'est ni standardis&eacute;e
249     ni disponible sur toutes les plateformes. En pratique, les symboles globaux
250     du programme ex&eacute;cutable ne sont en g&eacute;n&eacute;ral pas r&eacute;export&eacute;s et donc
251     indisponibles pour l'utilisation dans un DSO. Trouver une m&eacute;thode pour
252     forcer l'&eacute;diteur de liens &agrave; exporter tous les symboles globaux est le
253     principal probl&egrave;me que l'on doit r&eacute;soudre lorsqu'on utilise un DSO pour
254     &eacute;tendre les fonctionnalit&eacute;s d'un programme au moment de son ex&eacute;cution.</p>
255
256     <p>L'approche des biblioth&egrave;ques partag&eacute;es est la plus courante, parce que
257     c'est dans cette optique que le m&eacute;canisme DSO a &eacute;t&eacute; con&ccedil;u ; c'est cette
258     approche qui est ainsi
259     utilis&eacute;e par pratiquement tous les types de biblioth&egrave;ques que fournit le
260     syst&egrave;me d'exploitation.</p>
261
262 </section>
263
264 <section id="advantages"><title>Avantages et inconv&eacute;nients</title>
265
266     <p>Les fonctionnalit&eacute;s ci-dessus bas&eacute;es sur les DSO pr&eacute;sentent les
267     avantages suivants :</p>
268
269     <ul>
270       <li>Le paquetage du serveur est plus flexible &agrave; l'ex&eacute;cution car le
271       processus serveur peut &ecirc;tre assembl&eacute; &agrave; l'ex&eacute;cution via la
272       directive <directive module="mod_so">LoadModule</directive> du fichier de
273       configuration <code>httpd.conf</code> plut&ocirc;t que par des options du script
274       <program>configure</program> &agrave; la compilation. Par exemple,
275       on peut ainsi ex&eacute;cuter diff&eacute;rentes instances du serveur
276       (standard et version SSL, version minimale et version dynamique
277       [mod_perl, mod_php], <em>etc...</em>) &agrave; partir d'une seule installation
278       d'Apache httpd.</li>
279
280       <li>Le paquetage du serveur peut &ecirc;tre facilement &eacute;tendu avec des modules
281       tiers, m&ecirc;me apr&egrave;s l'installation. Ceci pr&eacute;sente un gros
282       avantage pour les mainteneurs de paquetages destin&eacute;s aux distributions,
283       car ils peuvent cr&eacute;er un paquetage Apache httpd de base, et des paquetages
284       additionnels contenant des extensions telles que PHP, mod_perl, mod_fastcgi,
285       <em>etc...</em></li>
286
287       <li>Une facilit&eacute; de prototypage des modules Apache httpd, car la paire
288       DSO/<program>apxs</program> vous permet d'une part de travailler en
289       dehors de l'arborescence des sources d'Apache httpd, et d'autre part de n'avoir
290       besoin que de la commande <code>apxs -i</code>
291       suivie d'un <code>apachectl restart</code> pour introduire une nouvelle
292       version de votre module fra&icirc;chement d&eacute;velopp&eacute; dans le serveur HTTP Apache
293       en cours d'ex&eacute;cution.</li>
294     </ul>
295
296     <p>Inconv&eacute;nients des DSO :</p>
297
298     <ul>
299       <li>Le serveur est environ 20 % plus lent au d&eacute;marrage
300       &agrave; cause des r&eacute;solutions de symboles suppl&eacute;mentaires que le chargeur
301       Unix doit effectuer.</li>
302
303       <li>Le serveur est environ 5 % plus lent &agrave; l'ex&eacute;cution
304       sur certaines plates-formes, car le code ind&eacute;pendant de la position (PIC)
305       n&eacute;cessite parfois des manipulations compliqu&eacute;es en assembleur pour
306       l'adressage relatif qui ne sont pas toujours aussi rapides que celles
307       que permet l'adressage absolu.</li>
308
309       <li>Comme les modules DSO ne peuvent pas &ecirc;tre li&eacute;s avec d'autres
310       biblioth&egrave;ques bas&eacute;es sur DSO (<code>ld -lfoo</code>) sur toutes les
311       plates-formes
312       (par exemple, les plates-formes bas&eacute;es sur a.out ne fournissent en
313       g&eacute;n&eacute;ral pas cette fonctionnalit&eacute; alors que les plates-formes bas&eacute;es sur
314       ELF le font), vous ne pouvez pas utiliser le m&eacute;canisme DSO pour tous les
315       types de modules. Ou en d'autres termes, les modules compil&eacute;s comme
316       fichiers DSO sont contraints de n'utiliser que les symboles du coeur
317       d'Apache httpd, de la biblioth&egrave;que C
318       (<code>libc</code>) et toutes autres biblioth&egrave;ques statiques ou
319       dynamiques utilis&eacute;es par le coeur d'Apache httpd, ou d'archives statiques
320       (<code>libfoo.a</code>) contenant du code ind&eacute;pendant de la
321       position (PIC).
322       Il y a deux solutions pour utiliser un autre type de code : soit le
323       coeur d'Apache httpd contient d&eacute;j&agrave; lui-m&ecirc;me une r&eacute;f&eacute;rence au code, soit vous
324       chargez le code vous-m&ecirc;me via <code>dlopen()</code>.</li>
325     </ul>
326
327 </section>
328
329 </manualpage>