1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
3 <?xml-stylesheet type="text/xsl" href="./style/manual.ja.xsl"?>
4 <!-- English Revision: 587444:1199481 (outdated) -->
7 Licensed to the Apache Software Foundation (ASF) under one or more
8 contributor license agreements. See the NOTICE file distributed with
9 this work for additional information regarding copyright ownership.
10 The ASF licenses this file to You under the Apache License, Version 2.0
11 (the "License"); you may not use this file except in compliance with
12 the License. You may obtain a copy of the License at
14 http://www.apache.org/licenses/LICENSE-2.0
16 Unless required by applicable law or agreed to in writing, software
17 distributed under the License is distributed on an "AS IS" BASIS,
18 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 See the License for the specific language governing permissions and
20 limitations under the License.
23 <manualpage metafile="dso.xml.meta">
25 <title>動的共有オブジェクト (DSO) サポート</title>
28 <p>Apache HTTP サーバはモジュール化されたプログラムで、
29 管理者がモジュールを選択することでサーバに組み込む機能を選ぶことができます。
30 モジュールはサーバがビルドされるときに <program>httpd</program> バイナリに
31 静的に組み込むことができます。もしくは、<program>httpd</program> バイナリとは
32 別に存在する動的共有オブジェクト (訳注: Dynamic Shared Object)
34 できます。DSO モジュールはサーバがビルドされるときにコンパイルしたり、
35 Apache 拡張ツール (<program>apxs</program>) を
36 使って後でコンパイルして追加したりできます。</p>
38 <p>この文書は DSO モジュールの使い方と、仕組みについて
43 <section id="implementation"><title>実装</title>
47 <module>mod_so</module>
50 <directive module="mod_so">LoadModule</directive>
54 <p>個々の Apache モジュールをロードするための DSO サポートは
55 <module>mod_so.c</module> というモジュールの機能に基づいています。
56 このモジュール は Apache のコアに静的に組み込まれている必要があります。
57 それは <module>core.c</module> 以外では DSO にできない唯一の
58 モジュールです。事実上、他のすべての Apache のモジュールは、
59 <a href="install.html">インストールの文書</a>で説明されているように、
60 <program>configure</program> の
61 <code>--enable-<em>module</em>=shared</code> オプションでそれぞれを
62 DSO ビルドにすることにより、DSO モジュールにすることができます。
63 <code>mod_foo.so</code> のような DSO にモジュールがコンパイルされれば、
64 <code>httpd.conf</code> ファイル中で <module>mod_so</module> の
65 <directive module="mod_so">LoadModule</directive>
66 ディレクティブを使うことでサーバの起動や再起動時にこのモジュールを
69 <p>Apache モジュール用の (特にサードパーティモジュールの) DSO ファイルの
70 作成を簡単にするために、<program>apxs</program>
71 (<dfn>APache eXtenSion</dfn>) という新しいサポートプログラムがあります。
72 Apache のソースツリーの<em>外で</em> DSO モジュールをビルドするために
73 使うことができます。発想は単純です: Apache のインストール時の
74 <program>configure</program>、<code>make install</code> のときに Apache の
75 C ヘッダをインストールし、DSO ビルド用のプラットフォーム依存の
76 コンパイラとリンカのフラグを <program>apxs</program> プログラムに追加します。
77 これにより、ユーザが Apache の配布ソースツリーなしで、さらに
78 DSO サポートのためのプラットフォーム依存のコンパイラやリンカの
79 フラグをいじることなく Apache のモジュールのソースをコンパイル
83 <section id="usage"><title>使用法の概要</title>
85 <p>Apache 2.x の DSO 機能の概略を知ることができるための、
90 <em>配布されている</em> Apache モジュール、仮に <code>mod_foo.c</code>
91 として、それを DSO <code>mod_foo.so</code> にビルド、インストール:
94 $ ./configure --prefix=/path/to/install --enable-foo=shared<br />
100 <em>サードパーティ</em> Apache モジュール、仮に <code>mod_foo.c</code>
101 として、それを DSO <code>mod_foo.so</code> にビルド、インストール:
104 $ ./configure --add-module=<var>module_type</var>:/path/to/3rdparty/mod_foo.c \<br />
106 --enable-foo=shared<br />
113 共有モジュールの <em>後々のインストール</em> のために
117 $ ./configure --enable-so<br />
123 <em>サードパーティ</em> Apache モジュール、仮に <code>mod_foo.c</code>
124 として、それを <program>apxs</program> を使って
125 Apache ソースツリーの<em>外で</em> DSO にビルド、インストール:
128 $ cd /path/to/3rdparty<br />
129 $ apxs -c mod_foo.c<br />
130 $ apxs -i -a -n foo mod_foo.la
135 <p>どの場合においても、共有モジュールをコンパイルした後で、
136 <code>httpd.conf</code> で
137 <directive module="mod_so">LoadModule</directive>
138 ディレクティブを使って Apache がモジュールを使用するように
142 <section id="background"><title>背景</title>
144 <p>最近の Unix 系の OS には <em>動的共有オブジェクト</em> (DSO)
145 の動的リンク/ロードという気のきいた機構が
146 存在します。これは、実行時にプログラムのアドレス空間に
147 ロードできるような特別な形式でプログラムをビルドすることを
150 <p>このロードは二つの方法で行なうことができます: 実行プログラムが
151 起動されたときに <code>ld.so</code> というシステムプログラム
152 により自動的に行なわれる方法と、実行プログラム中から、システムコール
153 <code>dlopen()/dlsym()</code> による Unix ローダへの
154 プログラムシステムのインタフェースを使って手動で行なう方法とが
157 <p>最初の方法では DSO は普通は<em>共有ライブラリ</em>や <em>DSO
158 ライブラリ</em> と呼ばれていて、DSO の名前は
159 <code>libfoo.so</code> や <code>libfoo.so.1.2</code> のようになっています。
160 これらはシステムディレクトリ (通常 <code>/usr/lib</code>) に存在し、
161 実行プログラムへのリンクはビルド時に <code>-lfoo</code> をリンカに
162 指定することで確立されます。これによりライブラリへの参照が実行プログラムの
163 ファイルに書き込まれて、起動時に Unix のローダが <code>/usr/lib</code> や、
164 リンカの <code>-R</code> のようなオプションによりハードコードされたパス、
165 環境変数 <code>LD_LIBRARY_PATH</code> により設定されたパス、の中から
166 <code>libfoo.so</code> の場所を見つけることができます。それから、
167 実行プログラム中の (まだ未解決の) シンボルを DSO にあるシンボルで
170 <p>普通は実行プログラム中のシンボルは DSO からは参照されません
171 (DSO は一般的なコードによる再利用可能なライブラリですので)。
172 ですから、さらなるシンボルの解決は必要ありません。
173 シンボルは Unix ローダにより完全な解決が行なわれますので、実行ファイル自身は
174 何もする必要がありません。(実際のところ、静的でない方法でリンクされている
175 すべての実行プログラムに組み込まれている開始用のコードの一部に
176 <code>ld.so</code> を起動するコードが含まれています)。よく使われる
177 ライブラリの動的ロードの利点は明らかです。ライブラリのコードは
178 システムライブラリに <code>libc.so</code> のようにして一度保存するだけでよく、
179 プログラムのために必要なディスクの領域を節約することができます。</p>
181 <p>二つめの方法では DSO は普通は<em>共有オブジェクト</em>や
182 <em>DSO ファイル</em>と呼ばれていて、任意の拡張子を付けることができます
183 (ただし、標準的な名前は <code>foo.so</code> です)。
184 これらのファイルは通常はプログラム専用のディレクトリに置かれ、
185 これらを使う実行プログラムへのリンクは自動的にはされません。
186 ですので、実行プログラムは <code>dlopen()</code> を使って
187 実行時に手動で DSO をプログラムのアドレス空間にロードする必要があります。
188 この時点では実行プログラムに対して DSO のシンボルの解決は行なわれません。
189 しかし、その代わりに Unix のローダが DSO の (まだ未解決の) シンボルを
190 実行プログラムによりエクスポートされたシンボルと既にロードされた
191 DSO ライブラリによりエクスポートされたシンボル (特に、どこにでもある
192 <code>libc.so</code> のすべてのシンボル) で自動的に解決します。
193 こうすることで、DSO は最初から静的にリンクされていたかのように、
194 実行プログラムのシンボルを知ることができます。</p>
196 <p>最後に、DSO の API を利点を生かすために、プログラムは
197 後でディスパッチテーブル<em>など</em>でシンボルを使うことができるように、
198 <code>dlsym()</code> を使っていくつかのシンボルを解決します。
199 すなわち: 実行プログラムは必要なすべてのシンボルを手動で解決しなければ
200 なりません。この機構の利点はプログラムのオプショナルな部分は
201 必要になるまでロードする必要がない (だからメモリも消費しない)
202 ことです。必要ならば、基本プログラムの機能を拡張するために
203 これらの部分を動的にロードすることができます。</p>
205 <p>この DSO 機構は簡単なように見えますが、少なくとも一つ難しい点が
206 あります: プログラムを拡張するために DSO を使っているときに、
207 DSO が実行プログラムからシンボルを解決する点です (二番目の方法)。
208 これはなぜでしょうか。それは、DSO のシンボルを実行プログラムの
209 シンボルから「逆解決」するというのはライブラリの設計
210 (ライブラリはそれを使用するプログラムのことは何も
211 知らない) に反していて、この機能はすべてのプラットフォームに
212 あるわけではなく、標準化もされていないからです。
213 実際には実行プログラムのグローバルなシンボルは再エクスポートされることは
214 あまりなく、DSO から使うことができません。リンカにグローバルシンボルすべてを
215 エクスポートするようにさせる方法を見つけることが、実行時にプログラムを
216 拡張するために DSO を使うときの一番の問題です。</p>
218 <p>共有ライブラリのアプローチが普通の方法です。DSO 機構はそのために
219 設計されたものですから。したがって、その方法はオペレーティングシステムが
220 提供するほとんどすべての種類のライブラリで使われています。
221 一方、プログラムの拡張のために共有オブジェクトを使用する、という方は
224 <p>1998 年の時点で、実行時に実際に機能拡張のために DSO 機構を使っている
225 ソフトウェアパッケージは少しだけでした: Perl 5 (XS 機構と DnaLoader モジュール
226 によるもの)、Netscape サーバ<em>など</em>です。Apache はすでに
227 モジュールの概念を使って機能拡張をしていて、内部的にディスパッチリストに
228 基づいた外部モジュールの Apache コア機能へのリンクを行なっていましたので、
229 バージョン 1.3 から、Apache も DSO 機構を使う仲間になりました。
230 Apache は実行時に DSO を使ってモジュールをロードするようにすでに
234 <section id="advantages"><title>利点と欠点</title>
236 <p>上記の DSO に基づいた機能は以下の利点があります:</p>
239 <li>実際のサーバプロセスを組み立てるために、
240 ビルド時に <code>configure</code> のオプションを使う代わりに
241 実行時に <code>httpd.conf</code> の設定用コマンド
242 <directive module="mod_so">LoadModule</directive>
243 を使うことができますので、サーバパッケージの柔軟性が高まりました。
244 たとえば、一つの Apache のインストールから
245 違う構成のサーバ (標準版と SSL 版、最小構成と拡張版 [mod_perl, PHP3]
246 <em>など</em>) を実行することができます。</li>
248 <li>インストールの後であっても、サーバのパッケージをサードパーティ
249 モジュールで簡単に拡張できるようになりました。これは、Apache コア
250 パッケージと、PHP3, mod_perl, mod_fastcgi <em>など</em> の追加の
251 パッケージを作成できるので、少なくともベンダのパッケージ管理者にとって
254 <li>Apache モジュールの開発が簡単になります。
255 これは DSO と <program>apxs</program> の組み合わせにより、Apache ソースツリーの
256 外で作業でき、開発中のモジュールの新しいバージョンを
257 実行中の Apache サーバに組み込むために <code>apxs -i</code> と
258 <code>apachectl restart</code> を行なうだけで良くなるからです。</li>
261 <p>DSO には以下の欠点があります:</p>
264 <li>すべてのオペレーティングシステムがプログラムのアドレス空間に
265 コードを動的ロードすることをサポートしているわではないので、
266 プラットフォームによっては DSO 機構は使えません。</li>
268 <li>Unix のローダがシンボルの解決をする必要ができたので、
269 そのオーバヘッドによりサーバの起動時間が約 20% 遅くなっています。</li>
271 <li>位置非依存コード (PIC) (訳注 position independent code) は
272 相対アドレスのために複雑なアセンブラのトリックが必要なことがあり、
273 それは必ずしも絶対アドレスと同じくらいの速度がでるわけではありませんので、
274 プラットフォームによってはサーバの実行速度が約 5% 遅くなります。</li>
276 <li>DSO モジュールはすべてのプラットフォームで他の DSO に基づいた
277 ライブラリに対してリンクできる (<code>ld -lfoo</code>)
278 というわけではありませんので (たとえば、a.out のプラットフォームでは
279 この機能はありませんが、ELF のプラットフォームにはあります)、
280 すべての種類のモジュールに DSO 機構を使えるわけではありません。
281 言い換えると、DSO ファイルとしてコンパイルされたモジュールの
283 Apache のコアのシンボル、C ライブラリ (<code>libc</code>) と
284 Apache コアが使っている他のすべての静的なライブラリと動的ライブラリの
285 シンボル、PIC による静的なライブラリ (<code>libfoo.a</code>) の
286 シンボルのみに制限されます。その他のコードを使う方法は、
287 Apache コア自身がすでにそのコードへの参照があるようにするか、
288 <code>dlopen ()</code> を使ってコードを自分自身でロードするかの