[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

9. dlopenモジュール

ダイナミックリンクの議論では,その用語が2つの異なる概念を述べると きに使用されるので,混乱することがあります.

  1. 共有ライブラリに対しプログラムをコンパイルとリンクし,それは,ダイナミッ クリンカにより実行時に自動的に解決される.この処理では,ダイナミックリン クはアプリケーション透過です.

  2. アプリケーションの,dlopen(8)のような関数の呼び出しで, それは,ユーザが指定したモジュールを実行時に任意にロードします.この形式 のダイナミックリンクは,アプリケーションで明示的に制御されます.

混乱を軽減するため,このマニュアルは2番目の形式のダイナミックリンクを dlopenモジュールとして述べることにします.

dlopenモジュールの主な利点は,プログラムを拡張するために,インタプリタ言 語を使用するのではなく,コンパイルされたオブジェクトコードにアクセスする 能力です.実際,dlopenは,言語を拡張する効果的な方法を提供するため,イン タプリタ言語でよく使用されます.

バージョン1.4.2の現在は,libtoolはdlopenされるモジュールのサポー トを提供します.しかし,パッケージがそのようなサポートを行うことを, `configure.in'で,マクロ`AC_LIBTOOL_DLOPEN'を使用して指示した 方が良いでしょう.このマクロが使用されない(または`AC_PROG_LIBTOOL' の後で使用される)場合,libtoolはdlopenメカニズムが利用不可能と仮 定し,シミュレーションを試みます.

この章ではdlopenでアクセス可能なモジュールを生成するため,dlopenアプリケー ション開発者がlibtoolを使用する方法を議論します.


9.1 dlopenのためのモジュールのビルド

オペレーティングシステムには,プログラムシンボルをdlsym(またはそ の等価)関数を用いて動的に解決するために,特別に宣言する必要があるものも あります.

libtoolは,`-export-dynamic'と`-module'リンクフラグを提供し (see section リンクモード),それはこの宣言を行います.他のモジュールやdlopenさ れているlibtoolライブラリをdlopenするアプリケーションプログラムをリンク する場合,これらのフラグを使用する必要があります.

例えば,後でアプリケーションにdlopenされる共有ライブラリ`libhello' をビルドしたい場合,他のリンクオプションに`-module'を加えます.

 
burger$ libtool gcc -module -o libhello.la foo.lo \
                hello.lo -rpath /usr/local/lib -lm
burger$

実行形式からのシンボルが,dlopenしたいライブラリの未解決の参照を 満足させる必要がある場合,フラグ`-export-dynamic'を使用する必要があ ります.dlopenを呼び出す実行形式をリンクするとき,`-export-dynamic' を使用してください.

 
burger$ libtool gcc -export-dynamic -o hell-dlopener main.o
burger$

9.2 dlopen

libtoolは,dlopenするlibtoolオブジェクトとlibtoolライブラリファイルに対 し,たとえdlopendlsym関数が無いプラットフォームで も,そのシンボルが解決できるように,特別のサポートを提供します.

"laziness"の増加順にプログラムにコードをロードする,以下の別の方法を考 慮します.

  1. 参照するしないに関わらない,実行形式の一部となるオブジェクトファイルへの リンクです.オブジェクトファイルが見つからない場合,リンカは実行形式の作 成を停止します.

  2. 上記のオブジェクトファイルでの未定義の参照を満足させるように,リンク時に 検索されるようにするための,リンカに対するスタティックライブラリの宣言で す.スタティックライブラリが見つからない場合,リンカは実行形式の作成を停 止します.

  3. 上記のファイルでの未定義の参照を満足させるために,実行時に検索されるよう にするための,実行時リンクの共有ライブラリの宣言です.共有ライブラリが見 つからない場合,ダイナミックリンカは実行形式の作成を停止します.

  4. アプリケーション自身が解決することができるように,参照を動的解決する dlopenモジュールです.モジュールを開くときエラーが発生したり,モジュール が見つからない場合,アプリケーションは壊れることなく回復します.

libtoolは,コンパイル時にオブジェクトファイルをプログラムにリンクし,プ ログラムのシンボルテーブルを表現するデータ構造を作成することで,スタティッ クなプラットフォームで`-dlopen'オプションをエミュレートします.

この特徴を使用するため,プログラムのリンク時(see section リンクモード)に `-dlopen'や`-dlpreopen'フラグを使用することで,アプリケーショ ンでdlopenしたいオブジェクトを宣言する必要があります.

Structure: struct lt_dlsymlist { const char *name; lt_ptr address; }

name属性は,"fprintf"のような,シンボル名のNULL終端されてい る文字列です.address属性は,&fprintfのような対応するオブジェ クトへの一般的なポインタです.

Variable: const lt_dlsymlist * lt_preloaded_symbols

lt_symbol構造体の配列で,プログラムにリンクされる,プリロードされ ているすべてのシンボルを表現します.それぞれの`-dlpreloaded'ファイ ルに対し,ファイルのnameを用いた要素と,0addressが あり,このファイルからエクスポートされるすべてのシンボルが続きます.実行 形式自身に対し,特別の名前@PROGRAM@が使用されます.最後の要素は, name0addressを持ちます.

ドル記号のような,ANSI Cでは有効ではない識別子を許可するコンパイラもあり ます.libtoolはANSI Cで有効なシンボル(最初がASCII文字またはアンダースコ アで,0以上のASCII文字,数字,そしてアンダースコアが続くもの)のみ認識す るので,非ASCIIシンボルはlt_preloaded_symbolsに出現しません.


9.3 dlopenで正しい名前の検索

`-module'を用いてライブラリがリンクされた後,dlopen可能になります. 残念ながら ライブラリ名が変更されるため,パッケージでdlopenの正しいファ イルを決定する必要があります.

最も率直で柔軟な実装は,インストールされた`.la'ファイルを探し,以下 の行を検索することで実行時に決定することです.

 
# The name that we can dlopen.
dlname='dlname'

dlnameが空の場合,ライブラリはdlopenされません.それ以外では,それ でライブラリのdlnameを与えます.そのため,ライブラリが `/usr/local/lib/libhello.la'にインストールされていて,dlname が`libhello.so.3'の場合,`/usr/local/lib/libhello.so.3'が dlopenされます.

プログラムがこのアプローチを行っている場合,ライブラリが最終的にインストー ルされるディレクトリと同じように,LD_LIBRARY_PATH(9)環境変数でリストアッ プされているディレクトリで検索します.この変数(または同等物)を検索するこ とで,インストール前でも,プログラムがlibtoolを使用してリンクし提供され ているdlopenモジュールを見つけることを保証します.


9.4 未解決のdlopenの問題

以下の問題は,libtoolのdlopenサポートを使用しても解決しません.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on June, 15 2005 using texi2html 1.70.