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