Documentation on the dl family of calls
dl 系関数の呼び出しに関する文書
イントロダクション
dlopen、dlclose、dlsym そして dlerror
の実装は「.dll」を UNIX における「.so」とほぼ同様に扱えるようにします。
- DLL のリンク = DLL が自動的にロードされる(即ち、インポートライブラリによって DLL が実行形式にリンクされている)。
- DLL のオープン =
dlopenによって DLL がオープンされる。
説明:
dlopen、dlcose、dlsym、dlerrorの実装- DLL のリンク及びロードが正常に初期化された時点で、グローバルコンストラクタが呼び出される。
- DLL がデタッチ(リンクされた DLL の終了、又はオープンされた DLL に対する
dlclose)された時点で、グローバルデストラクタが呼び出される。 - プロセスが fork された時点で、
- リンクされた DLL のデータは子プロセス内に正しくコピーされ、 グローバルデストラクタは子プロセスが終了した時点で呼び出される。
- DLL のオープンにおける二つのケース:
- リロードが可能(
dlfork(FORK_RELOAD): 以下を参照)。 この場合、ロードされた DLL は子プロセスでリロードされ、データは親プロセスから子プロセスへと正しくコピーされ、親プロセスがオープンしたハンドルは子プロセスからもアクセス可能である(警告: この機能を利用するためには、DLL は LoadLibrary ではなく、dlopenによってロードされる必要があります)。 - リロード不能(デフォルト)。この場合、子プロセスは親プロセスがオープンした DLL にはアクセス出来ません。
- リロードが可能(
この機能は、もし DLL が同じ順番でロードされたのであれば、fork されたプロセスにおいても DLL は親が使用するアドレスと同じアドレスにマップされるであろうという仮説に基づいています。
使用方法:
DLL のコードにおいて、以下が必ず行われている必要があります。
-
#include <cygwin/cygwin_dll.h>そして以下のマクロ宣言を使用します。
DECLARE_CYGWIN_DLL(<your entry point>);インポートセクションを終了させる取り決めがマクロに含められていることに気をつけて下さい。
-
リンクの段階で、エントリポイントとして 「
__cygwin_dll_entry@12」を使用します。3 つのリンクパスを実行する必要があるかもしれないことに注意して下さい。 -
dlforkは新しい Cygwin 独自の関数です。この関数のプロトタイプはdlfcn.hにあります。dlforkは引数として int を取り、これは以下に挙げる値を取ります。FORK_NO_RELOAD: これはデフォルトの動作です。子プロセスは親がオープンしたライブラリのリロードを行わず、親の持つハンドルにはアクセス出来ません。FORK_RELOAD: 子プロセスは全てのオープンされた DLL をリロードし、親の持つハンドル(ライブラリ又は関数)にもアクセス出来ます。 これは遅いかもしれないので、必要なときだけ使用するべきです。
dlforkフラグは子プロセスに引き継がれない大域変数です(即ち、fork されたプロセスは常にFORK_NO_RELOADで始まります)。