dso.xml.ja revision 98ccaa63a1c82ead7a360754f10534b3d36ba099
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose<?xml version="1.0" encoding="UTF-8" ?>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose<!DOCTYPE manualpage SYSTEM "/style/manualpage.dtd">
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose<?xml-stylesheet type="text/xsl" href="/style/manual.ja.xsl"?>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose<!-- English Revision: 587444:952009 (outdated) -->
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose<!--
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose Licensed to the Apache Software Foundation (ASF) under one or more
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose contributor license agreements. See the NOTICE file distributed with
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose this work for additional information regarding copyright ownership.
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose The ASF licenses this file to You under the Apache License, Version 2.0
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose (the "License"); you may not use this file except in compliance with
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose the License. You may obtain a copy of the License at
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose http://www.apache.org/licenses/LICENSE-2.0
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose Unless required by applicable law or agreed to in writing, software
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose distributed under the License is distributed on an "AS IS" BASIS,
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose See the License for the specific language governing permissions and
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose limitations under the License.
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose-->
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose<manualpage metafile="dso.xml.meta">
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <title>動的共有オブジェクト (DSO) サポート</title>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <summary>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <p>Apache HTTP サーバはモジュール化されたプログラムで、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 管理者がモジュールを選択することでサーバに組み込む機能を選ぶことができます。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose モジュールはサーバがビルドされるときに <program>httpd</program> バイナリに
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 静的に組み込むことができます。もしくは、<program>httpd</program> バイナリとは
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 別に存在する動的共有オブジェクト (訳注: Dynamic Shared Object)
ff6e24f4474cca6226cd44c47ba2ec6ba6cf9a16Sumit Bose (DSO) としてコンパイルすることも
ff6e24f4474cca6226cd44c47ba2ec6ba6cf9a16Sumit Bose できます。DSO モジュールはサーバがビルドされるときにコンパイルしたり、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose Apache 拡張ツール (<program>apxs</program>) を
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 使って後でコンパイルして追加したりできます。</p>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <p>この文書は DSO モジュールの使い方と、仕組みについて
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 説明します。</p>
ff6e24f4474cca6226cd44c47ba2ec6ba6cf9a16Sumit Bose </summary>
ff6e24f4474cca6226cd44c47ba2ec6ba6cf9a16Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose<section id="implementation"><title>実装</title>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose<related>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose<modulelist>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose<module>mod_so</module>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose</modulelist>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose<directivelist>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose<directive module="mod_so">LoadModule</directive>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose</directivelist>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose</related>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <p>個々の Apache モジュールをロードするための DSO サポートは
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <module>mod_so.c</module> というモジュールの機能に基づいています。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose このモジュール は Apache のコアに静的に組み込まれている必要があります。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose それは <module>core.c</module> 以外では DSO にできない唯一の
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose モジュールです。事実上、他のすべての Apache のモジュールは、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <a href="install.html">インストールの文書</a>で説明されているように、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <program>configure</program> の
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek <code>--enable-<em>module</em>=shared</code> オプションでそれぞれを
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose DSO ビルドにすることにより、DSO モジュールにすることができます。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <code>mod_foo.so</code> のような DSO にモジュールがコンパイルされれば、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <code>httpd.conf</code> ファイル中で <module>mod_so</module> の
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <directive module="mod_so">LoadModule</directive>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose ディレクティブを使うことでサーバの起動や再起動時にこのモジュールを
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose ロードするようにできます。</p>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <p>Apache モジュール用の (特にサードパーティモジュールの) DSO ファイルの
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 作成を簡単にするために、<program>apxs</program>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose (<dfn>APache eXtenSion</dfn>) という新しいサポートプログラムがあります。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose Apache のソースツリーの<em>外で</em> DSO モジュールをビルドするために
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 使うことができます。発想は単純です: Apache のインストール時の
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <program>configure</program>、<code>make install</code> のときに Apache の
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose C ヘッダをインストールし、DSO ビルド用のプラットフォーム依存の
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose コンパイラとリンカのフラグを <program>apxs</program> プログラムに追加します。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose これにより、ユーザが Apache の配布ソースツリーなしで、さらに
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose DSO サポートのためのプラットフォーム依存のコンパイラやリンカの
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose フラグをいじることなく Apache のモジュールのソースをコンパイル
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose できるようになります。</p>
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek</section>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose<section id="usage"><title>使用法の概要</title>
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl <p>Apache 2.x の DSO 機能の概略を知ることができるための、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 短く簡潔な概要です:</p>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <ol>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <li>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <em>配布されている</em> Apache モジュール、仮に <code>mod_foo.c</code>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose として、それを DSO <code>mod_foo.so</code> にビルド、インストール:
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose<example>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose$ /configure --prefix=/path/to/install --enable-foo=shared<br />
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose$ make install
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose</example>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose </li>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <li>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <em>サードパーティ</em> Apache モジュール、仮に <code>mod_foo.c</code>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose として、それを DSO <code>mod_foo.so</code> にビルド、インストール:
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose<example>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose$ /configure --add-module=<var>module_type</var>:/path/to/3rdparty/mod_foo.c \<br />
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose<indent>
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl --enable-foo=shared<br />
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl</indent>
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl$ make install
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl</example>
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl </li>
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl <li>
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl 共有モジュールの <em>後々のインストール</em> のために
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose Apache を設定:
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose<example>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose$ /configure --enable-so<br />
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose$ make install
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl</example>
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl </li>
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl <li>
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl <em>サードパーティ</em> Apache モジュール、仮に <code>mod_foo.c</code>
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl として、それを <program>apxs</program> を使って
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl Apache ソースツリーの<em>外で</em> DSO にビルド、インストール:
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose<example>
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek$ cd /path/to/3rdparty<br />
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose$ apxs -c mod_foo.c<br />
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose$ apxs -i -a -n foo mod_foo.la
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek</example>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose </li>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose </ol>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <p>どの場合においても、共有モジュールをコンパイルした後で、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <code>httpd.conf</code> で
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <directive module="mod_so">LoadModule</directive>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose ディレクティブを使って Apache がモジュールを使用するように
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl しなければなりません。</p>
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl</section>
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl<section id="background"><title>背景</title>
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl <p>最近の Unix 系の OS には <em>動的共有オブジェクト</em> (DSO)
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl の動的リンク/ロードという気のきいた機構が
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl 存在します。これは、実行時にプログラムのアドレス空間に
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl ロードできるような特別な形式でプログラムをビルドすることを
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl 可能にします。</p>
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl <p>このロードは二つの方法で行なうことができます: 実行プログラムが
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl 起動されたときに <code>ld.so</code> というシステムプログラム
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek により自動的に行なわれる方法と、実行プログラム中から、システムコール
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <code>dlopen()/dlsym()</code> による Unix ローダへの
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose プログラムシステムのインタフェースを使って手動で行なう方法とが
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek あります。</p>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <p>最初の方法では DSO は普通は<em>共有ライブラリ</em>や <em>DSO
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose ライブラリ</em> と呼ばれていて、DSO の名前は
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <code>libfoo.so</code> や <code>libfoo.so.1.2</code> のようになっています。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose これらはシステムディレクトリ (通常 <code>/usr/lib</code>) に存在し、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 実行プログラムへのリンクはビルド時に <code>-lfoo</code> をリンカに
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 指定することで確立されます。これによりライブラリへの参照が実行プログラムの
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl ファイルに書き込まれて、起動時に Unix のローダが <code>/usr/lib</code> や、
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek リンカの <code>-R</code> のようなオプションによりハードコードされたパス、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 環境変数 <code>LD_LIBRARY_PATH</code> により設定されたパス、の中から
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <code>libfoo.so</code> の場所を見つけることができます。それから、
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek 実行プログラム中の (まだ未解決の) シンボルを DSO にあるシンボルで
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 解決します。</p>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <p>普通は実行プログラム中のシンボルは DSO からは参照されません
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose (DSO は一般的なコードによる再利用可能なライブラリですので)。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose ですから、さらなるシンボルの解決は必要ありません。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose シンボルは Unix ローダにより完全な解決が行なわれますので、実行ファイル自身は
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 何もする必要がありません。(実際のところ、静的でない方法でリンクされている
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl すべての実行プログラムに組み込まれている開始用のコードの一部に
8babbeee01e67893af4828ddfc922ecac0be4197Pavel Reichl <code>ld.so</code> を起動するコードが含まれています)。よく使われる
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek ライブラリの動的ロードの利点は明らかです。ライブラリのコードは
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose システムライブラリに <code>libc.so</code> のようにして一度保存するだけでよく、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose プログラムのために必要なディスクの領域を節約することができます。</p>
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <p>二つめの方法では DSO は普通は<em>共有オブジェクト</em>や
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <em>DSO ファイル</em>と呼ばれていて、任意の拡張子を付けることができます
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose (ただし、標準的な名前は <code>foo.so</code> です)。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose これらのファイルは通常はプログラム専用のディレクトリに置かれ、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose これらを使う実行プログラムへのリンクは自動的にはされません。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose ですので、実行プログラムは <code>dlopen()</code> を使って
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 実行時に手動で DSO をプログラムのアドレス空間にロードする必要があります。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose この時点では実行プログラムに対して DSO のシンボルの解決は行なわれません。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose しかし、その代わりに Unix のローダが DSO の (まだ未解決の) シンボルを
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 実行プログラムによりエクスポートされたシンボルと既にロードされた
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose DSO ライブラリによりエクスポートされたシンボル (特に、どこにでもある
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <code>libc.so</code> のすべてのシンボル) で自動的に解決します。
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek こうすることで、DSO は最初から静的にリンクされていたかのように、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 実行プログラムのシンボルを知ることができます。</p>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <p>最後に、DSO の API を利点を生かすために、プログラムは
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 後でディスパッチテーブル<em>など</em>でシンボルを使うことができるように、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <code>dlsym()</code> を使っていくつかのシンボルを解決します。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose すなわち: 実行プログラムは必要なすべてのシンボルを手動で解決しなければ
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose なりません。この機構の利点はプログラムのオプショナルな部分は
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 必要になるまでロードする必要がない (だからメモリも消費しない)
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose ことです。必要ならば、基本プログラムの機能を拡張するために
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose これらの部分を動的にロードすることができます。</p>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <p>この DSO 機構は簡単なように見えますが、少なくとも一つ難しい点が
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose あります: プログラムを拡張するために DSO を使っているときに、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose DSO が実行プログラムからシンボルを解決する点です (二番目の方法)。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose これはなぜでしょうか。それは、DSO のシンボルを実行プログラムの
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose シンボルから「逆解決」するというのはライブラリの設計
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose (ライブラリはそれを使用するプログラムのことは何も
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 知らない) に反していて、この機能はすべてのプラットフォームに
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose あるわけではなく、標準化もされていないからです。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 実際には実行プログラムのグローバルなシンボルは再エクスポートされることは
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose あまりなく、DSO から使うことができません。リンカにグローバルシンボルすべてを
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose エクスポートするようにさせる方法を見つけることが、実行時にプログラムを
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 拡張するために DSO を使うときの一番の問題です。</p>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <p>共有ライブラリのアプローチが普通の方法です。DSO 機構はそのために
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 設計されたものですから。したがって、その方法はオペレーティングシステムが
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 提供するほとんどすべての種類のライブラリで使われています。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 一方、プログラムの拡張のために共有オブジェクトを使用する、という方は
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose あまり使われていません。</p>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <p>1998 年の時点で、実行時に実際に機能拡張のために DSO 機構を使っている
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose ソフトウェアパッケージは少しだけでした: Perl 5 (XS 機構と DnaLoader モジュール
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose によるもの)、Netscape サーバ<em>など</em>です。Apache はすでに
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose モジュールの概念を使って機能拡張をしていて、内部的にディスパッチリストに
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 基づいた外部モジュールの Apache コア機能へのリンクを行なっていましたので、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose バージョン 1.3 から、Apache も DSO 機構を使う仲間になりました。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose Apache は実行時に DSO を使ってモジュールをロードするようにすでに
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 運命付けられていたのです。</p>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose</section>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose<section id="advantages"><title>利点と欠点</title>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <p>上記の DSO に基づいた機能は以下の利点があります:</p>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <ul>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <li>実際のサーバプロセスを組み立てるために、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose ビルド時に <code>configure</code> のオプションを使う代わりに
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 実行時に <code>httpd.conf</code> の設定用コマンド
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <directive module="mod_so">LoadModule</directive>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose を使うことができますので、サーバパッケージの柔軟性が高まりました。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose たとえば、一つの Apache のインストールから
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 違う構成のサーバ (標準版と SSL 版、最小構成と拡張版 [mod_perl, PHP3]
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <em>など</em>) を実行することができます。</li>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <li>インストールの後であっても、サーバのパッケージをサードパーティ
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose モジュールで簡単に拡張できるようになりました。これは、Apache コア
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose パッケージと、PHP3, mod_perl, mod_fastcgi <em>など</em> の追加の
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose パッケージを作成できるので、少なくともベンダのパッケージ管理者にとって
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 大きな利点があります。</li>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <li>Apache モジュールの開発が簡単になります。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose これは DSO と <program>apxs</program> の組み合わせにより、Apache ソースツリーの
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 外で作業でき、開発中のモジュールの新しいバージョンを
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 実行中の Apache サーバに組み込むために <code>apxs -i</code> と
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <code>apachectl restart</code> を行なうだけで良くなるからです。</li>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose </ul>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <p>DSO には以下の欠点があります:</p>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <ul>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <li>すべてのオペレーティングシステムがプログラムのアドレス空間に
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose コードを動的ロードすることをサポートしているわではないので、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose プラットフォームによっては DSO 機構は使えません。</li>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <li>Unix のローダがシンボルの解決をする必要ができたので、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose そのオーバヘッドによりサーバの起動時間が約 20% 遅くなっています。</li>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <li>位置非依存コード (PIC) (訳注 position independent code) は
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 相対アドレスのために複雑なアセンブラのトリックが必要なことがあり、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose それは必ずしも絶対アドレスと同じくらいの速度がでるわけではありませんので、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose プラットフォームによってはサーバの実行速度が約 5% 遅くなります。</li>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose <li>DSO モジュールはすべてのプラットフォームで他の DSO に基づいた
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose ライブラリに対してリンクできる (<code>ld -lfoo</code>)
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose というわけではありませんので (たとえば、a.out のプラットフォームでは
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose この機能はありませんが、ELF のプラットフォームにはあります)、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose すべての種類のモジュールに DSO 機構を使えるわけではありません。
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 言い換えると、DSO ファイルとしてコンパイルされたモジュールの
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose 使えるシンボルは、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose Apache のコアのシンボル、C ライブラリ (<code>libc</code>) と
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose Apache コアが使っている他のすべての静的なライブラリと動的ライブラリの
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose シンボル、PIC による静的なライブラリ (<code>libfoo.a</code>) の
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose シンボルのみに制限されます。その他のコードを使う方法は、
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose Apache コア自身がすでにそのコードへの参照があるようにするか、
4537e95f6741ae05ec620e5b46ca1d4a3a1ceae5Pavel Březina <code>dlopen ()</code> を使ってコードを自分自身でロードするかの
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose どちらかしかありません。</li>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose </ul>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose</section>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose</manualpage>
d064fef06dcbcb5f6c1be03e286b1a3433d6dfd7Sumit Bose