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="es" xml:lang="es"><head><!--
4 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
5 This file is generated from xml source: DO NOT EDIT
6 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
8 <title>Soporte de Objetos Dinamicos Compartidos (DSO) - Servidor HTTP Apache</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/">Módulos</a> | <a href="./mod/directives.html">Directivas</a> | <a href="./faq/">Preguntas Frecuentes</a> | <a href="./glossary.html">Glosario</a> | <a href="./sitemap.html">Mapa de este sitio web</a></p>
15 <p class="apache">Versión 2.0 del Servidor HTTP Apache</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/">Servidor HTTP</a> > <a href="http://httpd.apache.org/docs/">Documentación</a> > <a href="./">Versión 2.0</a></div><div id="page-content"><div id="preamble"><h1>Soporte de Objetos Dinamicos Compartidos (DSO)</h1>
21 <p><span>Idiomas disponibles: </span><a href="./en/dso.html" hreflang="en" rel="alternate" title="English"> en </a> |
22 <a href="./es/dso.html" title="Español"> es </a> |
23 <a href="./fr/dso.html" hreflang="fr" rel="alternate" 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">Esta traducción podría estar
29 obsoleta. Consulte la versión en inglés de la
30 documentación para comprobar si se han producido cambios
33 <p>El servidor HTTP Apache es un programa modular en el que el
34 administrador puede elegir qué funcionalidades se incluyen
35 mediante la selección de un conjunto de módulos. En
36 primer lugar, los módulos pueden compilarse de manera
37 estática en el binario <code class="program"><a href="./programs/httpd.html">httpd</a></code>. De forma
38 alternativa, los módulos también pueden compilarse como
39 Objetos Dinamicos Compartidos (DSOs) que existen de forma
40 independiente del archivo binario <code class="program"><a href="./programs/httpd.html">httpd</a></code>. Los
41 módulos que se deseen usar como objetos dinámicos
42 compartidos pueden compilarse al mismo tiempo que el servidor, o
43 pueden compilarse en otro momento y ser añadidos después
44 usando la Herramienta de Extensión de Apache
45 (<code class="program"><a href="./programs/apxs.html">apxs</a></code>).</p>
47 <p>Este documento describe cómo usar los módulos en
48 forma de objeto dinámico compartido (DSO) así como los
49 fundamentos teóricos que hay detrás para explicar su
52 <div id="quickview"><ul id="toc"><li><img alt="" src="./images/down.gif" /> <a href="#implementation">Implementación</a></li>
53 <li><img alt="" src="./images/down.gif" /> <a href="#usage">Resumen de uso</a></li>
54 <li><img alt="" src="./images/down.gif" /> <a href="#background">Fundamentos teoróricos
55 detrás de los objetos dinámicos compartidos</a></li>
56 <li><img alt="" src="./images/down.gif" /> <a href="#advantages">Ventajas e Inconvenientes</a></li>
58 <div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
60 <h2><a name="implementation" id="implementation">Implementación</a></h2>
62 <table class="related"><tr><th>Módulos Relacionados</th><th>Directivas Relacionadas</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>
64 <p>Cargar módulos de Apache individualmente como objetos
65 dinámicos compartidos (DSO) es posible gracias a un
66 módulo llamado <code class="module"><a href="./mod/mod_so.html">mod_so</a></code> que debe compilarse
67 estáticamente en el núcleo (kernel) de Apache. Es el
68 único módulo junto con el módulo
69 <code class="module"><a href="./mod/core.html">core</a></code> que no se puede usar como objeto
70 dinámico compartido. Prácticamente todos los demás
71 módulos distribuidos con Apache se pueden usar como objetos
72 dinámicos compartidos individualmente siempre y cuando se
73 haya activado la posibilidad de usarlos con la opción de
74 <code class="program"><a href="./programs/configure.html">configure</a></code>
75 <code>--enable-<em>module</em>=shared</code> tal y como se
76 explicó en la <a href="install.html">documentación de
77 instalación</a>. Una vez que haya compilado un módulo
78 como objeto dinámico compartido y le haya puesto un nombre
79 del tipo <code>mod_foo.so</code>, puede cargarlo al iniciar o
80 reiniciar el servidor usando el comando <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> de <code class="module"><a href="./mod/mod_so.html">mod_so</a></code>
81 en el fichero <code>httpd.conf</code>.</p>
83 <p>Para simplificar la creación de objetos dinámicos
84 compartidos para Apache (especialmente módulos de terceras
85 partes) está disponible un nuevo programa de soporte llamado
86 <code class="program"><a href="./programs/apxs.html">apxs</a></code> (<em>APache eXtenSion</em>). Puede usar
87 este programa para crear módulos como objetos dinámicos
88 compartidos <em>sin tener que</em> crearlos al mismo tiempo que
89 compila su servidor Apache. La idea es simple: cuando se instala
90 Apache el procedimiento <code>make install</code> de
91 <code class="program"><a href="./programs/configure.html">configure</a></code> @@@ installs the Apache C header
92 files and puts the platform-dependent compiler and linker flags
93 for building DSO files into the apxs program / instala los
94 ficheros de cabecera de C de Apache y especifica las opciones de
95 compilación y enlace dependientes de la plataforma para
96 generar objetos dinámicos compartidos con
97 <code class="program"><a href="./programs/apxs.html">apxs</a></code>. De esta manera el usuario puede usar
98 <code class="program"><a href="./programs/apxs.html">apxs</a></code> para compilar el código fuente de
99 módulos de Apache de manera independiente y sin tener que
100 preocuparse por las opciones de compilación y enlace
101 dependientes de la plataforma que soportan objetos dinámicos
104 </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
105 <div class="section">
106 <h2><a name="usage" id="usage">Resumen de uso</a></h2>
108 <p>Para que se haga una idea de lo que permite el soporte de
109 objetos dinámicos compartidos en Apache 2.0, aquí tiene
110 un resumen breve pero conciso:</p>
114 Construir e instalar un módulo <em>incluido en la
115 distribución</em> de Apache, digamos
116 <code>mod_foo.c</code>, como un objeto dinámico
117 compartido de nombre <code>mod_foo.so</code>:
119 <div class="example"><p><code>
120 $ ./configure --prefix=/path/to/install --enable-foo=shared<br />
126 Construir e instalar un módulo de Apache de una
127 <em>tercera parte</em>, digamos <code>mod_foo.c</code>, como
128 un objeto dinámico compartido de nombre
129 <code>mod_foo.so</code>:
131 <div class="example"><p><code>
132 $ ./configure --add-module=module_type:/path/to/3rdparty/mod_foo.c --enable-foo=shared<br />
138 Configurar Apache para poder <em>instalar después</em>
139 objetos dinámicos compartidos:
141 <div class="example"><p><code>
142 $ ./configure --enable-so<br />
148 Construir e instalar un módulo de Apache de una
149 <em>tercera parte</em>, digamos <code>mod_foo.c</code>, como
150 un objeto dinámico compartido de nombre
151 <code>mod_foo.so</code> <em>fuera</em> de la estructura de
152 directorios de Apache usando <code class="program"><a href="./programs/apxs.html">apxs</a></code>:
154 <div class="example"><p><code>
155 $ cd /path/to/3rdparty<br />
156 $ apxs -c mod_foo.c<br />
157 $ apxs -i -a -n foo mod_foo.la
162 <p>En todos los casos, una vez que se compila el objeto
163 dinámico compartido, debe usar una directiva <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> en
164 <code>httpd.conf</code> para activar dicho módulo.</p>
165 </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
166 <div class="section">
167 <h2><a name="background" id="background">Fundamentos teoróricos
168 detrás de los objetos dinámicos compartidos</a></h2>
170 <p>En las versiones modernas de Unix, existe un mecanismo
171 especialmente útil normalmente llamado enlazado/carga de
172 <em>Objetos Dinámicos Compartidos</em> (DSO). Este mecanismo
173 ofrece una forma de construir trozos de código de programa en
174 un formato especial para cargarlo en tiempo de ejecución en
175 el espacio de direcciones de memoria de un programa
178 <p>Esta carga puede hacerse de dos maneras: automáticamente
179 con un programa de sistema llamado <code>ld.so</code> al inicio de
180 un programa ejecutable o manualmente desde dentro del programa en
181 ejecución con una interfaz programática del sistema al
182 cargador de Unix mediante llamadas al sistema
183 <code>dlopen()/dlsym()</code>.</p>
185 <p>Si se usa el primer método, los objetos dinámicos
186 compartidos se llaman normalmente <em>librerías
187 compartidas</em> ó <em>librerías DSO</em> y se
188 nombran como <code>libfoo.so</code> o
189 <code>libfoo.so.1.2</code>. Residen en un directorio de
190 sistema (normalmente <code>/usr/lib</code>) y el enlace con el
191 programa ejecutable se establece al construir la librería
192 especificando la opción<code>-lfoo</code> al comando de
193 enlace. Esto incluye las referencias literales a las
194 librerías en el programa ejecutable de manera que cuando
195 se inicie, el cargador de Unix será capaz de localizar
196 <code>libfoo.so</code> en <code>/usr/lib</code>, en rutas
197 referenciadas literalmente mediante opciones del linker como
198 <code>-R</code> o en rutas configuradas mediante la variable
199 de entorno <code>LD_LIBRARY_PATH</code>. Entonces se resuelven
200 los símbolos (todavía no resueltos) en el programa
201 ejecutable que están presentes en el objeto dinámico
204 <p>Los símbolos en el programa ejecutable no están
205 referenciados normalmente en el objeto dinámico compartido
206 (porque son librerías reusables de propósito general) y
207 por tanto, no se producen más resoluciones. El programa
208 ejecutable no tiene que hacer nada por sí mismo para usar los
209 símbolos del objeto dinámico compartido porque todo el
210 trabajo de resolución lo hace @@@ Unix loader / el cargador
211 de Unix @@@. (De hecho, el código para invocar
212 <code>ld.so</code> es parte del código que se ejecuta al
213 iniciar, y que hay en cualquier programa ejecutable que haya sido
214 construido de forma no estática). La ventaja de cargar
215 dinámicamente el código de las librerías comunes es
216 obvia: el código de las librerías necesita ser almacenado
217 solamente una vez, en una librería de sistema como
218 <code>libc.so</code>, ahorrando así espacio en disco.</p>
220 <p>Por otro lado, los objetos dinámicos compartidos
221 también suelen llamarse <em>objetos compatidos</em> o
222 <em>ficheros DSO</em> y se les puede nombrar con cualquier
223 extensión (aunque su nombre canónico es
224 <code>foo.so</code>). Estos archivos normalmente permanecen
225 dentro de un directorio específico del programa y no se
226 establecen enlaces automáticamente con los programas
227 ejecutables con los que se usan. En lugar de esto, el
228 programa ejecutable carga manualmente el objeto dinámico
229 compartido en tiempo de ejecución en su espacio de
230 direcciones de memoria con <code>dlopen()</code>. En ese
231 momento no se resuelven los símbolos del objeto
232 dinámico compartido para el programa ejecutable. En lugar
233 de esto, el cargador de Unix resuelve automáticamente los
234 símbolos (aún no resueltos en el objeto
235 dinámico compartido del conjunto de símbolos
236 exportados por el programa ejecutable y de las librerías
237 DSO que tenga ya cargadas (especialmente todos los
238 símbolos de la omnipresente <code>libc.so</code>). De
239 esta manera el objeto dinámico compartido puede conocer
240 el conjunto de símbolos del programa ejecutable como si
241 hubiera sido enlazado estáticamente en un primer
244 <p>Finalmente, para beneficiarse de la API de las DSOs, el
245 programa ejecutable tiene que resolver los símbolos
246 particulares de la DSO con <code>dlsym()</code> para ser usado
247 más tarde dentro de tablas de direccionamiento (dispatch
248 tables) <em>etc.</em> En otras palabras: El programa ejecutable
249 tiene que resolver manualmente cada uno de los símbolos que
250 necesita para poder usarlo después. La ventaja de ese
251 mecanismo es que las partes opcionales del programa no necesitan
252 ser cargadas (y por tanto no consumen memoria) hasta que se
253 necesitan por el programa en cuestión. Cuando es necesario,
254 estas partes del programa pueden cargarse dinámicamente para
255 expandir las funcionalidades básicas del programa.</p>
257 <p>Aunque este mecanismo DSO parece muy claro, hay al menos un
258 paso de cierta dificultad: la resolución de los símbolos
259 que usa el programa ejecutable por la DSO cuando se usa una DSO
260 para extender la funcionalidad de una programa (segundo caso). Por
261 qué? Porque la resolución inversa de símbolos de
262 DSOs del conjunto de símbolos del programa ejecutable se hace
263 en contra del diseño de la librería (donde la
264 librería no tiene conocimiento sobre los programas que la
265 usan) y tampoco está disponible en todas las plataformas no
266 estandarizadas. En la práctica los símbolos globales del
267 programa ejecutable están disponibles para su uso en una
268 DSO. El mayor problema que hay que resolver cuando se usan DSOs
269 para extender un programa en tiempo de ejecución es encontrar
270 un modo de forzar al enlazador a exportar todos los símbolos
273 <p>El enfoque de las librerías compartidas es bastante
274 típico, porque es para lo que se diseño el mecanismo
275 DSO, por tanto se usa para casi todos los tipos de librerías
276 que incluye el sistema operativo. Por otro lado, no muchos
277 programas usan objetos compartidos para expandir sus
280 <p>En 1998, había solamente unos pocos programas disponibles
281 que usaban el mecanismo DSO para extender su funcionalidad en
282 tiempo de ejecucion: Perl 5 (por medio de su mecanismo XS y el
283 módulo DynaLoader), Netscape Server, <em>etc.</em> A partir
284 de la version 1.3, Apache se unió a este grupo, Apache usa
285 desde entonces una concepción modular para extender su
286 funcionalidad e internamente usa un enfoque de tablas de
287 direccionamiento (dispatch-list-based) para enlazar módulos
288 externos con las funcionalidades propias del servidor. De esta
289 manera, Apache puede usar el mecanismo DSO para cargar sus
290 módulos en tiempo de ejecución.</p>
291 </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
292 <div class="section">
293 <h2><a name="advantages" id="advantages">Ventajas e Inconvenientes</a></h2>
295 <p>Las características de las librerías dinámicas
296 compartidas arriba explicadas tienen las siguientes ventajas:</p>
299 <li>El servidor es mucho más flexible en tiempo de
300 ejecución porque pueden añadirse módulos mediante
301 comandos de configuración <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> en
302 <code>httpd.conf</code> en lugar de tener que hacerlo con las
303 opciones de <code class="program"><a href="./programs/configure.html">configure</a></code> al compilar. Por
304 ejemplo, de esta manera uno puede ejecutar diferentes instancias
305 del servidor (estándar & SSL, mínima & super
306 potente [mod_perl, PHP3], <em>etc.</em>) con una única
307 instalación de Apache.</li>
309 <li>El servidor puede ser extendido fácilmente con
310 módulos de terceras partes después de la
311 instalación. Esto es un gran beneficio al menos para los
312 mantenedores de paquetes de distribuciones, que pueden crear un
313 paquete básico de Apache y paquetes adicionales que
314 contengan extensiones tales como PHP3, mod_perl, mod_fastcgi,
317 <li>Facilita la labor de hacer prototipos de módulos de
318 Apache porque con el dúo DSO/<code class="program"><a href="./programs/apxs.html">apxs</a></code> se
319 puede trabajar fuera de la estructura de directorios de Apache y
320 únicamente es necesario el comando <code>apxs -i</code>
321 seguido del comando <code>apachectl restart</code> para probar
322 la nueva versión del módulo que se está
326 <p>DSO presenta los siguientes inconvenientes:</p>
329 <li>El mecanismo DSO no puede ser usado en todas las plataformas
330 porque no todos los sistemas operativos soportan la carga
331 dinámica de código en el espacio de direcciones de
332 memoria de un programa.</li>
334 <li>El servidor es aproximadamente un 20% más lento
335 iniciándose por la sobrecarga que implica la
336 resolución de símbolos por parte del cargador de Unix.</li>
338 <li>El servidor es aproximadamente un 5% más lento
339 ejecutándose en algunas plataformas porque el código
340 posicionado independientemente (PIC) necesita algunas veces
341 procesos bastante complicados para calcular direcciones
342 relativas que no son en principio tan rápidos como los que
343 se usan para calcular direcciones absolutas.</li>
345 <li>Como los módulos DSO no pueden enlazarse a otras
346 librerías basadas en DSO (<code>ld -lfoo</code>) en todas
347 las plataformas (por ejemplo en las plataformas basadas en a.out
348 normalmente no puede ser usada esta funcionalidad, mientras que
349 sí puede ser usada en las plataformas basadas en ELF) no se
350 puede usar el mecanismo DSO para todos los tipos de
351 módulos. En otras palabras, los módulos compilados
352 como ficheros DSO solamente pueden usar símbolos del
353 núcleo (kernel) de Apache, los de las librerías de C
354 (<code>libc</code>) y de todas las demas librerías
355 dinámicas o estáticas usadas por el núcleo de
356 Apache, o de archivos de librerías estáticas
357 (<code>libfoo.a</code>) que contengan código independiente
358 de su posición. Las únicas posibilidades para usar
359 otro código es asegurarse de que el núcleo de Apache
360 contiene una referencia a él o cargar el código por
361 medio de <code>dlopen()</code>.</li>
365 <div class="bottomlang">
366 <p><span>Idiomas disponibles: </span><a href="./en/dso.html" hreflang="en" rel="alternate" title="English"> en </a> |
367 <a href="./es/dso.html" title="Español"> es </a> |
368 <a href="./fr/dso.html" hreflang="fr" rel="alternate" title="Français"> fr </a> |
369 <a href="./ja/dso.html" hreflang="ja" rel="alternate" title="Japanese"> ja </a> |
370 <a href="./ko/dso.html" hreflang="ko" rel="alternate" title="Korean"> ko </a> |
371 <a href="./tr/dso.html" hreflang="tr" rel="alternate" title="Türkçe"> tr </a></p>
372 </div><div id="footer">
373 <p class="apache">Copyright 2009 The Apache Software Foundation.<br />Licencia bajo los términos de la <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
374 <p class="menu"><a href="./mod/">Módulos</a> | <a href="./mod/directives.html">Directivas</a> | <a href="./faq/">Preguntas Frecuentes</a> | <a href="./glossary.html">Glosario</a> | <a href="./sitemap.html">Mapa de este sitio web</a></p></div>