]> granicus.if.org Git - apache/blobdiff - docs/manual/dso.html.en
Fixed a simple version numbering typo, reported by lucien.gentis (at) lorraine.iufm.fr.
[apache] / docs / manual / dso.html.en
index 76db6fc5a126f6826a7f05506c7f4704a2d46485..d1e7700539c1c5ab5754a62d1f0f3fe8b26bf832 100644 (file)
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML><HEAD>
-<TITLE>Apache 1.3 Dynamic Shared Object (DSO) support</TITLE>
-</HEAD>
-
-<!-- Background white, links blue (unvisited), navy (visited), red (active) -->
-<BODY
- BGCOLOR="#FFFFFF"
- TEXT="#000000"
- LINK="#0000FF"
- VLINK="#000080"
- ALINK="#FF0000"
->
-<BLOCKQUOTE>
-<!--#include virtual="header.html" -->
-
-<DIV ALIGN=CENTER>
-
-<H1>
-Apache 1.3<BR>
-Dynamic Shared Object (DSO)<BR>
-Support
-</H1>
-
-<ADDRESS>Originally written by<BR>
-Ralf S. Engelschall &lt;rse@apache.org&gt, April 1998</ADDRESS>
-
-</DIV>
-
-<H3>Background</H3>
-
-<P>On modern Unix derivatives there exists a nifty mechanism usually called
-dynamic linking/loading of <EM>Dynamic Shared Objects</EM> (DSO) which
-provides a way to build a piece of program code in a special format for
-loading it at run-time into the address space of an executable program.
-
-<P>This loading can usually be done in two ways: Automatically by a system
-program called <CODE>ld.so</CODE> when an executable program is started or
-manually from within the executing program via a programmatic system interface
-to the Unix loader through the system calls <CODE>dlopen()/dlsym()</CODE>.
-<P>In the first way the DSO's are usually called <EM>shared libraries</EM> or
-<EM>DSO libraries</EM> and named <CODE>libfoo.so</CODE> or
-<CODE>libfoo.so.1.2</CODE>.  They reside in a system directory (usually
-<CODE>/usr/lib</CODE>) and the link to the executable program is established
-at build-time by specifying <CODE>-lfoo</CODE> to the linker command. This
-hard-codes library references into the executable program file so that at
-start-time the Unix loader is able to locate <CODE>libfoo.so</CODE> in
-<CODE>/usr/lib</CODE>, in paths hard-coded via linker-options like
-<CODE>-R</CODE> or in paths configured via the environment variable
-<CODE>LD_LIBRARY_PATH</CODE>. It then resolves any (yet unresolved) symbols in
-the executable program which are available in the DSO.
-<P>Symbols in the executable program are usually not referenced by the DSO
-(because it's a reusable library of general code) and hence no further
-resolving has to be done. The executable program has no need to do anything on
-its own to use the symbols from the DSO because the complete resolving is done
-by the Unix loader. (In fact, the code to invoke <CODE>ld.so</CODE> is part of
-the run-time startup code which is linked into every executable program which
-has been bound non-static). The advantage of dynamic loading of common library
-code is obvious: the library code needs to be stored only once, in a system
-library like <CODE>libc.so</CODE>, saving disk space for every program.
-
-<P>In the second way the DSO's are usually called <EM>shared objects</EM> or
-<EM>DSO files</EM> and can be named with an arbitrary extension (although the
-canonical name is <CODE>foo.so</CODE>). These files usually stay inside a
-program-specific directory and there is no automatically established link to
-the executable program where they are used. Instead the executable program
-manually loads the DSO at run-time into its address space via
-<CODE>dlopen()</CODE>. At this time no resolving of symbols from the DSO for
-the executable program is done. But instead the Unix loader automatically
-resolves any (yet unresolved) symbols in the DSO from the set of symbols
-exported by the executable program and its already loaded DSO libraries
-(especially all symbols from the ubiquitous <CODE>libc.so</CODE>).  This way
-the DSO gets knowledge of the executable program's symbol set as if it had
-been statically linked with it in the first place.
-<P>Finally, to take advantage of the DSO's API the executable program has to
-resolve particular symbols from the DSO via <CODE>dlsym()</CODE> for later use
-inside dispatch tables etc. In other words: The executable program has to
-manually resolve every symbol it needs to be able to use it.  The advantage of
-such a mechanism is that optional program parts need not be loaded (and thus
-do not spend memory) until they are needed by the program in question. When
-required, these program parts can be loaded dynamically to extend the base
-program's functionality.
-
-<P>Although this DSO mechanism sounds straightforward there is at least one
-difficult step here: The resolving of symbols from the executable program for
-the DSO when using a DSO to extend a program (the second way). Why? Because
-"reverse resolving" DSO symbols from the executable program's symbol set is
-against the library design (where the library has no knowledge about the
-programs it is used by) and is neither available under all platforms nor
-standardized. In practice the executable program's global symbols are often
-not re-exported and thus not available for use in a DSO.  Finding a way to
-force the linker to export all global symbols is the main problem one has to
-solve when using DSO for extending a program at run-time.
-
-<H3>Practical Usage</H3>
-
-<P>The shared library approach is the typical one, because it is what the DSO
-mechanism was designed for, hence it is used for nearly all types of libraries
-the operating system provides. On the other hand using shared objects for
-extending a program is not used by a lot of programs.
-
-<P>As of 1998 there are only a few software packages available which use the
-DSO mechanism to actually extend their functionality at run-time: Perl 5 (via
-its XS mechanism and the DynaLoader module), Netscape Server, etc.  Starting
-with version 1.3, Apache joined the crew, because Apache already uses a module
-concept to extend its functionality and internally uses a dispatch-list-based
-approach to link external modules into the Apache core functionality. So,
-Apache is really predestined for using DSO to load its modules at run-time.
-
-<P>As of Apache 1.3, the configuration system supports two optional features
-for taking advantage of the modular DSO approach: compilation of the Apache
-core program into a DSO library for shared usage and compilation of the
-Apache modules into DSO files for explicit loading at run-time.
-
-<H3>Implementation</H3>
-
-<P>The DSO support for loading individual Apache modules is based on a module
-named <A HREF="mod/mod_so.html"><CODE>mod_so.c</CODE></A> which has to be
-statically compiled into the Apache core. It is the only module besides
-<CODE>http_core.c</CODE> which cannot be put into a DSO itself
-(bootstrapping!). Practically all other distributed Apache modules then can
-then be placed into a DSO by individually enabling the DSO build for them via
-<CODE>configure</CODE>'s <CODE>--enable-shared</CODE> option (see top-level
-<CODE>INSTALL</CODE> file) or by changing the <CODE>AddModule</CODE> command
-in your <CODE>src/Configuration</CODE> into a <CODE>SharedModule</CODE>
-command (see <CODE>src/INSTALL</CODE> file).  After a module is compiled into
-a DSO named <CODE>mod_foo.so</CODE> you can use <A
-HREF="mod/mod_so.html"><CODE>mod_so</CODE></A>'s <A
-HREF="mod/mod_so.html#loadmodule"><CODE>LoadModule</CODE></A> command in your
-<CODE>httpd.conf</CODE> file to load this module at server startup or restart.
-
-<P>To simplify this creation of DSO files for Apache modules (especially for
-third-party modules) a new support program named <CODE>apxs</CODE> (<EM>APache
-eXtenSion</EM>) is available. It can be used to build DSO based modules
-<EM>outside of</EM> the Apache source tree. The idea is simple: When
-installing Apache the <CODE>configure</CODE>'s <CODE>make install</CODE>
-procedure installs the Apache C header files and puts the platform-dependent
-compiler and linker flags for building DSO files into the <CODE>apxs</CODE>
-program.  This way the user can use <CODE>apxs</CODE> to compile his Apache
-module sources without the Apache distribution source tree and without having
-to fiddle with the platform-dependent compiler and linker flags for DSO
-support.
-
-<P>To place the complete Apache core program into a DSO library (only required
-on some of the supported platforms to force the linker to export the apache
-core symbols -- a prerequisite for the DSO modularization) the rule
-<CODE>SHARED_CORE</CODE> has to be enabled via <CODE>configure</CODE>'s
-<CODE>--enable-rule=SHARED_CORE</CODE> option (see top-level
-<CODE>INSTALL</CODE> file) or by changing the <CODE>Rule</CODE> command in
-your <CODE>Configuration</CODE> file to <CODE>Rule SHARED_CORE=yes</CODE> (see
-<CODE>src/INSTALL</CODE> file). The Apache core code is then placed into a DSO
-library named <CODE>libhttpd.so</CODE>. Because one cannot link a DSO against
-static libraries on all platforms, an additional executable program named
-<CODE>libhttpd.ep</CODE> is created which both binds this static code and
-provides a stub for the <CODE>main()</CODE> function.  Finally the
-<CODE>httpd</CODE> executable program itself is replaced by a bootstrapping
-code which automatically makes sure the Unix loader is able to load and start
-<CODE>libhttpd.ep</CODE> by providing the <CODE>LD_LIBRARY_PATH</CODE> to
-<CODE>libhttpd.so</CODE>.
-
-<H3>Supported Platforms</H3>
-
-<P>Apache's <CODE>src/Configure</CODE> script currently has only limited but
-adequate built-in knowledge on how to compile DSO files, because as already
-mentioned this is heavily platform-dependent. Nevertheless all major Unix
-platforms are supported.  The definitive current state (May 1998) is this:
-
-<P>
-<UL>
-<LI>Out-of-the-box supported platforms:<BR>
-(actually tested versions in parenthesis)
-
-<PRE>
-o  FreeBSD            (2.1.5, 2.2.5, 2.2.6)
-o  OpenBSD            (2.x)
-o  NetBSD             (1.3.1)
-o  Linux              (Debian/1.3.1, RedHat/4.2)
-o  Solaris            (2.4, 2.5.1, 2.6)
-o  SunOS              (4.1.3)
-o  OSF1               (4.0)
-o  IRIX               (6.2)
-o  HP/UX              (10.20)
-o  UnixWare           (2.01, 2.1.2)
-o  SCO                (5.0.4)
-o  AIX                (3.2, 4.1.5, 4.2, 4.3)
-o  ReliantUNIX/SINIX  (5.43)
-o  SVR4               (-)
-</PRE>
-
-<P>
-<LI> Explicitly unsupported platforms:
-
-<PRE>
-o  Ultrix             (no dlopen-style interface under this platform)
-</PRE>
-
-</UL>
-
-<H3>Usage Summary</H3>
-
-<P>To give you an overview of the DSO features of Apache 1.3, here is a short
-and concise summary:
-
-<OL>
-
-<LI>Placing the Apache core code (all the stuff which usually forms the
-<CODE>httpd</CODE> binary) into a DSO <CODE>libhttpd.so</CODE>, an executable
-program <CODE>libhttpd.ep</CODE> and a bootstrapping executable program
-<CODE>httpd</CODE> (Notice: this is only required on some of the supported
-platforms to force the linker to export the Apache core symbols, which in turn
-is a prerequisite for the DSO modularization):
-
-<P>
-<UL>
-<LI>Build and install via <CODE>configure</CODE> (preferred):
-<TABLE BGCOLOR="#f0f0f0" CELLPADDING=10><TR><TD>
-<PRE>
-$ ./configure --prefix=/path/to/install
-              --enable-rule=SHARED_CORE ...
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head><!--
+        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+              This file is generated from xml source: DO NOT EDIT
+        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+      -->
+<title>Dynamic Shared Object (DSO) Support - Apache HTTP Server</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 href="./images/favicon.ico" rel="shortcut icon" /></head>
+<body id="manual-page"><div id="page-header">
+<p class="menu"><a href="./mod/">Modules</a> | <a href="./mod/directives.html">Directives</a> | <a href="./faq/">FAQ</a> | <a href="./glossary.html">Glossary</a> | <a href="./sitemap.html">Sitemap</a></p>
+<p class="apache">Apache HTTP Server Version 2.3</p>
+<img alt="" src="./images/feather.gif" /></div>
+<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="./images/left.gif" /></a></div>
+<div id="path">
+<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</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>Dynamic Shared Object (DSO) Support</h1>
+<div class="toplang">
+<p><span>Available Languages: </span><a href="./en/dso.html" title="English">&nbsp;en&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></p>
+</div>
+
+    <p>The Apache HTTP Server is a modular program where the
+    administrator can choose the functionality to include in the
+    server by selecting a set of modules. The modules can be
+    statically compiled into the <code class="program"><a href="./programs/httpd.html">httpd</a></code> binary when the
+    server is built. Alternatively, modules can be compiled as
+    Dynamic Shared Objects (DSOs) that exist separately from the
+    main <code class="program"><a href="./programs/httpd.html">httpd</a></code> binary file. DSO modules may be
+    compiled at the time the server is built, or they may be
+    compiled and added at a later time using the Apache Extension
+    Tool (<code class="program"><a href="./programs/apxs.html">apxs</a></code>).</p>
+
+    <p>This document describes how to use DSO modules as well as
+    the theory behind their use.</p>
+  </div>
+<div id="quickview"><ul id="toc"><li><img alt="" src="./images/down.gif" /> <a href="#implementation">Implementation</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">Background</a></li>
+<li><img alt="" src="./images/down.gif" /> <a href="#advantages">Advantages and Disadvantages</a></li>
+</ul></div>
+<div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
+<div class="section">
+<h2><a name="implementation" id="implementation">Implementation</a></h2>
+
+<table class="related"><tr><th>Related Modules</th><th>Related Directives</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>The DSO support for loading individual Apache modules is based
+    on a module named <code class="module"><a href="./mod/mod_so.html">mod_so</a></code> which must be statically
+    compiled into the Apache core. It is the only module besides
+    <code class="module"><a href="./mod/core.html">core</a></code> which cannot be put into a DSO
+    itself. Practically all other distributed Apache modules can then
+    be placed into a DSO by individually enabling the DSO build for
+    them via <code class="program"><a href="./programs/configure.html">configure</a></code>'s
+    <code>--enable-<em>module</em>=shared</code> option as discussed
+    in the <a href="install.html">install documentation</a>. After a
+    module is compiled into a DSO named <code>mod_foo.so</code> you
+    can use <code class="module"><a href="./mod/mod_so.html">mod_so</a></code>'s <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code> command in your
+    <code>httpd.conf</code> file to load this module at server startup
+    or restart.</p>
+
+    <p>To simplify this creation of DSO files for Apache modules
+    (especially for third-party modules) a new support program
+    named <code class="program"><a href="./programs/apxs.html">apxs</a></code> (<dfn>APache
+    eXtenSion</dfn>) is available. It can be used to build DSO based
+    modules <em>outside of</em> the Apache source tree. The idea is
+    simple: When installing Apache the <code class="program"><a href="./programs/configure.html">configure</a></code>'s
+    <code>make install</code> procedure installs the Apache C
+    header files and puts the platform-dependent compiler and
+    linker flags for building DSO files into the <code class="program"><a href="./programs/apxs.html">apxs</a></code>
+    program. This way the user can use <code class="program"><a href="./programs/apxs.html">apxs</a></code> to compile
+    his Apache module sources without the Apache distribution
+    source tree and without having to fiddle with the
+    platform-dependent compiler and linker flags for DSO
+    support.</p>
+</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
+<div class="section">
+<h2><a name="usage" id="usage">Usage Summary</a></h2>
+
+    <p>To give you an overview of the DSO features of Apache 2.2,
+    here is a short and concise summary:</p>
+
+    <ol>
+      <li>
+        Build and install a <em>distributed</em> Apache module, say
+        <code>mod_foo.c</code>, into its own DSO
+        <code>mod_foo.so</code>: 
+
+<div class="example"><p><code>
+$ ./configure --prefix=/path/to/install --enable-foo=shared<br />
 $ make install
-</PRE>
-</TD></TR></TABLE>
-
-<LI>Build and install manually: 
-<TABLE BGCOLOR="#f0f0f0" CELLPADDING=10><TR><TD>
-<PRE>
-- Edit src/Configuration:
-  &lt;&lt; Rule SHARED_CORE=default
-  &gt;&gt; Rule SHARED_CORE=yes
-  &lt;&lt; EXTRA_CFLAGS= 
-  &gt;&gt; EXTRA_CFLAGS= -DSHARED_CORE_DIR=\"/path/to/install/libexec\"
-$ make 
-$ cp src/libhttpd.so* /path/to/install/libexec/
-$ cp src/libhttpd.ep  /path/to/install/libexec/
-$ cp src/httpd        /path/to/install/bin/
-</PRE>    
-</TD></TR></TABLE>
-</UL>
-
-<LI>Build and install a <EM>distributed</EM> Apache module, say
-<CODE>mod_foo.c</CODE>, into its own DSO <CODE>mod_foo.so</CODE>:
-
-<P>
-<UL>
-<LI>Build and install via <CODE>configure</CODE> (preferred):
-<TABLE BGCOLOR="#f0f0f0" CELLPADDING=10><TR><TD>
-<PRE>
-$ ./configure --prefix=/path/to/install
-        --enable-shared=foo
+</code></p></div>
+      </li>
+
+      <li>
+        Build and install a <em>third-party</em> Apache module, say
+        <code>mod_foo.c</code>, into its own DSO
+        <code>mod_foo.so</code>: 
+
+<div class="example"><p><code>
+$ ./configure --add-module=<var>module_type</var>:/path/to/3rdparty/mod_foo.c \<br />
+<span class="indent">
+  --enable-foo=shared<br />
+</span>
 $ make install
-</PRE>
-</TD></TR></TABLE>
-
-<LI>Build and install manually: 
-<TABLE BGCOLOR="#f0f0f0" CELLPADDING=10><TR><TD>
-<PRE>
-- Edit src/Configuration:
-  &lt;&lt; AddModule    modules/xxxx/mod_foo.o
-  &gt;&gt; SharedModule modules/xxxx/mod_foo.so
-$ make
-$ cp src/xxxx/mod_foo.so /path/to/install/libexec
-- Edit /path/to/install/etc/httpd.conf
-  &gt;&gt; LoadModule foo_module /path/to/install/libexec/mod_foo.so
-</PRE>
-</TD></TR></TABLE>
-</UL>
-
-<LI>Build and install a <EM>third-party</EM> Apache module, say
-<CODE>mod_foo.c</CODE>, into its own DSO <CODE>mod_foo.so</CODE>
-
-<P>
-<UL>
-<LI>Build and install via <CODE>configure</CODE> (preferred):
-<TABLE BGCOLOR="#f0f0f0" CELLPADDING=10><TR><TD>
-<PRE>
-$ ./configure --add-module=/path/to/3rdparty/mod_foo.c 
-        --enable-shared=foo
+</code></p></div>
+      </li>
+
+      <li>
+        Configure Apache for <em>later installation</em> of shared
+        modules: 
+
+<div class="example"><p><code>
+$ ./configure --enable-so<br />
 $ make install
-</PRE>
-</TD></TR></TABLE>
-
-<LI>Build and install manually: 
-<TABLE BGCOLOR="#f0f0f0" CELLPADDING=10><TR><TD>
-<PRE>
-$ cp /path/to/3rdparty/mod_foo.c /path/to/apache-1.3/src/modules/extra/
-- Edit src/Configuration:
-  &gt;&gt; SharedModule modules/extra/mod_foo.so
-$ make
-$ cp src/xxxx/mod_foo.so /path/to/install/libexec
-- Edit /path/to/install/etc/httpd.conf
-  &gt;&gt; LoadModule foo_module /path/to/install/libexec/mod_foo.so
-</PRE>
-</TD></TR></TABLE>
-</UL>
-
-<P>
-<LI>Build and install a <EM>third-party</EM> Apache module, say
-<CODE>mod_foo.c</CODE>, into its own DSO <CODE>mod_foo.so</CODE> <EM>outside
-of</EM> the Apache source tree:
-
-<P>
-<UL>
-<LI>Build and install via <CODE>apxs</CODE>: 
-<TABLE BGCOLOR="#f0f0f0" CELLPADDING=10><TR><TD>
-<PRE>
-$ cd /path/to/3rdparty
-$ apxs -c mod_foo.c
-$ apxs -i -a -n foo mod_foo.so
-</PRE>
-</TD></TR></TABLE>
-</UL>
-
-</OL>
-
-<H3>Advantages & Disadvantages</H3>
-
-<P>The above DSO based features of Apache 1.3 have the following advantages:
-
-<UL>
-<LI> The server package is more flexible at run-time because the actual server
-     process can be assembled at run-time via <A
-     HREF="mod/mod_so.html#loadmodule"><CODE>LoadModule</CODE></A>
-     <CODE>httpd.conf</CODE> configuration commands instead of
-     <CODE>Configuration</CODE> <CODE>AddModule</CODE> commands at build-time.
-     For instance this way one is able to run different server instances
-     (standard &amp; SSL version, minimalistic &amp; powered up version
-     [mod_perl, PHP3], etc.) with only one Apache installation.
-<P>
-<LI> The server package can be easily extended with third-party modules even
-     after installation. This is at least a great benefit for vendor package
-     maintainers who can create a Apache core package and additional packages
-     containing extensions like PHP3, mod_perl, mod_fastcgi, etc.
-<P>
-<LI> Easier Apache module prototyping because with the DSO/<CODE>apxs</CODE>
-     pair you can both work outside the Apache source tree and only need an
-     <CODE>apxs -i</CODE> command followed by an <CODE>apachectl
-     restart</CODE> to bring a new version of your currently developed module
-     into the running Apache server.
-</UL>
-
-<P>DSO has the following disadvantages:
-
-<UL>
-<LI> The DSO mechanism cannot be used on every platform because not all
-     operating systems support dynamic loading of code into the address space
-     of a program.
-<P>
-<LI> The server is approximately 20% slower at startup time because of the
-     symbol resolving overhead the Unix loader now has to do.
-<P>
-<LI> The server is approximately 5% slower at execution time under some
-     platforms because position independent code (PIC) sometimes needs
-     complicated assembler tricks for relative addressing which are not
-     necessarily as fast as absolute addressing.
-<P>
-<LI> Because DSO modules cannot be linked against other DSO-based libraries
-     (<CODE>ld -lfoo</CODE>) on all platforms (for instance a.out-based
-     platforms usually don't provide this functionality while ELF-based
-     platforms do) you cannot use the DSO mechanism for all types of modules.
-     Or in other words, modules compiled as DSO files are restricted to only
-     use symbols from the Apache core, from the C library (<CODE>libc</CODE>)
-     and all other dynamic or static libraries used by the Apache core, or
-     from static library archives (<CODE>libfoo.a</CODE>) containing position
-     independent code. The only chances to use other code is to either make
-     sure the Apache core itself already contains a reference to it, loading
-     the code yourself via <CODE>dlopen()</CODE> or enabling the
-     <CODE>SHARED_CHAIN</CODE> rule while building Apache when your platform
-     supports linking DSO files against DSO libraries.
-<P>
-<LI> Under some platforms (many SVR4 systems) there is no way to force the
-     linker to export all global symbols for use in DSO's when linking the
-     Apache httpd executable program. But without the visibility of the Apache
-     core symbols no standard Apache module could be used as a DSO. The only
-     chance here is to use the <CODE>SHARED_CORE</CODE> feature because this
-     way the global symbols are forced to be exported. As a consequence the
-     Apache <CODE>src/Configure</CODE> script automatically enforces
-     <CODE>SHARED_CORE</CODE> on these platforms when DSO features are used in
-     the <CODE>Configuration</CODE> file or on the configure command line.
-</UL>
-
-<!--#include virtual="footer.html" -->
-</BLOCKQUOTE>
-</BODY>
-</HTML>
+</code></p></div>
+      </li>
+
+      <li>
+        Build and install a <em>third-party</em> Apache module, say
+        <code>mod_foo.c</code>, into its own DSO
+        <code>mod_foo.so</code> <em>outside of</em> the Apache
+        source tree using <code class="program"><a href="./programs/apxs.html">apxs</a></code>: 
+
+<div class="example"><p><code>
+$ cd /path/to/3rdparty<br />
+$ apxs -c mod_foo.c<br />
+$ apxs -i -a -n foo mod_foo.la
+</code></p></div>
+      </li>
+    </ol>
+
+    <p>In all cases, once the shared module is compiled, you must
+    use a <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code>
+    directive in <code>httpd.conf</code> to tell Apache to activate
+    the module.</p>
+</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
+<div class="section">
+<h2><a name="background" id="background">Background</a></h2>
+
+    <p>On modern Unix derivatives there exists a nifty mechanism
+    usually called dynamic linking/loading of <em>Dynamic Shared
+    Objects</em> (DSO) which provides a way to build a piece of
+    program code in a special format for loading it at run-time
+    into the address space of an executable program.</p>
+
+    <p>This loading can usually be done in two ways: Automatically
+    by a system program called <code>ld.so</code> when an
+    executable program is started or manually from within the
+    executing program via a programmatic system interface to the
+    Unix loader through the system calls
+    <code>dlopen()/dlsym()</code>.</p>
+
+    <p>In the first way the DSO's are usually called <em>shared
+    libraries</em> or <em>DSO libraries</em> and named
+    <code>libfoo.so</code> or <code>libfoo.so.1.2</code>. They
+    reside in a system directory (usually <code>/usr/lib</code>)
+    and the link to the executable program is established at
+    build-time by specifying <code>-lfoo</code> to the linker
+    command. This hard-codes library references into the executable
+    program file so that at start-time the Unix loader is able to
+    locate <code>libfoo.so</code> in <code>/usr/lib</code>, in
+    paths hard-coded via linker-options like <code>-R</code> or in
+    paths configured via the environment variable
+    <code>LD_LIBRARY_PATH</code>. It then resolves any (yet
+    unresolved) symbols in the executable program which are
+    available in the DSO.</p>
+
+    <p>Symbols in the executable program are usually not referenced
+    by the DSO (because it's a reusable library of general code)
+    and hence no further resolving has to be done. The executable
+    program has no need to do anything on its own to use the
+    symbols from the DSO because the complete resolving is done by
+    the Unix loader. (In fact, the code to invoke
+    <code>ld.so</code> is part of the run-time startup code which
+    is linked into every executable program which has been bound
+    non-static). The advantage of dynamic loading of common library
+    code is obvious: the library code needs to be stored only once,
+    in a system library like <code>libc.so</code>, saving disk
+    space for every program.</p>
+
+    <p>In the second way the DSO's are usually called <em>shared
+    objects</em> or <em>DSO files</em> and can be named with an
+    arbitrary extension (although the canonical name is
+    <code>foo.so</code>). These files usually stay inside a
+    program-specific directory and there is no automatically
+    established link to the executable program where they are used.
+    Instead the executable program manually loads the DSO at
+    run-time into its address space via <code>dlopen()</code>. At
+    this time no resolving of symbols from the DSO for the
+    executable program is done. But instead the Unix loader
+    automatically resolves any (yet unresolved) symbols in the DSO
+    from the set of symbols exported by the executable program and
+    its already loaded DSO libraries (especially all symbols from
+    the ubiquitous <code>libc.so</code>). This way the DSO gets
+    knowledge of the executable program's symbol set as if it had
+    been statically linked with it in the first place.</p>
+
+    <p>Finally, to take advantage of the DSO's API the executable
+    program has to resolve particular symbols from the DSO via
+    <code>dlsym()</code> for later use inside dispatch tables
+    <em>etc.</em> In other words: The executable program has to
+    manually resolve every symbol it needs to be able to use it.
+    The advantage of such a mechanism is that optional program
+    parts need not be loaded (and thus do not spend memory) until
+    they are needed by the program in question. When required,
+    these program parts can be loaded dynamically to extend the
+    base program's functionality.</p>
+
+    <p>Although this DSO mechanism sounds straightforward there is
+    at least one difficult step here: The resolving of symbols from
+    the executable program for the DSO when using a DSO to extend a
+    program (the second way). Why? Because "reverse resolving" DSO
+    symbols from the executable program's symbol set is against the
+    library design (where the library has no knowledge about the
+    programs it is used by) and is neither available under all
+    platforms nor standardized. In practice the executable
+    program's global symbols are often not re-exported and thus not
+    available for use in a DSO. Finding a way to force the linker
+    to export all global symbols is the main problem one has to
+    solve when using DSO for extending a program at run-time.</p>
+
+    <p>The shared library approach is the typical one, because it
+    is what the DSO mechanism was designed for, hence it is used
+    for nearly all types of libraries the operating system
+    provides. On the other hand using shared objects for extending
+    a program is not used by a lot of programs.</p>
+
+    <p>As of 1998 there are only a few software packages available
+    which use the DSO mechanism to actually extend their
+    functionality at run-time: Perl 5 (via its XS mechanism and the
+    DynaLoader module), Netscape Server, <em>etc.</em> Starting
+    with version 1.3, Apache joined the crew, because Apache
+    already uses a module concept to extend its functionality and
+    internally uses a dispatch-list-based approach to link external
+    modules into the Apache core functionality. So, Apache is
+    really predestined for using DSO to load its modules at
+    run-time.</p>
+</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
+<div class="section">
+<h2><a name="advantages" id="advantages">Advantages and Disadvantages</a></h2>
+
+    <p>The above DSO based features have the following
+    advantages:</p>
+
+    <ul>
+      <li>The server package is more flexible at run-time because
+      the actual server process can be assembled at run-time via
+      <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code>
+      <code>httpd.conf</code> configuration commands instead of
+      <code class="program"><a href="./programs/configure.html">configure</a></code> options at build-time. For instance
+      this way one is able to run different server instances
+      (standard &amp; SSL version, minimalistic &amp; powered up
+      version [mod_perl, PHP3], <em>etc.</em>) with only one Apache
+      installation.</li>
+
+      <li>The server package can be easily extended with
+      third-party modules even after installation. This is at least
+      a great benefit for vendor package maintainers who can create
+      a Apache core package and additional packages containing
+      extensions like PHP3, mod_perl, mod_fastcgi,
+      <em>etc.</em></li>
+
+      <li>Easier Apache module prototyping because with the
+      DSO/<code class="program"><a href="./programs/apxs.html">apxs</a></code> pair you can both work outside the
+      Apache source tree and only need an <code>apxs -i</code>
+      command followed by an <code>apachectl restart</code> to
+      bring a new version of your currently developed module into
+      the running Apache server.</li>
+    </ul>
+
+    <p>DSO has the following disadvantages:</p>
+
+    <ul>
+      <li>The DSO mechanism cannot be used on every platform
+      because not all operating systems support dynamic loading of
+      code into the address space of a program.</li>
+
+      <li>The server is approximately 20% slower at startup time
+      because of the symbol resolving overhead the Unix loader now
+      has to do.</li>
+
+      <li>The server is approximately 5% slower at execution time
+      under some platforms because position independent code (PIC)
+      sometimes needs complicated assembler tricks for relative
+      addressing which are not necessarily as fast as absolute
+      addressing.</li>
+
+      <li>Because DSO modules cannot be linked against other
+      DSO-based libraries (<code>ld -lfoo</code>) on all platforms
+      (for instance a.out-based platforms usually don't provide
+      this functionality while ELF-based platforms do) you cannot
+      use the DSO mechanism for all types of modules. Or in other
+      words, modules compiled as DSO files are restricted to only
+      use symbols from the Apache core, from the C library
+      (<code>libc</code>) and all other dynamic or static libraries
+      used by the Apache core, or from static library archives
+      (<code>libfoo.a</code>) containing position independent code.
+      The only chances to use other code is to either make sure the
+      Apache core itself already contains a reference to it or
+      loading the code yourself via <code>dlopen()</code>.</li>
+    </ul>
+
+</div></div>
+<div class="bottomlang">
+<p><span>Available Languages: </span><a href="./en/dso.html" title="English">&nbsp;en&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></p>
+</div><div id="footer">
+<p class="apache">Copyright 2007 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
+<p class="menu"><a href="./mod/">Modules</a> | <a href="./mod/directives.html">Directives</a> | <a href="./faq/">FAQ</a> | <a href="./glossary.html">Glossary</a> | <a href="./sitemap.html">Sitemap</a></p></div>
+</body></html>
\ No newline at end of file