]> granicus.if.org Git - apache/blob - docs/manual/dso.xml.ja
XML update.
[apache] / docs / manual / dso.xml.ja
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) -->
5
6 <!--
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
13
14      http://www.apache.org/licenses/LICENSE-2.0
15
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.
21 -->
22
23 <manualpage metafile="dso.xml.meta">
24
25   <title>動的共有オブジェクト (DSO) サポート</title>
26
27   <summary>
28     <p>Apache HTTP サーバはモジュール化されたプログラムで、
29     管理者がモジュールを選択することでサーバに組み込む機能を選ぶことができます。
30     モジュールはサーバがビルドされるときに <program>httpd</program> バイナリに
31     静的に組み込むことができます。もしくは、<program>httpd</program> バイナリとは
32     別に存在する動的共有オブジェクト (訳注: Dynamic Shared Object)
33     (DSO) としてコンパイルすることも
34     できます。DSO モジュールはサーバがビルドされるときにコンパイルしたり、
35     Apache 拡張ツール (<program>apxs</program>) を
36     使って後でコンパイルして追加したりできます。</p>
37
38     <p>この文書は DSO モジュールの使い方と、仕組みについて
39     説明します。</p>
40   </summary>
41
42
43 <section id="implementation"><title>実装</title>
44
45 <related>
46 <modulelist>
47 <module>mod_so</module>
48 </modulelist>
49 <directivelist>
50 <directive module="mod_so">LoadModule</directive>
51 </directivelist>
52 </related>
53
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     ディレクティブを使うことでサーバの起動や再起動時にこのモジュールを
67     ロードするようにできます。</p>
68
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 のモジュールのソースをコンパイル
80     できるようになります。</p>
81 </section>
82
83 <section id="usage"><title>使用法の概要</title>
84
85     <p>Apache 2.x の DSO 機能の概略を知ることができるための、
86     短く簡潔な概要です:</p>
87
88     <ol>
89       <li>
90         <em>配布されている</em> Apache モジュール、仮に <code>mod_foo.c</code>
91         として、それを DSO <code>mod_foo.so</code> にビルド、インストール: 
92
93 <example>
94 $ ./configure --prefix=/path/to/install --enable-foo=shared<br />
95 $ make install
96 </example>
97       </li>
98
99       <li>
100         <em>サードパーティ</em> Apache モジュール、仮に <code>mod_foo.c</code>
101         として、それを DSO <code>mod_foo.so</code> にビルド、インストール:
102
103 <example>
104 $ ./configure --add-module=<var>module_type</var>:/path/to/3rdparty/mod_foo.c \<br />
105 <indent>
106   --enable-foo=shared<br />
107 </indent>
108 $ make install
109 </example>
110       </li>
111
112       <li>
113         共有モジュールの <em>後々のインストール</em> のために
114         Apache を設定:
115
116 <example>
117 $ ./configure --enable-so<br />
118 $ make install
119 </example>
120       </li>
121
122       <li>
123         <em>サードパーティ</em> Apache モジュール、仮に <code>mod_foo.c</code>
124         として、それを <program>apxs</program> を使って
125         Apache ソースツリーの<em>外で</em> DSO にビルド、インストール:
126
127 <example>
128 $ cd /path/to/3rdparty<br />
129 $ apxs -c mod_foo.c<br />
130 $ apxs -i -a -n foo mod_foo.la
131 </example>
132       </li>
133     </ol>
134
135     <p>どの場合においても、共有モジュールをコンパイルした後で、
136     <code>httpd.conf</code> で 
137     <directive module="mod_so">LoadModule</directive>
138     ディレクティブを使って Apache がモジュールを使用するように
139     しなければなりません。</p>
140 </section>
141
142 <section id="background"><title>背景</title>
143
144     <p>最近の Unix 系の OS には <em>動的共有オブジェクト</em> (DSO)
145     の動的リンク/ロードという気のきいた機構が
146     存在します。これは、実行時にプログラムのアドレス空間に
147     ロードできるような特別な形式でプログラムをビルドすることを
148     可能にします。</p>
149
150     <p>このロードは二つの方法で行なうことができます: 実行プログラムが
151     起動されたときに <code>ld.so</code> というシステムプログラム
152     により自動的に行なわれる方法と、実行プログラム中から、システムコール
153     <code>dlopen()/dlsym()</code> による Unix ローダへの
154     プログラムシステムのインタフェースを使って手動で行なう方法とが
155     あります。</p>
156
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 にあるシンボルで
168     解決します。</p>
169
170     <p>普通は実行プログラム中のシンボルは DSO からは参照されません
171     (DSO は一般的なコードによる再利用可能なライブラリですので)。
172     ですから、さらなるシンボルの解決は必要ありません。
173     シンボルは Unix ローダにより完全な解決が行なわれますので、実行ファイル自身は
174     何もする必要がありません。(実際のところ、静的でない方法でリンクされている
175     すべての実行プログラムに組み込まれている開始用のコードの一部に
176     <code>ld.so</code> を起動するコードが含まれています)。よく使われる
177     ライブラリの動的ロードの利点は明らかです。ライブラリのコードは
178     システムライブラリに <code>libc.so</code> のようにして一度保存するだけでよく、
179     プログラムのために必要なディスクの領域を節約することができます。</p>
180
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>
195
196     <p>最後に、DSO の API を利点を生かすために、プログラムは
197     後でディスパッチテーブル<em>など</em>でシンボルを使うことができるように、
198     <code>dlsym()</code> を使っていくつかのシンボルを解決します。
199     すなわち: 実行プログラムは必要なすべてのシンボルを手動で解決しなければ
200     なりません。この機構の利点はプログラムのオプショナルな部分は
201     必要になるまでロードする必要がない (だからメモリも消費しない)
202     ことです。必要ならば、基本プログラムの機能を拡張するために
203     これらの部分を動的にロードすることができます。</p>
204
205     <p>この DSO 機構は簡単なように見えますが、少なくとも一つ難しい点が
206     あります: プログラムを拡張するために DSO を使っているときに、
207     DSO が実行プログラムからシンボルを解決する点です (二番目の方法)。
208     これはなぜでしょうか。それは、DSO のシンボルを実行プログラムの
209     シンボルから「逆解決」するというのはライブラリの設計
210     (ライブラリはそれを使用するプログラムのことは何も
211     知らない) に反していて、この機能はすべてのプラットフォームに
212     あるわけではなく、標準化もされていないからです。
213     実際には実行プログラムのグローバルなシンボルは再エクスポートされることは
214     あまりなく、DSO から使うことができません。リンカにグローバルシンボルすべてを
215     エクスポートするようにさせる方法を見つけることが、実行時にプログラムを
216     拡張するために DSO を使うときの一番の問題です。</p>
217
218     <p>共有ライブラリのアプローチが普通の方法です。DSO 機構はそのために
219     設計されたものですから。したがって、その方法はオペレーティングシステムが
220     提供するほとんどすべての種類のライブラリで使われています。
221     一方、プログラムの拡張のために共有オブジェクトを使用する、という方は
222     あまり使われていません。</p>
223
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 を使ってモジュールをロードするようにすでに
231     運命付けられていたのです。</p>
232 </section>
233
234 <section id="advantages"><title>利点と欠点</title>
235
236     <p>上記の DSO に基づいた機能は以下の利点があります:</p>
237
238     <ul>
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>
247
248       <li>インストールの後であっても、サーバのパッケージをサードパーティ
249       モジュールで簡単に拡張できるようになりました。これは、Apache コア
250       パッケージと、PHP3, mod_perl, mod_fastcgi <em>など</em> の追加の
251       パッケージを作成できるので、少なくともベンダのパッケージ管理者にとって
252       大きな利点があります。</li>
253
254       <li>Apache モジュールの開発が簡単になります。
255       これは DSO と <program>apxs</program> の組み合わせにより、Apache ソースツリーの
256       外で作業でき、開発中のモジュールの新しいバージョンを
257       実行中の Apache サーバに組み込むために <code>apxs -i</code> と
258       <code>apachectl restart</code> を行なうだけで良くなるからです。</li>
259     </ul>
260
261     <p>DSO には以下の欠点があります:</p>
262
263     <ul>
264       <li>すべてのオペレーティングシステムがプログラムのアドレス空間に
265       コードを動的ロードすることをサポートしているわではないので、
266       プラットフォームによっては DSO 機構は使えません。</li>
267
268       <li>Unix のローダがシンボルの解決をする必要ができたので、
269       そのオーバヘッドによりサーバの起動時間が約 20% 遅くなっています。</li>
270
271       <li>位置非依存コード (PIC) (訳注 position independent code) は
272       相対アドレスのために複雑なアセンブラのトリックが必要なことがあり、
273       それは必ずしも絶対アドレスと同じくらいの速度がでるわけではありませんので、
274       プラットフォームによってはサーバの実行速度が約 5% 遅くなります。</li>
275
276       <li>DSO モジュールはすべてのプラットフォームで他の DSO に基づいた
277       ライブラリに対してリンクできる (<code>ld -lfoo</code>)
278       というわけではありませんので (たとえば、a.out のプラットフォームでは
279       この機能はありませんが、ELF のプラットフォームにはあります)、
280       すべての種類のモジュールに DSO 機構を使えるわけではありません。
281       言い換えると、DSO ファイルとしてコンパイルされたモジュールの
282       使えるシンボルは、
283       Apache のコアのシンボル、C ライブラリ (<code>libc</code>) と
284       Apache コアが使っている他のすべての静的なライブラリと動的ライブラリの
285       シンボル、PIC による静的なライブラリ (<code>libfoo.a</code>) の
286       シンボルのみに制限されます。その他のコードを使う方法は、
287       Apache コア自身がすでにそのコードへの参照があるようにするか、
288       <code>dlopen ()</code> を使ってコードを自分自身でロードするかの
289      どちらかしかありません。</li>
290     </ul>
291
292 </section>
293
294 </manualpage>