]> granicus.if.org Git - apache/blob - docs/manual/dso.xml.fr
Updates.
[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 : 1174747 -->
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 et charg&eacute;s en tant qu'objets partag&eacute;s. Vous pouvez
114         ensuite les d&eacute;sactiver un &agrave; un en commentant la directive <directive
115       module="mod_so">LoadModule</directive> correspondante dans le
116       fichier <code>httpd.conf</code>.</p>
117
118 <example>
119 $ ./configure --enable-mods-shared=all<br />
120 $ make install
121 </example>
122
123         <p>L'argument <code>most</code> de l'option
124         <code>--enable-modules</code> indique que tous les modules
125         non-exp&eacute;rimentaux ou qui ne sont pas l&agrave; &agrave; titre d'exemple seront
126         compil&eacute;s.</p>
127       </li>
128
129       <li>
130         Construire et installer un module Apache httpd <em>tiers</em>, par exemple
131         <code>mod_foo.c</code>, en tant que module DSO
132         <code>mod_foo.so</code> <em>en dehors</em> de l'arborescence des sources
133         d'Apache httpd &agrave; l'aide du programme <program>apxs</program> :
134
135 <example>
136 $ cd /chemin/vers/module_tiers<br />
137 $ apxs -cia mod_foo.c
138 </example>
139       </li>
140     </ol>
141
142     <p>Dans tous les cas, une fois le module partag&eacute; compil&eacute;, vous devez
143     ajouter une directive <directive module="mod_so">LoadModule</directive>
144     dans le fichier <code>httpd.conf</code> pour qu'Apache httpd active le module.</p>
145
146     <p>Voir la <a href="programs/apxs.html">documentation sur apxs</a>
147     pour plus de d&eacute;tails.</p>
148 </section>
149
150 <section id="background"><title>Les dessous du fonctionnement des DSO</title>
151
152     <p>Les cl&ocirc;nes modernes d'UNIX proposent un m&eacute;canisme
153     appel&eacute; &eacute;dition de liens et chargement dynamiques d'
154     <em>Objets Dynamiques Partag&eacute;s</em> (DSO), qui permet de construire un
155     morceau de programme dans un format sp&eacute;cial pour le rendre chargeable
156     &agrave; l'ex&eacute;cution dans l'espace d'adressage d'un programme ex&eacute;cutable.</p>
157
158     <p>Ce chargement peut s'effectuer de deux mani&egrave;res : automatiquement par
159     un programme syst&egrave;me appel&eacute; <code>ld.so</code> quand un programme
160     ex&eacute;cutable est d&eacute;marr&eacute;, ou manuellement &agrave; partir du programme en cours
161     d'ex&eacute;cution via sa propre interface syst&egrave;me vers le chargeur Unix &agrave; l'aide
162     des appels syst&egrave;me <code>dlopen()/dlsym()</code>.</p>
163
164     <p>Dans la premi&egrave;re m&eacute;thode, les DSO sont en g&eacute;n&eacute;ral appel&eacute;s
165     <em>biblioth&egrave;ques partag&eacute;es</em> ou encore <em>biblioth&egrave;ques DSO</em>, et
166     poss&egrave;dent des noms du style
167     <code>libfoo.so</code> ou <code>libfoo.so.1.2</code>. Ils r&eacute;sident dans un
168     r&eacute;pertoire syst&egrave;me (en g&eacute;n&eacute;ral <code>/usr/lib</code>)
169     et le lien avec le programme ex&eacute;cutable est &eacute;tabli &agrave; la compilation en
170     ajoutant <code>-lfoo</code> &agrave; la commande de l'&eacute;diteur de liens. Les
171     r&eacute;f&eacute;rences &agrave; la biblioth&egrave;que sont ainsi cod&eacute;es en dur dans le fichier du
172     programme ex&eacute;cutable de fa&ccedil;on &agrave; ce qu'au d&eacute;marrage du programme, le
173     chargeur Unix soit capable de localiser <code>libfoo.so</code> dans
174     <code>/usr/lib</code>, dans des chemins cod&eacute;s en dur &agrave; l'aide d'options de
175     l'&eacute;diteur de liens comme <code>-R</code> ou dans des chemins d&eacute;finis par la
176     variable d'environnement
177     <code>LD_LIBRARY_PATH</code>. Le chargeur peut d&egrave;s lors r&eacute;soudre tous les symboles
178     (jusque l&agrave; non encore r&eacute;solus) du DSO dans le programme ex&eacute;cutable.</p>
179
180     <p>Les symboles du programme ex&eacute;cutable ne sont en g&eacute;n&eacute;ral pas
181     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
182     et r&eacute;utilisable),
183     et ainsi aucune r&eacute;solution suppl&eacute;mentaire n'est n&eacute;cessaire. De son c&ocirc;t&eacute;,
184     le programme ex&eacute;cutable ne doit accomplir aucune action particuli&egrave;re
185     pour utiliser les
186     symboles du DSO car toutes les r&eacute;solutions sont effectu&eacute;es par le chargeur
187     Unix. En fait, le code permettant d'invoquer
188     <code>ld.so</code> fait partie du code de d&eacute;marrage pour l'ex&eacute;cution qui
189     est li&eacute; dans tout programme ex&eacute;cutable non statiquement li&eacute;.
190     L'avantage du chargement dynamique du code d'une biblioth&egrave;que partag&eacute;e est
191     &eacute;vident : le code de la biblioth&egrave;que ne doit &ecirc;tre stock&eacute; qu'une seule fois
192     dans une biblioth&egrave;que syst&egrave;me telle que <code>libc.so</code>, ce qui permet
193     d'&eacute;conomiser de l'espace disque pour les autres programmes.</p>
194
195     <p>Dans la seconde m&eacute;thode, les DSO sont en g&eacute;n&eacute;ral appel&eacute;s <em>objets
196     partag&eacute;s</em> ou <em>fichiers DSO</em>, et peuvent &ecirc;tre nomm&eacute;s avec
197     l'extension de son choix (bien que le nom conseill&eacute; soit du style
198     <code>foo.so</code>). Ces fichiers r&eacute;sident en g&eacute;n&eacute;ral dans un r&eacute;pertoire
199     sp&eacute;cifique &agrave; un programme, et aucun lien n'est automatiquement &eacute;tabli avec
200     le programme ex&eacute;cutable dans lequel ils sont utilis&eacute;s.
201     Le programme ex&eacute;cutable charge manuellement le DSO &agrave; l'ex&eacute;cution dans son
202     espace d'adressage &agrave; l'aide de l'appel syst&egrave;me <code>dlopen()</code>.
203     A ce moment, aucune r&eacute;solution de symboles du DSO n'est effectu&eacute;e pour le
204     programme ex&eacute;cutable. Par contre le chargeur Unix
205     r&eacute;soud automatiquement tout symbole du DSO (non encore r&eacute;solu)
206     faisant partie de l'ensemble de symboles export&eacute; par le programme
207     ex&eacute;cutable et ses biblioth&egrave;ques DSO d&eacute;j&agrave; charg&eacute;es (et en particulier tous
208     les symboles de la biblioth&egrave;que &agrave; tout faire <code>libc.so</code>).
209     De cette fa&ccedil;on, le DSO prend connaissance de l'ensemble de symboles du
210     programme ex&eacute;cutable comme s'il avait &eacute;t&eacute; li&eacute; statiquement avec lui
211     auparavant.</p>
212
213     <p>Finalement, pour tirer profit de l'API des DSO, le programme ex&eacute;cutable
214     doit r&eacute;soudre certains symboles du DSO &agrave; l'aide de l'appel syst&egrave;me
215     <code>dlsym()</code> pour une utilisation ult&eacute;rieure dans les tables de
216     distribution, <em>etc...</em> En d'autres termes, le programme ex&eacute;cutable doit
217     r&eacute;soudre manuellement tous les symboles dont il a besoin pour pouvoir les
218     utiliser.
219     Avantage d'un tel m&eacute;canisme : les modules optionnels du programme n'ont pas
220     besoin d'&ecirc;tre charg&eacute;s (et ne gaspillent donc pas de ressources m&eacute;moire)
221     tant qu'il ne sont pas n&eacute;cessaires au programme en question. Si n&eacute;cessaire,
222     ces modules peuvent &ecirc;tre charg&eacute;s dynamiquement afin d'&eacute;tendre les
223     fonctionnalit&eacute;s de base du programme.</p>
224
225     <p>Bien que ce m&eacute;canisme DSO paraisse &eacute;vident, il comporte au moins une
226     &eacute;tape difficile : la r&eacute;solution des symboles depuis le programme ex&eacute;cutable
227     pour le DSO lorsqu'on utilise un DSO pour &eacute;tendre les fonctionnalit&eacute;s d'un
228     programme (la seconde m&eacute;thode). Pourquoi ? Parce que la "r&eacute;solution
229     inverse" des symboles DSO &agrave; partir du jeu de symboles du programme
230     ex&eacute;cutable d&eacute;pend de la conception de la biblioth&egrave;que (la biblioth&egrave;que n'a
231     aucune information sur le programme qui l'utilise) et n'est ni standardis&eacute;e
232     ni disponible sur toutes les plateformes. En pratique, les symboles globaux
233     du programme ex&eacute;cutable ne sont en g&eacute;n&eacute;ral pas r&eacute;export&eacute;s et donc
234     indisponibles pour l'utilisation dans un DSO. Trouver une m&eacute;thode pour
235     forcer l'&eacute;diteur de liens &agrave; exporter tous les symboles globaux est le
236     principal probl&egrave;me que l'on doit r&eacute;soudre lorsqu'on utilise un DSO pour
237     &eacute;tendre les fonctionnalit&eacute;s d'un programme au moment de son ex&eacute;cution.</p>
238
239     <p>L'approche des biblioth&egrave;ques partag&eacute;es est la plus courante, parce que
240     c'est dans cette optique que le m&eacute;canisme DSO a &eacute;t&eacute; con&ccedil;u ; c'est cette
241     approche qui est ainsi
242     utilis&eacute;e par pratiquement tous les types de biblioth&egrave;ques que fournit le
243     syst&egrave;me d'exploitation.</p>
244
245 </section>
246
247 <section id="advantages"><title>Avantages et inconv&eacute;nients</title>
248
249     <p>Les fonctionnalit&eacute;s ci-dessus bas&eacute;es sur les DSO pr&eacute;sentent les
250     avantages suivants :</p>
251
252     <ul>
253       <li>Le paquetage du serveur est plus flexible &agrave; l'ex&eacute;cution car le
254       processus serveur peut &ecirc;tre assembl&eacute; &agrave; l'ex&eacute;cution via la
255       directive <directive module="mod_so">LoadModule</directive> du fichier de
256       configuration <code>httpd.conf</code> plut&ocirc;t que par des options du script
257       <program>configure</program> &agrave; la compilation. Par exemple,
258       on peut ainsi ex&eacute;cuter diff&eacute;rentes instances du serveur
259       (standard et version SSL, version minimale et version dynamique
260       [mod_perl, mod_php], <em>etc...</em>) &agrave; partir d'une seule installation
261       d'Apache httpd.</li>
262
263       <li>Le paquetage du serveur peut &ecirc;tre facilement &eacute;tendu avec des modules
264       tiers, m&ecirc;me apr&egrave;s l'installation. Ceci pr&eacute;sente un gros
265       avantage pour les mainteneurs de paquetages destin&eacute;s aux distributions,
266       car ils peuvent cr&eacute;er un paquetage Apache httpd de base, et des paquetages
267       additionnels contenant des extensions telles que PHP, mod_perl, mod_fastcgi,
268       <em>etc...</em></li>
269
270       <li>Une facilit&eacute; de prototypage des modules Apache httpd, car la paire
271       DSO/<program>apxs</program> vous permet d'une part de travailler en
272       dehors de l'arborescence des sources d'Apache httpd, et d'autre part de n'avoir
273       besoin que de la commande <code>apxs -i</code>
274       suivie d'un <code>apachectl restart</code> pour introduire une nouvelle
275       version de votre module fra&icirc;chement d&eacute;velopp&eacute; dans le serveur HTTP Apache
276       en cours d'ex&eacute;cution.</li>
277     </ul>
278
279     <p>Inconv&eacute;nients des DSO :</p>
280
281     <ul>
282       <li>Le serveur est environ 20 % plus lent au d&eacute;marrage
283       &agrave; cause des r&eacute;solutions de symboles suppl&eacute;mentaires que le chargeur
284       Unix doit effectuer.</li>
285
286       <li>Le serveur est environ 5 % plus lent &agrave; l'ex&eacute;cution
287       sur certaines plates-formes, car le code ind&eacute;pendant de la position (PIC)
288       n&eacute;cessite parfois des manipulations compliqu&eacute;es en assembleur pour
289       l'adressage relatif qui ne sont pas toujours aussi rapides que celles
290       que permet l'adressage absolu.</li>
291
292       <li>Comme les modules DSO ne peuvent pas &ecirc;tre li&eacute;s avec d'autres
293       biblioth&egrave;ques bas&eacute;es sur DSO (<code>ld -lfoo</code>) sur toutes les
294       plates-formes
295       (par exemple, les plates-formes bas&eacute;es sur a.out ne fournissent en
296       g&eacute;n&eacute;ral pas cette fonctionnalit&eacute; alors que les plates-formes bas&eacute;es sur
297       ELF le font), vous ne pouvez pas utiliser le m&eacute;canisme DSO pour tous les
298       types de modules. Ou en d'autres termes, les modules compil&eacute;s comme
299       fichiers DSO sont contraints de n'utiliser que les symboles du coeur
300       d'Apache httpd, de la biblioth&egrave;que C
301       (<code>libc</code>) et toutes autres biblioth&egrave;ques statiques ou
302       dynamiques utilis&eacute;es par le coeur d'Apache httpd, ou d'archives statiques
303       (<code>libfoo.a</code>) contenant du code ind&eacute;pendant de la
304       position (PIC).
305       Il y a deux solutions pour utiliser un autre type de code : soit le
306       coeur d'Apache httpd contient d&eacute;j&agrave; lui-m&ecirc;me une r&eacute;f&eacute;rence au code, soit vous
307       chargez le code vous-m&ecirc;me via <code>dlopen()</code>.</li>
308     </ul>
309
310 </section>
311
312 </manualpage>