~ubuntu-branches/ubuntu/feisty/apache2/feisty

« back to all changes in this revision

Viewing changes to docs/manual/dso.html.en

  • Committer: Bazaar Package Importer
  • Author(s): Andreas Barth
  • Date: 2006-12-09 21:05:45 UTC
  • mfrom: (0.6.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20061209210545-h70s0xaqc2v8vqr2
Tags: 2.2.3-3.2
* Non-maintainer upload.
* 043_ajp_connection_reuse: Patch from upstream Bugzilla, fixing a critical
  issue with regard to connection reuse in mod_proxy_ajp.
  Closes: #396265

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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="en" xml:lang="en"><head><!--
 
4
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
5
              This file is generated from xml source: DO NOT EDIT
 
6
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
7
      -->
 
8
<title>Dynamic Shared Object (DSO) Support - Apache HTTP Server</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">Glossary</a> | <a href="./sitemap.html">Sitemap</a></p>
 
15
<p class="apache">Apache HTTP Server Version 2.2</p>
 
16
<img alt="" src="./images/feather.gif" /></div>
 
17
<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="./images/left.gif" /></a></div>
 
18
<div id="path">
 
19
<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.2</a></div><div id="page-content"><div id="preamble"><h1>Dynamic Shared Object (DSO) Support</h1>
 
20
<div class="toplang">
 
21
<p><span>Available Languages: </span><a href="./en/dso.html" title="English">&nbsp;en&nbsp;</a> |
 
22
<a href="./ja/dso.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
 
23
<a href="./ko/dso.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a></p>
 
24
</div>
 
25
 
 
26
    <p>The Apache HTTP Server is a modular program where the
 
27
    administrator can choose the functionality to include in the
 
28
    server by selecting a set of modules. The modules can be
 
29
    statically compiled into the <code class="program"><a href="./programs/httpd.html">httpd</a></code> binary when the
 
30
    server is built. Alternatively, modules can be compiled as
 
31
    Dynamic Shared Objects (DSOs) that exist separately from the
 
32
    main <code class="program"><a href="./programs/httpd.html">httpd</a></code> binary file. DSO modules may be
 
33
    compiled at the time the server is built, or they may be
 
34
    compiled and added at a later time using the Apache Extension
 
35
    Tool (<code class="program"><a href="./programs/apxs.html">apxs</a></code>).</p>
 
36
 
 
37
    <p>This document describes how to use DSO modules as well as
 
38
    the theory behind their use.</p>
 
39
  </div>
 
40
<div id="quickview"><ul id="toc"><li><img alt="" src="./images/down.gif" /> <a href="#implementation">Implementation</a></li>
 
41
<li><img alt="" src="./images/down.gif" /> <a href="#usage">Usage Summary</a></li>
 
42
<li><img alt="" src="./images/down.gif" /> <a href="#background">Background</a></li>
 
43
<li><img alt="" src="./images/down.gif" /> <a href="#advantages">Advantages and Disadvantages</a></li>
 
44
</ul></div>
 
45
<div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
 
46
<div class="section">
 
47
<h2><a name="implementation" id="implementation">Implementation</a></h2>
 
48
 
 
49
<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>
 
50
 
 
51
    <p>The DSO support for loading individual Apache modules is based
 
52
    on a module named <code class="module"><a href="./mod/mod_so.html">mod_so</a></code> which must be statically
 
53
    compiled into the Apache core. It is the only module besides
 
54
    <code class="module"><a href="./mod/core.html">core</a></code> which cannot be put into a DSO
 
55
    itself. Practically all other distributed Apache modules can then
 
56
    be placed into a DSO by individually enabling the DSO build for
 
57
    them via <code class="program"><a href="./programs/configure.html">configure</a></code>'s
 
58
    <code>--enable-<em>module</em>=shared</code> option as discussed
 
59
    in the <a href="install.html">install documentation</a>. After a
 
60
    module is compiled into a DSO named <code>mod_foo.so</code> you
 
61
    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
 
62
    <code>httpd.conf</code> file to load this module at server startup
 
63
    or restart.</p>
 
64
 
 
65
    <p>To simplify this creation of DSO files for Apache modules
 
66
    (especially for third-party modules) a new support program
 
67
    named <code class="program"><a href="./programs/apxs.html">apxs</a></code> (<dfn>APache
 
68
    eXtenSion</dfn>) is available. It can be used to build DSO based
 
69
    modules <em>outside of</em> the Apache source tree. The idea is
 
70
    simple: When installing Apache the <code class="program"><a href="./programs/configure.html">configure</a></code>'s
 
71
    <code>make install</code> procedure installs the Apache C
 
72
    header files and puts the platform-dependent compiler and
 
73
    linker flags for building DSO files into the <code class="program"><a href="./programs/apxs.html">apxs</a></code>
 
74
    program. This way the user can use <code class="program"><a href="./programs/apxs.html">apxs</a></code> to compile
 
75
    his Apache module sources without the Apache distribution
 
76
    source tree and without having to fiddle with the
 
77
    platform-dependent compiler and linker flags for DSO
 
78
    support.</p>
 
79
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
 
80
<div class="section">
 
81
<h2><a name="usage" id="usage">Usage Summary</a></h2>
 
82
 
 
83
    <p>To give you an overview of the DSO features of Apache 2.0,
 
84
    here is a short and concise summary:</p>
 
85
 
 
86
    <ol>
 
87
      <li>
 
88
        Build and install a <em>distributed</em> Apache module, say
 
89
        <code>mod_foo.c</code>, into its own DSO
 
90
        <code>mod_foo.so</code>: 
 
91
 
 
92
<div class="example"><p><code>
 
93
$ ./configure --prefix=/path/to/install --enable-foo=shared<br />
 
94
$ make install
 
95
</code></p></div>
 
96
      </li>
 
97
 
 
98
      <li>
 
99
        Build and install a <em>third-party</em> Apache module, say
 
100
        <code>mod_foo.c</code>, into its own DSO
 
101
        <code>mod_foo.so</code>: 
 
102
 
 
103
<div class="example"><p><code>
 
104
$ ./configure --add-module=<var>module_type</var>:/path/to/3rdparty/mod_foo.c \<br />
 
105
<span class="indent">
 
106
  --enable-foo=shared<br />
 
107
</span>
 
108
$ make install
 
109
</code></p></div>
 
110
      </li>
 
111
 
 
112
      <li>
 
113
        Configure Apache for <em>later installation</em> of shared
 
114
        modules: 
 
115
 
 
116
<div class="example"><p><code>
 
117
$ ./configure --enable-so<br />
 
118
$ make install
 
119
</code></p></div>
 
120
      </li>
 
121
 
 
122
      <li>
 
123
        Build and install a <em>third-party</em> Apache module, say
 
124
        <code>mod_foo.c</code>, into its own DSO
 
125
        <code>mod_foo.so</code> <em>outside of</em> the Apache
 
126
        source tree using <code class="program"><a href="./programs/apxs.html">apxs</a></code>: 
 
127
 
 
128
<div class="example"><p><code>
 
129
$ cd /path/to/3rdparty<br />
 
130
$ apxs -c mod_foo.c<br />
 
131
$ apxs -i -a -n foo mod_foo.la
 
132
</code></p></div>
 
133
      </li>
 
134
    </ol>
 
135
 
 
136
    <p>In all cases, once the shared module is compiled, you must
 
137
    use a <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code>
 
138
    directive in <code>httpd.conf</code> to tell Apache to activate
 
139
    the 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">Background</a></h2>
 
143
 
 
144
    <p>On modern Unix derivatives there exists a nifty mechanism
 
145
    usually called dynamic linking/loading of <em>Dynamic Shared
 
146
    Objects</em> (DSO) which provides a way to build a piece of
 
147
    program code in a special format for loading it at run-time
 
148
    into the address space of an executable program.</p>
 
149
 
 
150
    <p>This loading can usually be done in two ways: Automatically
 
151
    by a system program called <code>ld.so</code> when an
 
152
    executable program is started or manually from within the
 
153
    executing program via a programmatic system interface to the
 
154
    Unix loader through the system calls
 
155
    <code>dlopen()/dlsym()</code>.</p>
 
156
 
 
157
    <p>In the first way the DSO's are usually called <em>shared
 
158
    libraries</em> or <em>DSO libraries</em> and named
 
159
    <code>libfoo.so</code> or <code>libfoo.so.1.2</code>. They
 
160
    reside in a system directory (usually <code>/usr/lib</code>)
 
161
    and the link to the executable program is established at
 
162
    build-time by specifying <code>-lfoo</code> to the linker
 
163
    command. This hard-codes library references into the executable
 
164
    program file so that at start-time the Unix loader is able to
 
165
    locate <code>libfoo.so</code> in <code>/usr/lib</code>, in
 
166
    paths hard-coded via linker-options like <code>-R</code> or in
 
167
    paths configured via the environment variable
 
168
    <code>LD_LIBRARY_PATH</code>. It then resolves any (yet
 
169
    unresolved) symbols in the executable program which are
 
170
    available in the DSO.</p>
 
171
 
 
172
    <p>Symbols in the executable program are usually not referenced
 
173
    by the DSO (because it's a reusable library of general code)
 
174
    and hence no further resolving has to be done. The executable
 
175
    program has no need to do anything on its own to use the
 
176
    symbols from the DSO because the complete resolving is done by
 
177
    the Unix loader. (In fact, the code to invoke
 
178
    <code>ld.so</code> is part of the run-time startup code which
 
179
    is linked into every executable program which has been bound
 
180
    non-static). The advantage of dynamic loading of common library
 
181
    code is obvious: the library code needs to be stored only once,
 
182
    in a system library like <code>libc.so</code>, saving disk
 
183
    space for every program.</p>
 
184
 
 
185
    <p>In the second way the DSO's are usually called <em>shared
 
186
    objects</em> or <em>DSO files</em> and can be named with an
 
187
    arbitrary extension (although the canonical name is
 
188
    <code>foo.so</code>). These files usually stay inside a
 
189
    program-specific directory and there is no automatically
 
190
    established link to the executable program where they are used.
 
191
    Instead the executable program manually loads the DSO at
 
192
    run-time into its address space via <code>dlopen()</code>. At
 
193
    this time no resolving of symbols from the DSO for the
 
194
    executable program is done. But instead the Unix loader
 
195
    automatically resolves any (yet unresolved) symbols in the DSO
 
196
    from the set of symbols exported by the executable program and
 
197
    its already loaded DSO libraries (especially all symbols from
 
198
    the ubiquitous <code>libc.so</code>). This way the DSO gets
 
199
    knowledge of the executable program's symbol set as if it had
 
200
    been statically linked with it in the first place.</p>
 
201
 
 
202
    <p>Finally, to take advantage of the DSO's API the executable
 
203
    program has to resolve particular symbols from the DSO via
 
204
    <code>dlsym()</code> for later use inside dispatch tables
 
205
    <em>etc.</em> In other words: The executable program has to
 
206
    manually resolve every symbol it needs to be able to use it.
 
207
    The advantage of such a mechanism is that optional program
 
208
    parts need not be loaded (and thus do not spend memory) until
 
209
    they are needed by the program in question. When required,
 
210
    these program parts can be loaded dynamically to extend the
 
211
    base program's functionality.</p>
 
212
 
 
213
    <p>Although this DSO mechanism sounds straightforward there is
 
214
    at least one difficult step here: The resolving of symbols from
 
215
    the executable program for the DSO when using a DSO to extend a
 
216
    program (the second way). Why? Because "reverse resolving" DSO
 
217
    symbols from the executable program's symbol set is against the
 
218
    library design (where the library has no knowledge about the
 
219
    programs it is used by) and is neither available under all
 
220
    platforms nor standardized. In practice the executable
 
221
    program's global symbols are often not re-exported and thus not
 
222
    available for use in a DSO. Finding a way to force the linker
 
223
    to export all global symbols is the main problem one has to
 
224
    solve when using DSO for extending a program at run-time.</p>
 
225
 
 
226
    <p>The shared library approach is the typical one, because it
 
227
    is what the DSO mechanism was designed for, hence it is used
 
228
    for nearly all types of libraries the operating system
 
229
    provides. On the other hand using shared objects for extending
 
230
    a program is not used by a lot of programs.</p>
 
231
 
 
232
    <p>As of 1998 there are only a few software packages available
 
233
    which use the DSO mechanism to actually extend their
 
234
    functionality at run-time: Perl 5 (via its XS mechanism and the
 
235
    DynaLoader module), Netscape Server, <em>etc.</em> Starting
 
236
    with version 1.3, Apache joined the crew, because Apache
 
237
    already uses a module concept to extend its functionality and
 
238
    internally uses a dispatch-list-based approach to link external
 
239
    modules into the Apache core functionality. So, Apache is
 
240
    really predestined for using DSO to load its modules at
 
241
    run-time.</p>
 
242
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
 
243
<div class="section">
 
244
<h2><a name="advantages" id="advantages">Advantages and Disadvantages</a></h2>
 
245
 
 
246
    <p>The above DSO based features have the following
 
247
    advantages:</p>
 
248
 
 
249
    <ul>
 
250
      <li>The server package is more flexible at run-time because
 
251
      the actual server process can be assembled at run-time via
 
252
      <code class="directive"><a href="./mod/mod_so.html#loadmodule">LoadModule</a></code>
 
253
      <code>httpd.conf</code> configuration commands instead of
 
254
      <code class="program"><a href="./programs/configure.html">configure</a></code> options at build-time. For instance
 
255
      this way one is able to run different server instances
 
256
      (standard &amp; SSL version, minimalistic &amp; powered up
 
257
      version [mod_perl, PHP3], <em>etc.</em>) with only one Apache
 
258
      installation.</li>
 
259
 
 
260
      <li>The server package can be easily extended with
 
261
      third-party modules even after installation. This is at least
 
262
      a great benefit for vendor package maintainers who can create
 
263
      a Apache core package and additional packages containing
 
264
      extensions like PHP3, mod_perl, mod_fastcgi,
 
265
      <em>etc.</em></li>
 
266
 
 
267
      <li>Easier Apache module prototyping because with the
 
268
      DSO/<code class="program"><a href="./programs/apxs.html">apxs</a></code> pair you can both work outside the
 
269
      Apache source tree and only need an <code>apxs -i</code>
 
270
      command followed by an <code>apachectl restart</code> to
 
271
      bring a new version of your currently developed module into
 
272
      the running Apache server.</li>
 
273
    </ul>
 
274
 
 
275
    <p>DSO has the following disadvantages:</p>
 
276
 
 
277
    <ul>
 
278
      <li>The DSO mechanism cannot be used on every platform
 
279
      because not all operating systems support dynamic loading of
 
280
      code into the address space of a program.</li>
 
281
 
 
282
      <li>The server is approximately 20% slower at startup time
 
283
      because of the symbol resolving overhead the Unix loader now
 
284
      has to do.</li>
 
285
 
 
286
      <li>The server is approximately 5% slower at execution time
 
287
      under some platforms because position independent code (PIC)
 
288
      sometimes needs complicated assembler tricks for relative
 
289
      addressing which are not necessarily as fast as absolute
 
290
      addressing.</li>
 
291
 
 
292
      <li>Because DSO modules cannot be linked against other
 
293
      DSO-based libraries (<code>ld -lfoo</code>) on all platforms
 
294
      (for instance a.out-based platforms usually don't provide
 
295
      this functionality while ELF-based platforms do) you cannot
 
296
      use the DSO mechanism for all types of modules. Or in other
 
297
      words, modules compiled as DSO files are restricted to only
 
298
      use symbols from the Apache core, from the C library
 
299
      (<code>libc</code>) and all other dynamic or static libraries
 
300
      used by the Apache core, or from static library archives
 
301
      (<code>libfoo.a</code>) containing position independent code.
 
302
      The only chances to use other code is to either make sure the
 
303
      Apache core itself already contains a reference to it or
 
304
      loading the code yourself via <code>dlopen()</code>.</li>
 
305
    </ul>
 
306
 
 
307
</div></div>
 
308
<div class="bottomlang">
 
309
<p><span>Available Languages: </span><a href="./en/dso.html" title="English">&nbsp;en&nbsp;</a> |
 
310
<a href="./ja/dso.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
 
311
<a href="./ko/dso.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a></p>
 
312
</div><div id="footer">
 
313
<p class="apache">Copyright 2006 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>
 
314
<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>
 
315
</body></html>
 
 
b'\\ No newline at end of file'