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
8 <title>Support des objets partagés dynamiques (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.0</p>
16 <img alt="" src="./images/feather.gif" /></div>
17 <div class="up"><a href="./"><img title="<-" alt="<-" src="./images/left.gif" /></a></div>
19 <a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">Serveur HTTP</a> > <a href="http://httpd.apache.org/docs/">Documentation</a> > <a href="./">Version 2.0</a></div><div id="page-content"><div id="preamble"><h1>Support des objets partagés dynamiques (DSO)</h1>
21 <p><span>Langues Disponibles: </span><a href="./en/dso.html" hreflang="en" rel="alternate" title="English"> en </a> |
22 <a href="./es/dso.html" hreflang="es" rel="alternate" title="Español"> es </a> |
23 <a href="./fr/dso.html" title="Français"> fr </a> |
24 <a href="./ja/dso.html" hreflang="ja" rel="alternate" title="Japanese"> ja </a> |
25 <a href="./ko/dso.html" hreflang="ko" rel="alternate" title="Korean"> ko </a> |
26 <a href="./tr/dso.html" hreflang="tr" rel="alternate" title="Türkçe"> tr </a></p>
28 <div class="outofdate">Cette traduction peut être périmée. Consultez la version
29 Anglaise pour les changements récents.</div>
31 <p>Le serveur HTTP Apache est un programme modulaire permettant à
32 l'administrateur de choisir les fonctionnalités qu'il souhaite
33 activer, au moyen de modules. Les modules peuvent être intégrés
34 dans le programme binaire <code>httpd</code> au moment de la
35 compilation. Il est également possible de compiler à part des
36 modules en tant qu'objets dynamiques partagés (Dynamic Shared
37 Objects : DSOs) existant séparément du fichier binaire principal
38 <code>httpd</code>. Les modules DSO peuvent être compilés en même
39 temps que le serveur, ou après, au moyen de l'outil Apache pour
40 les extensions (<code class="program"><a href="./programs/apxs.html">apxs</a></code>).</p>
42 <p>Ce document décrit les principes de fonctionnement des modules DSO, et
43 montre comment les utiliser.</p>
45 <div id="quickview"><ul id="toc"><li><img alt="" src="./images/down.gif" /> <a href="#implementation">Implémentation</a></li>
46 <li><img alt="" src="./images/down.gif" /> <a href="#usage">Résumé sur l'utilisation des DSO</a></li>
47 <li><img alt="" src="./images/down.gif" /> <a href="#background">Contexte</a></li>
48 <li><img alt="" src="./images/down.gif" /> <a href="#advantages">Avantages et Inconvénients</a></li>
50 <div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
52 <h2><a name="implementation" id="implementation">Implémentation</a></h2>
54 <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>
56 <p>Le support DSO servant à charger des modules Apache, est lui-même
57 codé dans un module, nommé <code class="module"><a href="./mod/mod_so.html">mod_so</a></code>, qui doit être
58 compilé dans le noyau d'Apache. Ce module, ainsi que le module
59 <code class="module"><a href="./mod/core.html">core</a></code>, sont les deux seuls modules qui ne peuvent
60 être compilés séparément d'Apache. En pratique, tous les autres
61 modules d'Apache peuvent être compilés en tant que modules DSO,
62 en passant au script <code>configure</code> l'option
63 <code>--enable-<em>module</em>=shared</code>, comme précisé dans
64 la <a href="install.html">documentation d'installation</a>. Après
65 qu'un module ait été compilé en DSO (nommé
66 <code>mod_monmodule.so</code>), il est possible d'utiliser la
67 directive de <code class="module"><a href="./mod/mod_so.html">mod_so</a></code> : <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> dans le fichier <code>httpd.conf</code>,
68 afin qu'Apache charge ledit module au démarrage ou redémarrage du
71 <p>Afin de simplifier la création de fichiers DSO pour les
72 modules Apache (et en particulier les modules tiers), un nouveau
73 programme de support a été ajouté : <a href="programs/apxs.html">apxs</a> (<em>APache eXtenSion</em>). Ce programme peut être
74 utilisé pour créer des modules DSO <em>en se passant de</em>
75 l'arborescence source d'Apache. L'idée en est simple : lors de
76 l'installation d'Apache, la commande <code>make install</code>
77 positionne les fichiers d'en-têtes C d'Apache, ainsi que les
78 options du compilateur et les options propres à la plate-forme
79 dans le programme <code>apxs</code>. Ceci permet à l'utilisateur
80 de compiler ses modules Apache, au moyen de <code>apxs</code>,
81 sans disposer de l'arborescence source d'Apache et sans devoir
82 manipuler les options de compilation ou les options propres à
84 </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
86 <h2><a name="usage" id="usage">Résumé sur l'utilisation des DSO</a></h2>
88 <p>Voici un résumé bref des fonctionnalités DSO d'Apache 2.0 :</p>
92 Pour compiler et installer un module Apache <em>distribué
93 avec Apache</em>, par exemple <code>mod_foo.c</code>, en tant
94 que DSO, sous le nom <code>mod_foo.so</code> :
96 <div class="example"><p><code>
97 $ ./configure --prefix=/path/to/install --enable-foo=shared<br />
103 Pour compiler et installer un module Apache <em>fourni par un
104 tiers</em>, par exemple <code>mod_foo.c</code>, en tant que DSO,
105 sous le nom <code>mod_foo.so</code> :
107 <div class="example"><p><code>
108 $ ./configure --add-module=module_type:/chemin/vers/le/tiers/mod_foo.c --enable-foo=shared<br />
114 Pour configurer Apache afin qu'il puisse accepter les modules DSO :
116 <div class="example"><p><code>
117 $ ./configure --enable-so<br />
123 Pour compiler et installer un module Apache <em>fourni par un
124 tiers</em>, par exemple <code>mod_foo.c</code>, en tant que
125 DSO, et sans disposer de l'arborescence source d'Apache
126 (utilisation d'<a href="programs/apxs.html">apxs</a>) :
128 <div class="example"><p><code>
129 $ cd /chemin/vers/le/tiers<br />
130 $ apxs -c mod_foo.c<br />
131 $ apxs -i -a -n foo mod_foo.la
136 <p>Dans tous les cas, une fois qu'un module a été compilé en tant
137 que DSO, vous devrez utiliser la directive
138 <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> dans le
139 fichier <code>httpd.conf</code> afin qu'Apache active le module.</p>
140 </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
141 <div class="section">
142 <h2><a name="background" id="background">Contexte</a></h2>
144 <p>Sur les systèmes récents, dérivés d'Unix, il existe un procédé
145 élégant, habituellement appelé chargement dynamique d'objets
146 partagés DSO, permettant de compiler un morceau de code sous un
147 format spécial, et de pouvoir le charger en temps réel dans
148 l'espace d'adressage d'un programme exécutable.</p>
150 <p>Ce chargement peut être réalisé de deux manières :
151 automatiquement, grâce à un programme système nommé <code>ld.so</code>
152 lors du démarrage d'un exécutable, ou manuellement depuis un programme
153 en exécution via une interface programmée au moyen des appels
154 systèmes <code>dlopen()/dlsym()</code> du "chargeur" Unix</p>
156 <p>Dans le premier cas, il est courant d'appeler les DSO des
157 <em>bibliothèques partagées</em> ou des <em>bibliothèques DSO</em> ;
158 on les nomme <code>libfoo.so</code> ou <code>libfoo.so.1.2</code>.
159 Elles sont toutes placées dans un répertoire système (souvent
160 <code>/usr/lib</code>) et sont liées par les programmes exécutables
161 lors de la compilation de ces derniers, en précisant au moment de
162 la compilation l'option <code>-lfoo</code> à la commande de link
163 (linker command). Cette manière de procéder insère les références
164 des bibliothèques dans le coeur des programmes, afin qu'au moment
165 du démarrage du programme, le "chargeur" Unix puisse trouver
166 <code>libfoo.so</code> dans <code>/usr/lib</code>, ou bien dans
167 les chemins codés en dur au moyen de l'option de link <code>-R</code>,
168 ou dans un chemin configuré au moyen de la variable d'environnement
169 <code>LD_LIBRARY_PATH</code>. Tous les symboles non résolus présents
170 dans le programme sont alors résolus au moyen de DSO.</p>
172 <p>Les symboles propres au programme exécutable ne sont généralement
173 pas référencés par le DSO (puisque c'est une bibliothèque de code
174 générique), et donc aucune résolution ne doit être suivie au delà
175 de ce point. Le programme exécutable n'a pas de travail particulier
176 à faire pour résoudre les symboles des DSO, puisque c'est le
177 "chargeur" Unix qui s'occupe de cette tâche. (En réalité, le code
178 utilisé pour invoquer <code>ld.so</code> fait partie du code de
179 démarrage run-time, qui est lié à chaque programme exécutable
180 non statique). L'avantage du chargement dynamique des bibliothèques
181 de code générique est évident : le code n'est conservé qu'à un seul
182 endroit du disque, dans une bibliothèque système comme
183 <code>libc.so</code>, ce qui permet de gagner de l'espace disque
184 pour chaque programme.</p>
186 <p>Dans le second cas, les DSO sont appelés <em>objets partagés</em>
187 ou <em>fichiers DSO</em> et on peut leur attribuer une extension au
188 choix (bien que leur nom soit habituellement <code>foo.so</code>).
189 Ces fichiers résident normalement dans un répertoire propre au
190 programme qui les utilise, et ils ne sont pas liés de manière
191 automatique au programme qui les appelle. Celui-ci les charge en
192 temps réel lors de son exécution, au moyen de <code>dlopen()</code>.
193 À cet instant, aucune résolution des symboles du DSO n'est réalisée.
194 C'est le "chargeur" Unix qui réalise la tâche de résoudre les
195 symboles non résolus du DSO, à partir du jeu de symboles exportés
196 par le programme et ses bibliothèques DSO (en particulier, tous
197 les symboles de l'omniprésente <code>libc.so</code>). Ainsi, le DSO
198 gagne la connaissance des symboles du programme exécutable, comme
199 s'il lui avait été lié statiquement au départ.</p>
201 <p>Enfin, pour tirer parti de l'API DSO, l'exécutable doit résoudre
202 les symboles propres au DSO via <code>dlsym()</code>, pour les
203 utiliser plus tard dans les tables de répartition (NdT : "dispatch
204 tables"), <em>etc.</em> En d'autres termes, le programme exécutable
205 doit résoudre lui-même chaque symbole pour utiliser chacun d'entre
206 eux. L'avantage de ce mécanisme est que les parties optionnelles
207 d'un programme ne sont pas chargées (et donc, n'encombrent pas la
208 mémoire) avant que le programme n'en ait effectivement besoin.
209 Quand elles deviennent nécessaires, ces parties du programme peuvent
210 être chargées dynamiquement pour étendre les fonctionnalités du
213 <p>Bien que ce fonctionnement de DSO puisse paraître simple à
214 comprendre, il existe au moins une difficulté d'implémentation :
215 permettre au DSO de résoudre les symboles du programme quand un DSO
216 est utilisé pour étendre un programme. Pourquoi cela ? Parce que la
217 "résolution à l'envers" des symboles DSO à partir des symboles du
218 programme exécutable est contraire au principe de conception des
219 bibliothèques (où, rappelons-le, la bibliothèque ne sait rien du
220 programme qui l'utilise) ; cette "résolution à l'envers" n'est pas
221 standardisée, et n'existe pas sur toutes les plates-formes. En
222 pratique, les symboles globaux d'un programme exécutable ne sont
223 que rarement réexportés vers un DSO, et donc ne sont pas accessibles.
224 Celui qui veut pouvoir étendre les fonctionnalités d'un programme
225 dynamiquement, lors de l'exécution, doit trouver un moyen de forcer
226 le programme de liaison à exporter tous les symboles globaux de ce
229 <p>L'approche par bibliothèques partagées est de loin la plus courante
230 parce que c'est celle pour laquelle les mécanismes DSO ont été conçus ;
231 elle est donc utilisée par presque toutes les bibliothèques du système
232 d'exploitation. De l'autre coté, l'utilisation des objets partagés reste
233 une approche marginale.</p>
235 <p>Depuis 1998, seules quelques solutions logiciels existantes
236 utilisent le mécanisme des DSO pour étendre leurs fonctionnalités
237 en cours exécution : Perl 5 (via son "XS mechanism" et le module
238 DynaLoader), Netscape Server, <em>etc.</em> Depuis la version 1.3,
239 Apache a rejoint ce groupe, car Apache utilise une approche
240 modulaire pour étendre ses fonctionnalités, et utilise de manière
241 interne des mécanismes de répartition par liste pour lier des
242 modules externes à son noyau. Apache était vraiment prédestiné,
243 par concept, à utiliser les DSO pour charger ses modules en temps
245 </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
246 <div class="section">
247 <h2><a name="advantages" id="advantages">Avantages et Inconvénients</a></h2>
249 <p>Les possibilités des DSO décrites ci-avant présentent les
250 avantages suivants :</p>
253 <li>Le paquetage du serveur est plus flexible lors de son exécution,
254 car les processus du serveur central peuvent être étendus pendant
255 son exécution, au moyen de la directive
256 <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code>, dans
257 <code>httpd.conf</code>, plutôt que forcer les utilisateurs à
258 recompiler le serveur pour modifier ses fonctionnalités. Par
259 exemple, ce mode de fonctionnement permet de faire tourner
260 plusieurs instances du serveur (version standard & SSL
261 version, version minimaliste & étendue [mod_perl, PHP3],
262 <em>etc.</em>) au moyen d'une seule installation d'Apache.</li>
264 <li>Il est très facile d'étendre les fonctionnalités du serveur
265 de base, même après son installation. Ceci est d'un grand secours
266 aux mainteneurs des paquets qui peuvent facilement créer des
267 paquets pour l'installation de base d'Apache et d'autres paquets
268 différents pour les extensions, comme PHP3, mod_perl,
269 mod_fastcgi, <em>etc.</em></li>
271 <li>Facilité de développement des modules Apache ; grâce aux outils
272 DSO/<code>apxs</code>, ce travail est faisable sans l'arborescence
273 source d'Apache, et ne nécessite qu'une commande <code>apxs -i</code>
274 suivi d'un <code>apachectl restart</code> pour ajouter au serveur
275 déjà en marche les fonctionnalités du module développé.</li>
278 <p>Les inconvénients liés à l'utilisation des DSO :</p>
281 <li>Les mécanismes de DSO ne sont pas portables sur toutes les
282 plates-formes, car tous les systèmes d'exploitation ne supportent
283 pas le chargement dynamique de code dans l'espace d'adressage d'un
284 programme en marche.</li>
286 <li>Le serveur est à peu près 20% plus lent au démarrage, à cause de la
287 charge prise par le "chargeur" Unix de la résolution des symboles.</li>
289 <li>Le serveur est à peu près 5% plus lent en fonctionnement sur
290 certaines plates-formes parce que le code indépendant de la
291 position ("position independent code" - PIC) requiert parfois des
292 tours de passe-passe en assembleur pour l'adressage relatif, ce qui
293 n'est pas toujours aussi rapide que l'adressage absolu.</li>
295 <li>Les modules DSO ne pouvant pas être liés à d'autres bibliothèques
296 DSO (<code>ld -lfoo</code>) sur toutes les plates-formes (par
297 exemple, les plates-formes basées sur a.out ne le permettent pas,
298 alors que celles basées sur ELF le permettent), il n'est pas possible
299 d'utiliser les mécanismes de DSO pour tous les modules. En d'autres
300 termes, les modules compilés en tant que fichiers DSO sont limités
301 à l'utilisation des symboles exportés par le noyau d'Apache, par
302 la bibliothèque C (<code>libc</code>) et toute autre bibliothèque
303 dynamique ou statique utilisée par le noyau d'Apache, ou par des
304 archives de bibliothèques statiques (<code>libfoo.a</code>) qui
305 contiennent du code indépendant de la position. Les seuls moyens
306 d'utiliser du code à l'extérieur d'un fichier DSO sont, soit de
307 s'assurer que le noyau d'Apache contienne une référence vers ce
308 code, soit de charger ce code au moyen de <code>dlopen()</code>.</li>
312 <div class="bottomlang">
313 <p><span>Langues Disponibles: </span><a href="./en/dso.html" hreflang="en" rel="alternate" title="English"> en </a> |
314 <a href="./es/dso.html" hreflang="es" rel="alternate" title="Español"> es </a> |
315 <a href="./fr/dso.html" title="Français"> fr </a> |
316 <a href="./ja/dso.html" hreflang="ja" rel="alternate" title="Japanese"> ja </a> |
317 <a href="./ko/dso.html" hreflang="ko" rel="alternate" title="Korean"> ko </a> |
318 <a href="./tr/dso.html" hreflang="tr" rel="alternate" title="Türkçe"> tr </a></p>
319 </div><div id="footer">
320 <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>
321 <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>