]> granicus.if.org Git - apache/blob - docs/manual/dso.html.fr
xforms
[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" /><link rel="stylesheet" type="text/css" href="./style/css/prettify.css" />
12 <script src="./style/scripts/prettify.js" type="text/javascript">
13 </script>
14
15 <link href="./images/favicon.ico" rel="shortcut icon" /></head>
16 <body id="manual-page"><div id="page-header">
17 <p class="menu"><a href="./mod/">Modules</a> | <a href="./mod/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="./glossary.html">Glossaire</a> | <a href="./sitemap.html">Plan du site</a></p>
18 <p class="apache">Serveur Apache HTTP Version 2.5</p>
19 <img alt="" src="./images/feather.gif" /></div>
20 <div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="./images/left.gif" /></a></div>
21 <div id="path">
22 <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.5</a></div><div id="page-content"><div id="preamble"><h1>Support des objets dynamiques partagés (DSO)</h1>
23 <div class="toplang">
24 <p><span>Langues Disponibles: </span><a href="./en/dso.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
25 <a href="./fr/dso.html" title="Français">&nbsp;fr&nbsp;</a> |
26 <a href="./ja/dso.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
27 <a href="./ko/dso.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
28 <a href="./tr/dso.html" hreflang="tr" rel="alternate" title="Türkçe">&nbsp;tr&nbsp;</a></p>
29 </div>
30
31     <p>La conception modulaire du serveur HTTP Apache permet à l'administrateur
32     de choisir les fonctionnalités à inclure dans le serveur en sélectionnant
33     un certain nombre de modules. Les modules seront compilés en tant
34     qu'Objets Dynamiques Partagés (Dynamic Shared Objects ou DSOs)
35     qui mènent une existence séparée du fichier binaire principal
36     <code class="program"><a href="./programs/httpd.html">httpd</a></code>. Les modules DSO peuvent être compilés en
37     même temps que le serveur, ou compilés et ajoutés ultérieurement via
38     l'Outil des Extensions à Apache (Apache Extension Tool ou
39     <code class="program"><a href="./programs/apxs.html">apxs</a></code>).</p>
40     <p>Les modules peuvent aussi être intégrés statiquement dans le
41     binaire <code class="program"><a href="./programs/httpd.html">httpd</a></code> lors de la compilation de ce
42     dernier.</p>
43
44     <p>Ce document décrit l'utilisation des modules DSO ainsi que les dessous
45     de leur fonctionnement.</p>
46   </div>
47 <div id="quickview"><ul id="toc"><li><img alt="" src="./images/down.gif" /> <a href="#implementation">Implémentation</a></li>
48 <li><img alt="" src="./images/down.gif" /> <a href="#usage">Mode d'emploi succinct</a></li>
49 <li><img alt="" src="./images/down.gif" /> <a href="#background">Les dessous du fonctionnement des DSO</a></li>
50 <li><img alt="" src="./images/down.gif" /> <a href="#advantages">Avantages et inconvénients</a></li>
51 </ul><ul class="seealso"><li><a href="#comments_section">Commentaires</a></li></ul></div>
52 <div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
53 <div class="section">
54 <h2><a name="implementation" id="implementation">Implémentation</a></h2>
55
56 <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>
57
58     <p>Le support DSO pour le chargement de modules individuels d'Apache
59     httpd est
60     assuré par un module nommé <code class="module"><a href="./mod/mod_so.html">mod_so</a></code> qui doit être compilé
61     statiquement dans le coeur d'Apache httpd. Il s'agit du seul module avec le
62     module <code class="module"><a href="./mod/core.html">core</a></code> à ne pas pouvoir être compilé en tant que
63     module DSO lui-même. Pratiquement tous les autres modules d'Apache httpd
64     distribués seront alors compilés en tant que modules DSO. Une fois
65     compilé en tant que module DSO nommé <code>mod_foo.so</code>, un
66     module peut être chargé en mémoire au
67     démarrage ou redémarrage du serveur à l'aide de
68     la directive <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> du module
69     <code class="module"><a href="./mod/mod_so.html">mod_so</a></code>, placée
70     dans votre fichier <code>httpd.conf</code>.</p>
71     <p>La compilation en mode DSO peut être désactivée pour certains
72     modules via l'option <code>--enable-mods-static</code> du script
73     <code class="program"><a href="./programs/configure.html">configure</a></code>, comme expliqué dans la <a href="install.html">Documentation sur l'installation</a>.</p>
74
75     <p>Un utilitaire permet de simplifier la création de
76     fichiers DSO pour les modules d'Apache httpd
77     (particulièrement pour les modules tiers) ; il s'agit du programme nommé
78     <code class="program"><a href="./programs/apxs.html">apxs</a></code> (<dfn>APache
79     eXtenSion</dfn>). On peut l'utiliser pour construire des modules de type
80     DSO <em>en dehors</em> de l'arborescence des sources d'Apache httpd. L'idée est
81     simple : à l'installation du serveur HTTP Apache, la procédure <code>make install</code>
82     du script <code class="program"><a href="./programs/configure.html">configure</a></code> installe les fichiers d'en-têtes
83     d'Apache httpd et positionne, pour la plateforme de compilation,  les drapeaux du compilateur et de
84     l'éditeur de liens à l'intérieur du programme
85     <code class="program"><a href="./programs/apxs.html">apxs</a></code>, qui sera utilisé pour la construction de fichiers DSO.
86     Il est ainsi possible d'utiliser le programme <code class="program"><a href="./programs/apxs.html">apxs</a></code>
87     pour compiler ses sources de modules Apache httpd sans avoir besoin de
88     l'arborescence des sources de la distribution d'Apache, et sans avoir à
89     régler les drapeaux du compilateur et de l'éditeur de liens pour le support DSO.</p>
90 </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
91 <div class="section">
92 <h2><a name="usage" id="usage">Mode d'emploi succinct</a></h2>
93
94     <p>Afin que vous puissiez vous faire une idée des fonctionnalités DSO
95     du serveur HTTP Apache 2.x, en voici un résumé court et concis :</p>
96
97     <ol>
98       <li>
99         <p>Construire et installer un module Apache httpd <em>faisant partie de la
100         distribution</em>, par exemple <code>mod_foo.c</code>,
101         en tant que module DSO <code>mod_foo.so</code> :</p>
102
103 <div class="example"><p><code>
104 $ ./configure --prefix=/chemin/vers/installation --enable-foo<br />
105 $ make install
106 </code></p></div>
107       </li>
108
109       <li>
110         <p>Configure le serveur HTTP Apache avec tous les modules
111         activés. Seul un jeu de modules de base sera chargé au
112         démarrage du serveur. Vous pouvez modifier ce jeu de modules
113         chargés au démarrage en activant ou désactivant les directives <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> correspondantes dans le
114       fichier <code>httpd.conf</code>.</p>
115
116 <div class="example"><p><code>
117 $ ./configure --enable-mods-shared=all<br />
118 $ make install
119 </code></p></div>
120
121         <p>L'argument <code>most</code> de l'option
122         <code>--enable-modules</code> indique que tous les modules
123         non-expérimentaux ou qui ne sont pas là à titre d'exemple seront
124         compilés.</p>
125       </li>
126
127       <li>
128       <p>Certains modules ne sont utilisés que par les développeurs et
129       ne seront pas compilés. Si vous voulez les utiliser, spécifiez
130       l'option <em>all</em>. Pour compiler tous les modules disponibles,
131       y compris les modules de développeurs, spécifiez l'option
132       <em>reallyall</em>. En outre, la directive <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> peut être activée pour tous
133       les modules compilés via l'option du script configure
134       <code>--enable-load-all-modules</code>.</p>
135
136 <div class="example"><p><code>
137 $ ./configure --enable-mods-shared=reallyall --enable-load-all-modules<br />
138 $ make install
139 </code></p></div>
140       </li>
141
142       <li>
143         Construire et installer un module Apache httpd <em>tiers</em>, par exemple
144         <code>mod_foo.c</code>, en tant que module DSO
145         <code>mod_foo.so</code> <em>en dehors</em> de l'arborescence des sources
146         d'Apache httpd à l'aide du programme <code class="program"><a href="./programs/apxs.html">apxs</a></code> :
147
148 <div class="example"><p><code>
149 $ cd /chemin/vers/module_tiers<br />
150 $ apxs -cia mod_foo.c
151 </code></p></div>
152       </li>
153     </ol>
154
155     <p>Dans tous les cas, une fois le module partagé compilé, vous devez
156     ajouter une directive <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code>
157     dans le fichier <code>httpd.conf</code> pour qu'Apache httpd active le module.</p>
158
159     <p>Voir la <a href="programs/apxs.html">documentation sur apxs</a>
160     pour plus de détails.</p>
161 </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
162 <div class="section">
163 <h2><a name="background" id="background">Les dessous du fonctionnement des DSO</a></h2>
164
165     <p>Les clônes modernes d'UNIX proposent un mécanisme
166     appelé édition de liens et chargement dynamiques d'
167     <em>Objets Dynamiques Partagés</em> (DSO), qui permet de construire un
168     morceau de programme dans un format spécial pour le rendre chargeable
169     à l'exécution dans l'espace d'adressage d'un programme exécutable.</p>
170
171     <p>Ce chargement peut s'effectuer de deux manières : automatiquement par
172     un programme système appelé <code>ld.so</code> quand un programme
173     exécutable est démarré, ou manuellement à partir du programme en cours
174     d'exécution via sa propre interface système vers le chargeur Unix à l'aide
175     des appels système <code>dlopen()/dlsym()</code>.</p>
176
177     <p>Dans la première méthode, les DSO sont en général appelés
178     <em>bibliothèques partagées</em> ou encore <em>bibliothèques DSO</em>, et
179     possèdent des noms du style
180     <code>libfoo.so</code> ou <code>libfoo.so.1.2</code>. Ils résident dans un
181     répertoire système (en général <code>/usr/lib</code>)
182     et le lien avec le programme exécutable est établi à la compilation en
183     ajoutant <code>-lfoo</code> à la commande de l'éditeur de liens. Les
184     références à la bibliothèque sont ainsi codées en dur dans le fichier du
185     programme exécutable de façon à ce qu'au démarrage du programme, le
186     chargeur Unix soit capable de localiser <code>libfoo.so</code> dans
187     <code>/usr/lib</code>, dans des chemins codés en dur à l'aide d'options de
188     l'éditeur de liens comme <code>-R</code> ou dans des chemins définis par la
189     variable d'environnement
190     <code>LD_LIBRARY_PATH</code>. Le chargeur peut dès lors résoudre tous les symboles
191     (jusque là non encore résolus) du DSO dans le programme exécutable.</p>
192
193     <p>Les symboles du programme exécutable ne sont en général pas
194     référencés par le DSO (car c'est une bibliothèque de code à usage général
195     et réutilisable),
196     et ainsi aucune résolution supplémentaire n'est nécessaire. De son côté,
197     le programme exécutable ne doit accomplir aucune action particulière
198     pour utiliser les
199     symboles du DSO car toutes les résolutions sont effectuées par le chargeur
200     Unix. En fait, le code permettant d'invoquer
201     <code>ld.so</code> fait partie du code de démarrage pour l'exécution qui
202     est lié dans tout programme exécutable non statiquement lié.
203     L'avantage du chargement dynamique du code d'une bibliothèque partagée est
204     évident : le code de la bibliothèque ne doit être stocké qu'une seule fois
205     dans une bibliothèque système telle que <code>libc.so</code>, ce qui permet
206     d'économiser de l'espace disque pour les autres programmes.</p>
207
208     <p>Dans la seconde méthode, les DSO sont en général appelés <em>objets
209     partagés</em> ou <em>fichiers DSO</em>, et peuvent être nommés avec
210     l'extension de son choix (bien que le nom conseillé soit du style
211     <code>foo.so</code>). Ces fichiers résident en général dans un répertoire
212     spécifique à un programme, et aucun lien n'est automatiquement établi avec
213     le programme exécutable dans lequel ils sont utilisés.
214     Le programme exécutable charge manuellement le DSO à l'exécution dans son
215     espace d'adressage à l'aide de l'appel système <code>dlopen()</code>.
216     A ce moment, aucune résolution de symboles du DSO n'est effectuée pour le
217     programme exécutable. Par contre le chargeur Unix
218     résoud automatiquement tout symbole du DSO (non encore résolu)
219     faisant partie de l'ensemble de symboles exporté par le programme
220     exécutable et ses bibliothèques DSO déjà chargées (et en particulier tous
221     les symboles de la bibliothèque à tout faire <code>libc.so</code>).
222     De cette façon, le DSO prend connaissance de l'ensemble de symboles du
223     programme exécutable comme s'il avait été lié statiquement avec lui
224     auparavant.</p>
225
226     <p>Finalement, pour tirer profit de l'API des DSO, le programme exécutable
227     doit résoudre certains symboles du DSO à l'aide de l'appel système
228     <code>dlsym()</code> pour une utilisation ultérieure dans les tables de
229     distribution, <em>etc...</em> En d'autres termes, le programme exécutable doit
230     résoudre manuellement tous les symboles dont il a besoin pour pouvoir les
231     utiliser.
232     Avantage d'un tel mécanisme : les modules optionnels du programme n'ont pas
233     besoin d'être chargés (et ne gaspillent donc pas de ressources mémoire)
234     tant qu'il ne sont pas nécessaires au programme en question. Si nécessaire,
235     ces modules peuvent être chargés dynamiquement afin d'étendre les
236     fonctionnalités de base du programme.</p>
237
238     <p>Bien que ce mécanisme DSO paraisse évident, il comporte au moins une
239     étape difficile : la résolution des symboles depuis le programme exécutable
240     pour le DSO lorsqu'on utilise un DSO pour étendre les fonctionnalités d'un
241     programme (la seconde méthode). Pourquoi ? Parce que la "résolution
242     inverse" des symboles DSO à partir du jeu de symboles du programme
243     exécutable dépend de la conception de la bibliothèque (la bibliothèque n'a
244     aucune information sur le programme qui l'utilise) et n'est ni standardisée
245     ni disponible sur toutes les plateformes. En pratique, les symboles globaux
246     du programme exécutable ne sont en général pas réexportés et donc
247     indisponibles pour l'utilisation dans un DSO. Trouver une méthode pour
248     forcer l'éditeur de liens à exporter tous les symboles globaux est le
249     principal problème que l'on doit résoudre lorsqu'on utilise un DSO pour
250     étendre les fonctionnalités d'un programme au moment de son exécution.</p>
251
252     <p>L'approche des bibliothèques partagées est la plus courante, parce que
253     c'est dans cette optique que le mécanisme DSO a été conçu ; c'est cette
254     approche qui est ainsi
255     utilisée par pratiquement tous les types de bibliothèques que fournit le
256     système d'exploitation.</p>
257
258 </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
259 <div class="section">
260 <h2><a name="advantages" id="advantages">Avantages et inconvénients</a></h2>
261
262     <p>Les fonctionnalités ci-dessus basées sur les DSO présentent les
263     avantages suivants :</p>
264
265     <ul>
266       <li>Le paquetage du serveur est plus flexible à l'exécution car le
267       processus serveur peut être assemblé à l'exécution via la
268       directive <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> du fichier de
269       configuration <code>httpd.conf</code> plutôt que par des options du script
270       <code class="program"><a href="./programs/configure.html">configure</a></code> à la compilation. Par exemple,
271       on peut ainsi exécuter différentes instances du serveur
272       (standard et version SSL, version minimale et version dynamique
273       [mod_perl, mod_php], <em>etc...</em>) à partir d'une seule installation
274       d'Apache httpd.</li>
275
276       <li>Le paquetage du serveur peut être facilement étendu avec des modules
277       tiers, même après l'installation. Ceci présente un gros
278       avantage pour les mainteneurs de paquetages destinés aux distributions,
279       car ils peuvent créer un paquetage Apache httpd de base, et des paquetages
280       additionnels contenant des extensions telles que PHP, mod_perl, mod_fastcgi,
281       <em>etc...</em></li>
282
283       <li>Une facilité de prototypage des modules Apache httpd, car la paire
284       DSO/<code class="program"><a href="./programs/apxs.html">apxs</a></code> vous permet d'une part de travailler en
285       dehors de l'arborescence des sources d'Apache httpd, et d'autre part de n'avoir
286       besoin que de la commande <code>apxs -i</code>
287       suivie d'un <code>apachectl restart</code> pour introduire une nouvelle
288       version de votre module fraîchement développé dans le serveur HTTP Apache
289       en cours d'exécution.</li>
290     </ul>
291
292     <p>Inconvénients des DSO :</p>
293
294     <ul>
295       <li>Le serveur est environ 20 % plus lent au démarrage
296       à cause des résolutions de symboles supplémentaires que le chargeur
297       Unix doit effectuer.</li>
298
299       <li>Le serveur est environ 5 % plus lent à l'exécution
300       sur certaines plates-formes, car le code indépendant de la position (PIC)
301       nécessite parfois des manipulations compliquées en assembleur pour
302       l'adressage relatif qui ne sont pas toujours aussi rapides que celles
303       que permet l'adressage absolu.</li>
304
305       <li>Comme les modules DSO ne peuvent pas être liés avec d'autres
306       bibliothèques basées sur DSO (<code>ld -lfoo</code>) sur toutes les
307       plates-formes
308       (par exemple, les plates-formes basées sur a.out ne fournissent en
309       général pas cette fonctionnalité alors que les plates-formes basées sur
310       ELF le font), vous ne pouvez pas utiliser le mécanisme DSO pour tous les
311       types de modules. Ou en d'autres termes, les modules compilés comme
312       fichiers DSO sont contraints de n'utiliser que les symboles du coeur
313       d'Apache httpd, de la bibliothèque C
314       (<code>libc</code>) et toutes autres bibliothèques statiques ou
315       dynamiques utilisées par le coeur d'Apache httpd, ou d'archives statiques
316       (<code>libfoo.a</code>) contenant du code indépendant de la
317       position (PIC).
318       Il y a deux solutions pour utiliser un autre type de code : soit le
319       coeur d'Apache httpd contient déjà lui-même une référence au code, soit vous
320       chargez le code vous-même via <code>dlopen()</code>.</li>
321     </ul>
322
323 </div></div>
324 <div class="bottomlang">
325 <p><span>Langues Disponibles: </span><a href="./en/dso.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
326 <a href="./fr/dso.html" title="Français">&nbsp;fr&nbsp;</a> |
327 <a href="./ja/dso.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
328 <a href="./ko/dso.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
329 <a href="./tr/dso.html" hreflang="tr" rel="alternate" title="Türkçe">&nbsp;tr&nbsp;</a></p>
330 </div><div class="top"><a href="#page-header"><img src="./images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Commentaires</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&amp;A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our <a href="http://httpd.apache.org/lists.html">mailing lists</a>.</div>
331 <script type="text/javascript"><!--//--><![CDATA[//><!--
332 var comments_shortname = 'httpd';
333 var comments_identifier = 'http://httpd.apache.org/docs/trunk/dso.html';
334 (function(w, d) {
335     if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
336         d.write('<div id="comments_thread"><\/div>');
337         var s = d.createElement('script');
338         s.type = 'text/javascript';
339         s.async = true;
340         s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
341         (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
342     }
343     else {
344         d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
345     }
346 })(window, document);
347 //--><!]]></script></div><div id="footer">
348 <p class="apache">Copyright 2012 The Apache Software Foundation.<br />Autorisé sous <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
349 <p class="menu"><a href="./mod/">Modules</a> | <a href="./mod/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="./glossary.html">Glossaire</a> | <a href="./sitemap.html">Plan du site</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
350 if (typeof(prettyPrint) !== 'undefined') {
351     prettyPrint();
352 }
353 //--><!]]></script>
354 </body></html>