blob: 754e570e06ed1ae37998aa5e34e82e65282fd10a [file]
<!DOCTYPE html SYSTEM "about:legacy-compat">
<html lang="es"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="width=device-width, initial-scale=1" name="viewport">
<!--
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
This file is generated from xml source: DO NOT EDIT
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-->
<title>Dynamic Shared Object (DSO) Support - Servidor HTTP Apache Versi&oacute;n 2.5</title>
<link href="./style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet">
<link href="./style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size">
<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">
<script src="./style/scripts/prettify.min.js">
</script>
<link href="./images/favicon.png" rel="shortcut icon"></head>
<body id="manual-page"><div id="page-header">
<p class="menu"><a href="./mod/">M&oacute;dulos</a> | <a href="./mod/quickreference.html">Directivas</a> | <a href="https://cwiki.apache.org/confluence/display/httpd/FAQ">Preguntas Frecuentes</a> | <a href="./glossary.html">Glosario</a> | <a href="./sitemap.html">Mapa del sitio web</a> | <a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2">Reportar un error</a></p>
<p class="apache">Versi&oacute;n 2.5 del Servidor HTTP Apache</p>
<img alt="" src="./images/feather.png"></div>
<div class="up"><a href="./"><img title="<-" alt="<-" src="./images/left.gif"></a></div>
<div id="path">
<a href="https://www.apache.org/">Apache</a> &gt; <a href="https://httpd.apache.org/">Servidor HTTP</a> &gt; <a href="https://httpd.apache.org/docs/">Documentaci&oacute;n</a> &gt; <a href="./">Versi&oacute;n 2.5</a></div><div id="page-content"><div id="preamble"><h1>Dynamic Shared Object (DSO) Support</h1>
<button aria-label="Toggle language list" class="lang-toggle"><svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" stroke="currentColor" fill="none" viewBox="0 0 24 24" height="16" width="16"><circle r="10" cy="12" cx="12"/><line y2="12" x2="22" y1="12" x1="2"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg></button>
<div class="toplang">
<p><span>Idiomas disponibles: </span><a href="./en/dso.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
<a href="./es/dso.html" title="Espa&ntilde;ol">&nbsp;es&nbsp;</a> |
<a href="./fr/dso.html" hreflang="fr" rel="alternate" title="Fran&ccedil;ais">&nbsp;fr&nbsp;</a> |
<a href="./ja/dso.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
<a href="./ko/dso.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
<a href="./tr/dso.html" hreflang="tr" rel="alternate" title="T&uuml;rk&ccedil;e">&nbsp;tr&nbsp;</a></p>
</div>
<p>El Servidor HTTP Apache es un programa modular en el que el
administrador puede elegir la funcionalidad a incluir en el
servidor seleccionando un conjunto de m&oacute;dulos. Los m&oacute;dulos ser&aacute;n compilados
como Objetos Din&aacute;micos Compartidos (DSOs) que existen por separado del fichero
binario de <code class="program"><a href="./programs/httpd.html">httpd</a></code>. Los m&oacute;dulos DSO pueden ser generados en el
momento en que el servidor se compila, o pueden compilarse y a&ntilde;adirse
posteriormente usando la Herramienta de Extensi&oacute;n de Apache
(<code class="program"><a href="./programs/apxs.html">apxs</a></code>).</p>
<p>Alternativamente, los m&oacute;dulos se pueden compilar est&aacute;ticamente en
el binario <code class="program"><a href="./programs/httpd.html">httpd</a></code> cuando se compila el servidor.</p>
<p>Este documento describe c&oacute;mo utilizar los m&oacute;dulos DSO, as&iacute; como
la teor&iacute;a en la que se basan.
</p>
</div>
<div id="quickview"><ul id="toc"><li><img alt="" src="./images/down.gif"> <a href="#implementation">Implementaci&oacute;n</a></li>
<li><img alt="" src="./images/down.gif"> <a href="#usage">Usage Summary</a></li>
<li><img alt="" src="./images/down.gif"> <a href="#background">Contexto</a></li>
<li><img alt="" src="./images/down.gif"> <a href="#advantages">Ventajas y Desventajas</a></li>
</ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif"></a></div>
<div class="section">
<h2 id="implementation">Implementaci&oacute;n <a title="Enlace permanente" href="#implementation" class="permalink">&para;</a></h2>
<table class="related"><tr><th>M&oacute;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>
<p>El soporte DSO para cargar m&oacute;dulos httpd individuales de Apache se basa
en un m&oacute;dulo llamado <code class="module"><a href="./mod/mod_so.html">mod_so</a></code> que debe estar compilado
est&aacute;ticamente en el n&uacute;cleo de Apache httpd. Es el &uacute;nico m&oacute;dulo adem&aacute;s de
<code class="module"><a href="./mod/core.html">core</a></code> que no puede ser puesto en DSO. Pr&aacute;cticamente todos
los dem&aacute;s m&oacute;dulos httpd distribuidos de Apache se
colocar&aacute;n en un DSO llamado <code>mod_foo.so</code> puede usar la <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> directive de <code class="module"><a href="./mod/mod_so.html">mod_so</a></code> en
su fichero <code>httpd.conf</code> para cargar este m&oacute;dulo al iniciar el servidor
o al reiniciar.</p>
<p>Se pueden desactivar las construcciones DSO para m&oacute;dulos individuales con
la opci&oacute;n <code class="program"><a href="./programs/configure.html">configure</a></code> <code>--enable-mods-static</code>
tal y como se comenta en la <a href="install.html">documentaci&oacute;n de instalaci&oacute;n</a>.</p>
<p>Para simplificar esta creaci&oacute;n de archivos DSO para m&oacute;dulos httpd de Apache
(especialmente para m&oacute;dulos de terceros) un programa de apoyo
llamado <code class="program"><a href="./programs/apxs.html">apxs</a></code> (<dfn>APache
eXtenSion</dfn>) est&aacute; disponible. Se puede usar para generar
m&oacute;dulos basados en DSO <em>fuera del </em> &aacute;rbol de c&oacute;digo fuente de Apache httpd.
La idea es sencilla: Cuando se instala el Servidor Apache HTTP el procedimiento
<code>make install</code> de <code class="program"><a href="./programs/configure.html">configure</a></code> instala los ficheros
de cabecera en C de Apache httpd y pone el compilador que depende de la plataforma y
los indicadores de enlazador para generar ficheros DSO en el programa
<code class="program"><a href="./programs/apxs.html">apxs</a></code>. De esta manera el usuario puede usar <code class="program"><a href="./programs/apxs.html">apxs</a></code>
para compilar sus fientes de m&oacute;dulos de Apache httpd sin el c&oacute;digo fuente de la distribuci&oacute;n
de Apache httpd y sin tener que tratar con el compilador dependiente de plataforma y
indicadores de enlazador para el soporte de DSO.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif"></a></div>
<div class="section">
<h2 id="usage">Usage Summary <a title="Enlace permanente" href="#usage" class="permalink">&para;</a></h2>
<p>Para dar una visi&oacute;n general de las caracter&iacute;sticas DSO de Apache HTTP Server 2.x,
aqu&iacute; tenemos un resumen breve y conciso:</p>
<ol>
<li>
<p>Build and install a <em>distributed</em> Apache httpd module, say
<code>mod_foo.c</code>, into its own DSO
<code>mod_foo.so</code>:</p>
<div class="example"><p><code>
$ ./configure --prefix=/path/to/install --enable-foo<br>
$ make install
</code></p></div>
</li>
<li>
<p>Configura Apache HTTP Server con todos los m&oacute;dulos habilitados. Solo unos
pocos de ellos se cargar&aacute;n en el inicio del servidor. Se puede cambiar el conjunto
de m&oacute;dulos cargados activando o desactivando la directiva <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> en
<code>httpd.conf</code>.</p>
<div class="example"><p><code>
$ ./configure --enable-mods-shared=all<br>
$ make install
</code></p></div>
</li>
<li>
<p>Algunos m&oacute;dulos s&oacute;lo son &uacute;tiles para desarrolladores y no se generar&aacute;n.
cuando se usa la opci&oacute;n de m&oacute;dulos <em>all</em>. Para generar todos los m&oacute;dulos
disponibles incluyendo los de desarrolladorhay que usar <em>reallyall</em>. Adem&aacute;s
las directivas <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> para todos los
m&oacute;dulos generados puede activarse a trav&eacute;s de la opci&oacute;n de &uml;configure&uml;
<code>--enable-load-all-modules</code>.</p>
<div class="example"><p><code>
$ ./configure --enable-mods-shared=reallyall --enable-load-all-modules<br>
$ make install
</code></p></div>
</li>
<li>
Genera e instala un m&oacute;dulo Apache HTTPD <em>de terceros</em>, convirtiendo
<code>mod_foo.c</code>, en su propio DSO <code>mod_foo.so</code>
<em>fuera del</em> &aacute;rbol de c&oacute;digo de Apache httpd usando <code class="program"><a href="./programs/apxs.html">apxs</a></code>:
<div class="example"><p><code>
$ cd /path/to/3rdparty<br>
$ apxs -cia mod_foo.c
</code></p></div>
</li>
</ol>
<p>En todos los casos, una vez se ha compilado el m&oacute;dulo compartido, se debe usar
una directiva <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code>
en <code>httpd.conf</code> para indicarle a Apache httpd que active el m&oacute;dulo.</p>
<p>Ver la <a href="programs/apxs.html">documentaci&oacute;in apxs</a> para m&aacute;s detalles.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif"></a></div>
<div class="section">
<h2 id="background">Contexto <a title="Enlace permanente" href="#background" class="permalink">&para;</a></h2>
<p>En derivados modernos de Unix existe un mecanismo llamado
enlace/carga din&aacute;mico de <em>Objetos Din&aacute;micos Compartidos</em>
(DSO) que facilita una forma de generar una parte de c&oacute;digo
de programa en un formato espacial para cargar en tiempo real
en el espacio de direcciones de un programa ejecutable.</p>
<p>Esta carga generalmente se puede hacer de dos maneras:
autom&aacute;ticamente desde programa de sistema llamado <code>ld.so</code>
cuando se arranca un programa ejecutable o manualmente desde dentro
del programa que se ejecuta a trav&eacute;s de un interfaz de sistema
program&aacute;tico del cargador de Unix a trav&eacute;s de las llamadas de sistema
<code>dlopen()/dlsym()</code>.</p>
<p>En la primera manera los DSO se llaman generalmente <em>librer&iacute;as
compartidas</em> o <em>librer&iacute;as DSO</em> y llamadas
<code>libfoo.so</code> o <code>libfoo.so.1.2</code>. Residen
en un directorio del sistema (generalmente <code>/usr/lib</code>)
y el enlace con el programa ejecutable se establece en tiempo de
compilaci&oacute;n especificando <code>-lfoo</code> al comando enlazador.
Esto codifica de forma r&iacute;gida referencias de librer&iacute;a en el fichero de
programa ejecutable de manera que en el arranque el cargador Unix es
capaz de localizar <code>libfoo.so</code> en <code>/usr/lib</code>, en
rutas con codificaci&oacute;n r&iacute;gida a trav&eacute;s de opciones-de-enlazador como
<code>-R</code> o en rutas configuradas por variables de entorno
<code>LD_LIBRARY_PATH</code>. Entonces resuelve s&iacute;mbolos (todav&iacute;a sin
uresolver) en el programa ejecutable que est&aacute;n disponibles en el DSO.</p>
<p>Los s&iacute;mbolos en el programa ejecutable no se referencian
generalmente por el DSO (porque es una biblioteca reutilizable de c&oacute;digo
general) y, por lo tanto, no es necesario hacer m&aacute;s resoluci&oacute;n. El programa
ejecutable no tiene necesidad de hacer nada por s&iacute; mismo para usar los
s&iacute;mbolos del DSO porque la resoluci&oacute;n completa la realiza el cargador de
Unix. (De hecho, el c&oacute;digo para invocar
<code>ld.so</code> es parte del c&oacute;digo de arranque en tiempo real que
se enlaza dentro de cada programa ejecutable que se ha generado como
no-est&aacute;tico). La ventaja de la carga din&aacute;mica de librer&iacute;as de c&oacute;digo com&uacute;n
es obv&iacute;a: el c&oacute;digo de librer&iacute;a necesita guardarse solo una vez,
en un sistema de librer&iacute;a como <code>libc.so</code>, ahorrando espacio en
disco para cada programa.</p>
<p>En la segunda manera los DSO se llaman generalmente <em>objetos
compartidos</em> o <em>ficheros DSO</em> y pueden ser nombrados con una
extensi&oacute;n aribtraria (aunque el nombre can&oacute;nico es <code>foo.so</code>).
Estos ficheros generalmente permanencen dentro de un directorio de
programa espec&iacute;fico y no hay enlace establecido autom&aacute;ticamente al
programaejecutable donde se est&aacute;n usando. En su lugar el programa ejecutable
carga manualmente el DSO en tiempo-real en su espacio de direcciones a
trav&eacute;s de <code>dlopen()</code>. En este momento no se realiza
resoluci&oacute;n de s&iacute;mbolos del DSO para el programa ejecutable. Perp en
su lugar se resuelve autom&aacute;ticamente cualquier (todav&iacute;a sin resolver)
s&iacute;mbolo en el DSO del conjunto de s&iacute;mbolos exportado por el programa
ejecutable y sus ya cargadas librer&iacute;as DSO (especialmente todos los
s&iacute;mbolos del ub&iacute;cuo <code>libc.so</code>). De esta forma el DSO obtiene
conocimiento del s&iacute;mbolo del programa ejecutable como si hubiera servidor
enlazado est&aacute;ticamente dentro de &eacute;l mismo en primer lugar.</p>
<p>Por &uacute;ltimo, para aprovechar la API del DSO, el programa ejecutable
tiene que resolver determinados s&iacute;mbolos de la DSO a trav&eacute;s de
<code>dlsym()</code> para su uso posterior dentro de las tablas de env&iacute;o
<em>etc.</em> En otras palabras: El programa ejecutable tiene que
resolver manualmente cada s&iacute;mbolo que necesita para poder utilizarlo.
La ventaja de este mecanismo es que no es necesario cargar las partes
opcionales del programa (y por lo tanto no gastan memoria) hasta que sean
necesarias para el programa en cuesti&oacute;n. Cuando se necesitan, estas partes
del programa se pueden cargar din&aacute;micamente para ampliar la funcionalidad
del programa base.</p>
<p>Aunque este mecanismo DSO parece sencillo, hay al menos un paso dif&iacute;cil:
La resoluci&oacute;n de s&iacute;mbolos de del programa ejecutable para el DSO cuando se
usa un DSO para extender un programa (la segunda manera). &iquest;Por qu&eacute;? Porque
la "resoluci&oacute;n inversa" de s&iacute;mbolos DSO desde el conjunto de s&iacute;mbolos del
programa ejecutable va en contra del dise&ntilde;o de la biblioteca (donde la
biblioteca no tiene conocimiento de los programas que la utilizan) y no est&aacute;
disponible en todas las plataformas ni est&aacute; estandarizada. En la pr&aacute;ctica, los
s&iacute;mbolos programa ejecutable a menudo no se reexportan y, por lo tanto, no est&aacute;n
disponibles para su uso en un DSO. Encontrar una forma de forzar al enlazador
a exportar todos los s&iacute;mbolos globales es el principal problema que uno tiene que
resolver cuando se utiliza DSO para extender un programa en tiempo de ejecuci&oacute;n.</p>
<p>El m&eacute;todo de librer&iacute;a compartida es el t&iacute;pico, porque es para lo que se
dise&ntilde;&oacute; el mecanismo DSO, de ah&iacute; que se utilice para casi todos los tipos de
librer&iacute;as que el sistema operativo proporciona.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif"></a></div>
<div class="section">
<h2 id="advantages">Ventajas y Desventajas <a title="Enlace permanente" href="#advantages" class="permalink">&para;</a></h2>
<p>Las caracter&iacute;sticas anteriores basadas en DSO tienen las siguientes ventajas:</p>
<ul>
<li>El paquete del servidor es m&aacute;s flexible en tiempo-real porque el proceso
del servidor puede ser cargado en tiempo-real mediante
<code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code>
en directivas de configuraci&oacute;n en <code>httpd.conf</code> en lugar de
opciones de <code class="program"><a href="./programs/configure.html">configure</a></code> en tiempo de compilaci&oacute;n. Por ejemplo,
de esta manera pueden ejecutarse distintas instancias del servidor
(standard &amp; versi&oacute;n SSL, minimalista &amp; versi&oacute;n din&aacute;mica
[mod_perl, mod_php], <em>etc.</em>) son solo una instalaci&oacute;n de Apache
httpd.</li>
<li>El paquete del servidor se puede externder f&aacute;cilmente con m&oacute;dulos de
terceros incluso despu&eacute;s de la instalaci&oacute;n. Esto es un gran beneficio para los
es una gran ventaja para los mantenedores de paquetes de proveedores, los cuales
pueden crear un paquete principal de Apache httpd y paquetes adicionales que
contengan extensiones como PHP, mod_perl, mod_security, <em>etc.</em></li>
<li>Creaci&oacute;n m&aacute;s sencilla de prototipos de m&oacute;dulos httpd de Apache, porque
con la pareja DSO/<code class="program"><a href="./programs/apxs.html">apxs</a></code> puedes trabajar fuera del
&aacute;rbol de c&oacute;digo fuente de Apache httpd y solo necesitar un comando
<code>apxs -i</code> seguido de un <code>apachectl restart</code> para
traer una nueva versi&oacute;n de tu m&oacute;dulo recien desarrollado a un servidor
Apache HTTP que ya est&aacute; funcionando.</li>
</ul>
<p>DSO tiene las siguientes desventajas:</p>
<ul>
<li>El servidor es aproximadamente un 20% m&aacute;s lento en el arranque por
la sobrecarga de resoluci&oacute;n de s&iacute;mbolos que el cargador de Unix tiene
que realizar.</li>
<li>El servidor es aproximadamente un 5% m&aacute;s lento en tiempo de ejecuci&oacute;n
en ciertas plataformas porque el c&oacute;digo independiente de positici&oacute;n (PIC)
a veces necesita realizar trucos complicados de para asignar direcciones,
que no son necesariamente tan r&aacute;pidos como el direccionamiento absoluto.</li>
<li>Porque los m&oacute;dulos DSO no pueden enlazarse a otras librer&iacute;as basadas en
DSO (<code>ld -lfoo</code>) en todas las plataformas (por ejemplo las
plataformas basadas en a.out generalmente no proveen esta funcionalidad
mientras que las plataformas basadas en ELF si) no se puede usar el macanismo
DSO para todos los tipos de m&oacute;dulos. O en otras palabras, los m&oacute;dulos compilados
como ficheros DSO est&aacute;n restringidos a s&iacute;mbolos del n&uacute;cleo de Apache httpd, de
la librer&iacute;a C (<code>libc</code>) y todas las dem&aacute;s librer&iacute;as est&aacute;ticas o
din&aacute;micas utilizadas por el nucleo de Apache httpd, o por los archivos de
librer&iacute;a est&aacute;tica (<code>libfoo.a</code>) que contienen c&oacute;digo independiente de
posici&oacute;n. Las &uacute;nicas oportunidades de usar otro c&oacute;digo es usar otro n&uacute;cleo del
mismo httpd que previamente contenga una referencia a ellas o si carga el c&oacute;digo
usted mismo a trav&eacute;s de <code>dlopen()</code>.</li>
</ul>
</div></div>
<div class="bottomlang">
<p><span>Idiomas disponibles: </span><a href="./en/dso.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
<a href="./es/dso.html" title="Espa&ntilde;ol">&nbsp;es&nbsp;</a> |
<a href="./fr/dso.html" hreflang="fr" rel="alternate" title="Fran&ccedil;ais">&nbsp;fr&nbsp;</a> |
<a href="./ja/dso.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
<a href="./ko/dso.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
<a href="./tr/dso.html" hreflang="tr" rel="alternate" title="T&uuml;rk&ccedil;e">&nbsp;tr&nbsp;</a></p>
</div><div id="footer">
<p class="apache">Copyright 2026 The Apache Software Foundation.<br>Licencia bajo los t&eacute;rminos de la <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
<p class="menu"><a href="./mod/">M&oacute;dulos</a> | <a href="./mod/quickreference.html">Directivas</a> | <a href="https://cwiki.apache.org/confluence/display/httpd/FAQ">Preguntas Frecuentes</a> | <a href="./glossary.html">Glosario</a> | <a href="./sitemap.html">Mapa del sitio web</a> | <a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2">Reportar un error</a></p></div><script><!--//--><![CDATA[//><!--
if (typeof(prettyPrint) !== 'undefined') {
prettyPrint();
}
var langToggle = document.querySelector('.lang-toggle');
var topLang = document.querySelector('.toplang');
if (langToggle && topLang) {
langToggle.addEventListener('click', function() { topLang.classList.toggle('open'); });
}
var qv = document.getElementById('quickview');
if (qv) {
document.body.appendChild(qv);
var qvBtn = document.createElement('button');
qvBtn.className = 'qv-toggle';
qvBtn.setAttribute('aria-label', 'Toggle page navigation');
qvBtn.innerHTML = '&#9776;';
document.body.appendChild(qvBtn);
qvBtn.addEventListener('click', function() {
var isOpen = qv.classList.toggle('open');
if (isOpen) {
qv.style.top = window.scrollY + 10 + 'px';
}
});
window.addEventListener('scroll', function() { qv.classList.remove('open'); });
}
//--><!]]></script>
</body></html>