(Translated by https://www.hiragana.jp/)
動的共有オブジェクト (DSO) サポート - Apache HTTP サーバ バージョン 2.4
<-
Apache > HTTP サーバ > ドキュメンテーション > バージョン 2.4

動的どうてき共有きょうゆうオブジェクト (DSO) サポート

翻訳ほんやく言語げんご:  en  |  fr  |  ja  |  ko  |  tr 

この日本語にほんごやくはすでにふるくなっている 可能かのうせいがあります。 最近さいきん更新こうしんされた内容ないようるには英語えいごばんをごらんください。

Apache HTTP サーバはモジュールされたプログラムで、 管理かんりしゃがモジュールを選択せんたくすることでサーバに機能きのうえらぶことができます。 モジュールはサーバがビルドされるときに httpd バイナリに 静的せいてきむことができます。もしくは、httpd バイナリとは べつ存在そんざいする動的どうてき共有きょうゆうオブジェクト (訳注やくちゅう: Dynamic Shared Object) (DSO) としてコンパイルすることも できます。DSO モジュールはサーバがビルドされるときにコンパイルしたり、 Apache 拡張かくちょうツール (apxs) を 使つかってあとでコンパイルして追加ついかしたりできます。

この文書ぶんしょは DSO モジュールの使つかかたと、仕組しくみについて 説明せつめいします。

Support Apache!

参照さんしょう

top

実装じっそう

個々ここの Apache モジュールをロードするための DSO サポートは mod_so.c というモジュールの機能きのうもとづいています。 このモジュール は Apache のコアに静的せいてきまれている必要ひつようがあります。 それは core.c 以外いがいでは DSO にできない唯一ゆいいつの モジュールです。事実じじつじょうのすべての Apache のモジュールは、 インストールの文書ぶんしょ説明せつめいされているように、 configure--enable-module=shared オプションでそれぞれを DSO ビルドにすることにより、DSO モジュールにすることができます。 mod_foo.so のような DSO にモジュールがコンパイルされれば、 httpd.conf ファイルちゅうmod_soLoadModule ディレクティブを使つかうことでサーバの起動きどうさい起動きどうにこのモジュールを ロードするようにできます。

Apache モジュールようの (とくにサードパーティモジュールの) DSO ファイルの 作成さくせい簡単かんたんにするために、apxs (APache eXtenSion) というあたらしいサポートプログラムがあります。 Apache のソースツリーのそと DSO モジュールをビルドするために 使つかうことができます。発想はっそう単純たんじゅんです: Apache のインストールconfiguremake install のときに Apache の C ヘッダをインストールし、DSO ビルドようのプラットフォーム依存いぞんの コンパイラとリンカのフラグを apxs プログラムに追加ついかします。 これにより、ユーザが Apache の配布はいふソースツリーなしで、さらに DSO サポートのためのプラットフォーム依存いぞんのコンパイラやリンカの フラグをいじることなく Apache のモジュールのソースをコンパイル できるようになります。

top

使用しようほう概要がいよう

Apache 2.x の DSO 機能きのう概略がいりゃくることができるための、 みじか簡潔かんけつ概要がいようです:

  1. 配布はいふされている Apache モジュール、かりmod_foo.c として、それを DSO mod_foo.so にビルド、インストール:

    $ ./configure --prefix=/path/to/install --enable-foo=shared
    $ make install

  2. サードパーティ Apache モジュール、かりmod_foo.c として、それを DSO mod_foo.so にビルド、インストール:

    $ ./configure --add-module=module_type:/path/to/3rdparty/mod_foo.c \
    --enable-foo=shared
    $ make install

  3. 共有きょうゆうモジュールの 後々あとあとのインストール のために Apache を設定せってい:

    $ ./configure --enable-so
    $ make install

  4. サードパーティ Apache モジュール、かりmod_foo.c として、それを apxs使つかって Apache ソースツリーのそと DSO にビルド、インストール:

    $ cd /path/to/3rdparty
    $ apxs -c mod_foo.c
    $ apxs -i -a -n foo mod_foo.la

どの場合ばあいにおいても、共有きょうゆうモジュールをコンパイルしたのちで、 httpd.confLoadModule ディレクティブを使つかって Apache がモジュールを使用しようするように しなければなりません。

top

背景はいけい

最近さいきんの Unix けいの OS には 動的どうてき共有きょうゆうオブジェクト (DSO) の動的どうてきリンク/ロードというのきいた機構きこう存在そんざいします。これは、実行じっこうにプログラムのアドレス空間くうかんに ロードできるような特別とくべつ形式けいしきでプログラムをビルドすることを 可能かのうにします。

このロードはふたつの方法ほうほうおこなうことができます: 実行じっこうプログラムが 起動きどうされたときに ld.so というシステムプログラム により自動的じどうてきおこなわれる方法ほうほうと、実行じっこうプログラムちゅうから、システムコール dlopen()/dlsym() による Unix ローダへの プログラムシステムのインタフェースを使つかって手動しゅどうおこなう方法ほうほうとが あります。

最初さいしょ方法ほうほうでは DSO は普通ふつう共有きょうゆうライブラリDSO ライブラリばれていて、DSO の名前なまえlibfoo.solibfoo.so.1.2 のようになっています。 これらはシステムディレクトリ (通常つうじょう /usr/lib) に存在そんざいし、 実行じっこうプログラムへのリンクはビルド-lfoo をリンカに 指定していすることで確立かくりつされます。これによりライブラリへの参照さんしょう実行じっこうプログラムの ファイルにまれて、起動きどうに Unix のローダが /usr/lib や、 リンカの -R のようなオプションによりハードコードされたパス、 環境かんきょう変数へんすう LD_LIBRARY_PATH により設定せっていされたパス、のなかから libfoo.so場所ばしょつけることができます。それから、 実行じっこうプログラムちゅうの (まだ解決かいけつの) シンボルを DSO にあるシンボルで 解決かいけつします。

普通ふつう実行じっこうプログラムちゅうのシンボルは DSO からは参照さんしょうされません (DSO は一般いっぱんてきなコードによるさい利用りよう可能かのうなライブラリですので)。 ですから、さらなるシンボルの解決かいけつ必要ひつようありません。 シンボルは Unix ローダにより完全かんぜん解決かいけつおこなわれますので、実行じっこうファイル自身じしんなにもする必要ひつようがありません。(実際じっさいのところ、静的せいてきでない方法ほうほうでリンクされている すべての実行じっこうプログラムにまれている開始かいしようのコードの一部いちぶld.so起動きどうするコードがふくまれています)。よく使つかわれる ライブラリの動的どうてきロードの利点りてんあきらかです。ライブラリのコードは システムライブラリに libc.so のようにして一度いちど保存ほぞんするだけでよく、 プログラムのために必要ひつようなディスクの領域りょういき節約せつやくすることができます。

ふたつめの方法ほうほうでは DSO は普通ふつう共有きょうゆうオブジェクトDSO ファイルばれていて、任意にんい拡張子かくちょうしけることができます (ただし、標準ひょうじゅんてき名前なまえfoo.so です)。 これらのファイルは通常つうじょうはプログラム専用せんようのディレクトリにかれ、 これらを使つか実行じっこうプログラムへのリンクは自動的じどうてきにはされません。 ですので、実行じっこうプログラムは dlopen()使つかって 実行じっこう手動しゅどうで DSO をプログラムのアドレス空間くうかんにロードする必要ひつようがあります。 この時点じてんでは実行じっこうプログラムにたいして DSO のシンボルの解決かいけつおこなわれません。 しかし、そのわりに Unix のローダが DSO の (まだ解決かいけつの) シンボルを 実行じっこうプログラムによりエクスポートされたシンボルとすでにロードされた DSO ライブラリによりエクスポートされたシンボル (とくに、どこにでもある libc.so のすべてのシンボル) で自動的じどうてき解決かいけつします。 こうすることで、DSO は最初さいしょから静的せいてきにリンクされていたかのように、 実行じっこうプログラムのシンボルをることができます。

最後さいごに、DSO の API を利点りてんかすために、プログラムは あとでディスパッチテーブルなどでシンボルを使つかうことができるように、 dlsym()使つかっていくつかのシンボルを解決かいけつします。 すなわち: 実行じっこうプログラムは必要ひつようなすべてのシンボルを手動しゅどう解決かいけつしなければ なりません。この機構きこう利点りてんはプログラムのオプショナルな部分ぶぶん必要ひつようになるまでロードする必要ひつようがない (だからメモリも消費しょうひしない) ことです。必要ひつようならば、基本きほんプログラムの機能きのう拡張かくちょうするために これらの部分ぶぶん動的どうてきにロードすることができます。

この DSO 機構きこう簡単かんたんなようにえますが、すくなくともひとむずかしいてんが あります: プログラムを拡張かくちょうするために DSO を使つかっているときに、 DSO が実行じっこうプログラムからシンボルを解決かいけつするてんです (番目ばんめ方法ほうほう)。 これはなぜでしょうか。それは、DSO のシンボルを実行じっこうプログラムの シンボルから「ぎゃく解決かいけつ」するというのはライブラリの設計せっけい (ライブラリはそれを使用しようするプログラムのことはなにらない) にはんしていて、この機能きのうはすべてのプラットフォームに あるわけではなく、標準ひょうじゅんもされていないからです。 実際じっさいには実行じっこうプログラムのグローバルなシンボルはさいエクスポートされることは あまりなく、DSO から使つかうことができません。リンカにグローバルシンボルすべてを エクスポートするようにさせる方法ほうほうつけることが、実行じっこうにプログラムを 拡張かくちょうするために DSO を使つかうときの一番いちばん問題もんだいです。

共有きょうゆうライブラリのアプローチが普通ふつう方法ほうほうです。DSO 機構きこうはそのために 設計せっけいされたものですから。したがって、その方法ほうほうはオペレーティングシステムが 提供ていきょうするほとんどすべての種類しゅるいのライブラリで使つかわれています。 一方いっぽう、プログラムの拡張かくちょうのために共有きょうゆうオブジェクトを使用しようする、というほうは あまり使つかわれていません。

1998 ねん時点じてんで、実行じっこう実際じっさい機能きのう拡張かくちょうのために DSO 機構きこう使つかっている ソフトウェアパッケージはすこしだけでした: Perl 5 (XS 機構きこうと DnaLoader モジュール によるもの)、Netscape サーバなどです。Apache はすでに モジュールの概念がいねん使つかって機能きのう拡張かくちょうをしていて、内部ないぶてきにディスパッチリストに もとづいた外部がいぶモジュールの Apache コア機能きのうへのリンクをおこなっていましたので、 バージョン 1.3 から、Apache も DSO 機構きこう使つか仲間なかまになりました。 Apache は実行じっこうに DSO を使つかってモジュールをロードするようにすでに 運命うんめいけられていたのです。

top

利点りてん欠点けってん

上記じょうきの DSO にもとづいた機能きのう以下いか利点りてんがあります:

DSO には以下いか欠点けってんがあります:

翻訳ほんやく言語げんご:  en  |  fr  |  ja  |  ko  |  tr 

top

コメント

Notice:
This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.