(57)【要約】  【課題】１つのプロセスで複数のアプリケーションを実行できる実行環境において、アプリケーションプログラム毎に、ダイナミックリンクライブラリのロードイメージを作成する。  【解決手段】ラッパライブラリ生成装置１は、記憶部３０に記憶されたダイナミックリンクライブラリ３１を読み出す第１の読み出しステップと、読み出したダイナミックリンクライブラリ３１に記述された関数にもとづいて、ラッパライブラリ３４を生成する生成ステップと、記憶部３０に記憶されたアプリケーションプログラム３５を読み出す第２の読み出しステップと、アプリケーションプログラム３５において、ダイナミックリングライブラリ３１を呼び出すコードを特定し、当該呼び出しコードを、ラッパライブラリ３４を呼び出すコードに変更する変更ステップと、を行う。  【選択図】図１
2006113935.tif 000002
【特許請求の範囲】
【請求項１】
ダイナミックリンクライブラリを呼び出すためのダイナミックリンクライブラリ呼び出しコード生成方法であって、
情報処理装置は、演算処理部と記憶部とを有し、
前記演算処理部は、
前記記憶部に記憶された前記ダイナミックリンクライブラリを読み出す第１の読み出しステップと、
前記読み出したダイナミックリンクライブラリに記述された関数にもとづいて、アプリケーションプログラム毎に前記ダイナミックリンクライブラリのロードイメージを作成するラッパライブラリを生成する生成ステップと、
前記記憶部に記憶された前記アプリケーションプログラムを読み出す第２の読み出しステップと、
前記アプリケーションプログラムにおいて、前記ダイナミックリンクライブラリを呼び出すコードを特定し、当該ダイナミックリンクライブラリの呼び出しコードを、前記生成したラッパライブラリを呼び出すコードに変更する変更ステップと、を行うこと
を特徴とするダイナミックリンクライブラリ呼び出しコード生成方法。
【請求項２】
請求項１記載のダイナミックリンクライブラリ呼び出しコード生成方法であって、
前記生成ステップにおいて生成されるラッパライブラリは、
前記ダイナミックリンクライブラリの各領域の中から前記アプリケーションプログラム間で共有不可能な領域を特定し、当該共有不可能な領域のみのロードイメージを前記アプリケーションプログラム毎に作成すること
を特徴とするダイナミックリンクライブラリ呼び出しコード生成方法。
【請求項３】
請求項１記載のダイナミックリンクライブラリ呼び出しコード生成方法であって、
前記生成ステップにおいて生成されるラッパライブラリは、
前記ダイナミックリンクライブラリのテキスト記述部が、前記アプリケーション間で共有不可能な場合、前記テキスト記述部のコードを前記アプリケーション間で共有可能なコードに修正し、前記テキスト記述部以外の前記アプリケーション間で共有不可能な領域のみのロードイメージを、前記アプリケーションプログラム毎に作成すること
を特徴とするダイナミックリンクライブラリ呼び出しコード生成方法。
【請求項４】
請求項１記載のダイナミックリンクライブラリ呼び出しコード生成方法であって、
前記生成ステップにおいて生成されるラッパライブラリは、
前記アプリケーションプログラムが使用するメモリ領域のアドレス毎に、前記ロードイメージを作成すること
を特徴とするダイナミックリンクライブラリ呼び出しコード生成方法。
【請求項５】
請求項１記載のダイナミックリンクライブラリ呼び出しコード生成方法であって、
前記演算処理部は、
前記アプリケーションプログラムを前記記憶部から読み出し、実行する実行ステップを、さらに行い、
前記実行ステップの実行時に、前記第１の読出しステップ、前記生成ステップ、および、前記変更ステップを行うこと
を特徴とするダイナミックリンクライブラリ呼び出しコード生成方法。
【請求項６】
請求項５記載のダイナミックリンクライブラリ呼び出しコード生成方法であって、
前記演算処理部は、
前記生成ステップの実行指示を受け付ける受け付けステップを、さらに行い、
前記実行ステップにおいて、前記実行指示を受け付けた場合に、前記生成ステップを行うこと、
を特徴とするダイナミックリンクライブラリ呼び出しコード生成方法。
【請求項７】
情報処理装置がダイナミックリンクライブラリの呼び出しコードを生成する呼び出しコード生成プログラムであって、
前記情報処理装置は、演算処理部と記憶部とを有し、
前記演算処理部に、
前記記憶部に記憶された前記ダイナミックリンクライブラリを読み出す第１の読み出しステップ、
前記読み出したダイナミックリンクライブラリに記述された関数にもとづいて、アプリケーションプログラム毎に前記ダイナミックリンクライブラリのロードイメージを作成するラッパライブラリを生成する生成ステップ、
前記記憶部に記憶された前記アプリケーションプログラムを読み出す第２の読み出しステップ、および、
前記アプリケーションプログラムにおいて、前記ダイナミックリンクライブラリを呼び出すコードを特定し、当該ダイナミックリンクライブラリの呼び出しコードを、前記生成したラッパライブラリを呼び出すコードに変更する変更ステップ、を実行させること
を特徴とする呼び出しコード生成プログラム。
【請求項８】
ダイナミックリンクライブラリを呼び出すためのダイナミックリンクライブラリ呼び出しコード生成装置であって、
前記ダイナミックリンクライブラリと、前記ダイナミックリンクライブラリを呼び出すアプロケーションプログラムと、を記憶する記憶手段と、
前記ダイナミックリンクライブラリに記述された関数にもとづいて、前記アプリケーションプログラム毎に前記ダイナミックリンクライブラリのロードイメージを作成するラッパライブラリを生成する生成ステップと、
前記アプリケーションプログラムを前記記憶手段から読み出し、当該アプリケーションプログラムにおいて、前記ダイナミックリンクライブラリを呼び出すコードを特定し、特定したダイナミックリンクライブラリの呼び出しコードを、前記生成したラッパライブラリを呼び出すコードに変更する変更手段と、を有すること
を特徴とするダイナミックリンクライブラリ呼び出しコード生成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ダイナミックリンクライブラリを呼び出す技術に関する。
【背景技術】
【０００２】
Windows(登録商標)などのオペレーティングシステム（以下、「ＯＳ」）は、当該ＯＳ上で動作するアプリケーションプログラムの実行ごとに、１つのプロセス（ジョブの単位）を割り当てる。そして、アプリケーションプログラムがダイナミックリンクライブラリ（dynamic link library）（以下、「ＤＬＬ」）の関数を利用する場合、ＯＳは、プロセスにＤＬＬを動的に取り込む。すなわち、ＯＳは、ＤＬＬのメモリ領域の確保、初期化、再配置などを行う。そして、アプリケーションプログラムは、再配置後のアドレスを利用して、ＤＬＬの関数の呼び出しを行う。なお、ＤＬＬは、プログラムの実行時に動的（ダイナミック）にリンクされるライブラリである。非特許文献１には、このようなＤＬＬについて記載されている。
【０００３】
また、近年、仮想マシンによるプログラム実行環境の利用が広まっている。その代表的なものに、サンマイクロシステム社によるJava(登録商標)仮想マシン、マイクロソフト社によるCLR(Common Language Runtime)がある。仮想マシンは、ＯＳ上で稼動する１つのアプリケーションプログラムとして実装されていることが多い。この場合、ＯＳは、仮想マシンによる実行環境ごとに１つのプロセスを割り当てる。そして、仮想マシンにおいては、１つの仮想マシンの実行環境（１つのプロセス）で、複数のアプリケーションプログラムを実行することができる場合がある。
【０００４】
【非特許文献１】John R. Levin, "linkers & loaders", Morgan Kaufmann Pub, 2000.
【発明の開示】
【発明が解決しようとする課題】
【０００５】
さて、ＤＬＬをプロセスに取り込む場合、ＤＬＬのロードイメージ（メモリにローディングされたロードモジュール）は、プロセスごとに作成される。そのため、ＤＬＬに含まれるグローバル変数の領域もプロセスごとに作成される。１つのプロセスで１つのアプリケーションプログラムが実行される場合、グローバル変数はアプリケーションプログラムごとに作成されるため、あるアプリケーションプログラムがグローバル変数の値を変更した場合であっても、他のアプリケーションプログラムの処理に影響を及ぼさない。
【０００６】
一方、仮想マシンのような１つのプロセス内で複数のアプリケーションプログラムが実行される環境においては、プロセス毎に１つのＤＬＬが読み込まれ、１つのグローバル変数領域が作成される。すなわち、グローバル変数領域が、プロセス内で実行される複数のアプリケーションプログラム間で共有されることになる。このような実行環境において、ＤＬＬがグローバル変数等に状態情報（ステータス）を保持する場合、あるアプリケーションプログラムによるＤＬＬの状態情報の変更が、同一プロセス内で実行中の他のアプリケーションプログラムの処理に影響を与えてしまう。すなわち、１つのプロセスで１つのアプリケーションプログラムを実行した場合と、１つのプロセスで複数のアプリケーションプログラムを実行した場合とで、処理が異なることになる。
【０００７】
本発明は上記事情を鑑みてなされたものであり、本発明の目的は、１つのプロセス内で複数のアプリケーションプログラムが実行される環境でＤＬＬを呼び出す場合において、所定のアプリケーションプログラムの処理が他のアプリケーションプログラムの処理に影響を及ぼすことを防止することにある。
【課題を解決するための手段】
【０００８】
上記課題を解決するために、本発明では、アプリケーションプログラムごとに異なるダイナミックリンクライブラリのロードイメージを作成するラッパライブラリを生成する。また、アプリケーションプログラムにおけるダイナミックリンクライブラリの呼び出しコードを、ラッパライブラリを呼び出すように変更する。
【０００９】
例えば、ダイナミックリンクライブラリを呼び出すためのダイナミックリンクライブラリ呼び出しコード生成方法であって、情報処理装置は、演算処理部と記憶部とを有する。そして、演算処理部は、記憶部に記憶されたダイナミックリンクライブラリを読み出す第１の読み出しステップと、読み出したダイナミックリンクライブラリに記述された関数にもとづいて、アプリケーションプログラム毎にダイナミックリンクライブラリのロードイメージを作成するラッパライブラリを生成する生成ステップと、記憶部に記憶されたアプリケーションプログラムを読み出す第２の読み出しステップと、アプリケーションプログラムにおいて、ダイナミックリンクライブラリを呼び出すコードを特定し、当該ダイナミックリンクライブラリの呼び出しコードを、生成したラッパライブラリを呼び出すコードに変更する変更ステップと、を行う。
【発明の効果】
【００１０】
本発明では、１つのプロセス内で複数のアプリケーションプログラムが実行される環境でＤＬＬを呼び出す場合において、所定のアプリケーションプログラムの処理が他のアプリケーションプログラムの処理に影響を及ぼすことを防止することができる。
【発明を実施するための最良の形態】
【００１１】
以下、本発明の実施の形態を説明する。
【００１２】
図１は、本発明の一実施形態が適用されたラッパライブラリ生成装置１の概略図である。本実施形態のラッパライブラリ生成装置１は、仮想マシン上で動作するプログラム毎に、ＤＬＬの領域確保し、初期化および再配置を行うダミーＤＬＬ（すなわち、ラッパライブラリ）を生成する。
【００１３】
ラッパライブラリ生成装置１は、図示するように、ラッパコード生成部１０と、呼び出しコード生成部２０と、記憶部３０と、を有する。ラッパコード生成部１０は、記憶部３０に記憶されたＤＬＬ３１を読み出し、ラッパライブラリ３４を生成する。ラッパコード生成部１０は、ＤＬＬ入力部１１と、コード生成部１２と、出力部１３と、を有する。
【００１４】
ＤＬＬ入力部１１は、ＤＬＬ３１を記憶部３０から読み出して解析し、外部関数シンボルの一覧を取得する。そして、ＤＬＬ入力部１１は、取得した各外部関数シンボルを、シンボル管理テーブル３２に記録する。外部関数シンボルは、呼び出しプログラム３５が使用可能（呼び出し可能）なＤＬＬ３１の関数である。なお、シンボル管理テーブル３２については、後述する。
【００１５】
コード生成部１２は、シンボル管理テーブル３３に登録されている外部関数シンボル毎に、ラッパコード（不図示）を作成する。なお、ラッパコードについては後述する。
【００１６】
出力部１３は、シンボル管理テーブル３２と、コード生成部１２が生成したラッパコードとにもとづいて、ラッパライブラリ３４を生成し、記憶部３０に記憶する。また、出力部１３は、ＤＬＬ３１の名称と、当該ＤＬＬ３１から生成したラッパライブラリ３４の名称とを名称対応テーブル３３に記憶する。なお、ラッパライブラリ３４および名称対応テーブル３３については、後述する。
【００１７】
呼び出しコード生成部２０は、呼び出しプログラム３５を記憶部３０から読み出して解析する。そして、呼び出しコード生成部２０は、呼び出しプログラム３５の中で、ＤＬＬ３１を呼び出しているコード（ソースコード）の部分を特定する。そして、呼び出しコード生成部２０は、特定したコード部分を、ＤＬＬ３１ではなくラッパライブラリ３４を呼び出すように変更する。そして、呼び出しコード生成部２０は、変更後の呼び出しプログラム３６を、記憶部３０に記憶する。なお、呼び出しコード生成部２０は、名称対応テーブル３３を参照し、呼び出すラッパライブラリ３４の名称を取得する。
【００１８】
記憶部３０には、ＤＬＬ３１と、シンボル管理テーブル３２と、名称対応テーブル３３と、ラッパライブラリ３４と、呼び出しプログラム３５と、変更後呼び出しプログラム３６とが記憶されている。
【００１９】
ＤＬＬ３１は、プログラムの実行時に動的（ダイナミック）にリンクされる（呼び出される）ライブラリである。ＯＳは、呼び出しプログラム３５の実行時に、当該プログラムのアドレス空間（プロセス）にＤＬＬをローディングする。
【００２０】
図２は、ＤＬＬ３１の一例を示した図である。ＤＬＬ３１は、ヘッダセクション２１と、テキストセクション２２、データセクション２３、エクスポートシンボルセクション２４とを有する。ヘッダセクション２１には、他のセクション２２、２３、２４のサイズと開始アドレスとが設定されている。
【００２１】
テキストセクション２２には、少なくとも１つの関数が定義されている。図示するテキストセクション２２には、関数「func_A」２２１と、関数「func_B」２２２と、関数「func_C」２２３とが含まれている。データセクション２３には、テキストセクション２２で定義されている各関数が使用するグローバル変数などのデータ領域が定義されている。エクスポートシンボルセクション２４には、少なくとも１つの外部に公開される外部関数シンボルの名称と、当該シンボルの仮想相対アドレスとが設定されている。
【００２２】
シンボル管理テーブル３２は、ＤＬＬ３１に定義された外部関数シンボルを管理するためのテーブルである。
【００２３】
図３は、シンボル管理テーブル３２の一例を示した図である。シンボル管理テーブル３２は、外部関数シンボル毎に、シンボル番号３２１と、シンボル名３２２と、アドレス３２３と、ラッパコード領域ポインタ３２４と、を有する。
【００２４】
シンボル番号３２１は、外部関数シンボルを識別するための識別情報である。シンボル名３３２は、外部関数シンボルの名称である。図示する例では、図２に示すＤＬＬ３１のエクスポートシンボルセクション２４に設定された外部関数シンボルの名称（「func_A」、「func_B」）が設定されている。なお、ＤＬＬ入力部１１が、シンボル番号３２１およびシンボル名称３２２を設定する。
【００２５】
アドレス３２３には、生成されるラッパライブラリ３４における外部関数シンボル毎に生成されるラッパコードのテキストセクション中での位置（アドレス）が設定される。
【００２６】
ラッパコード領域ポインタ３２４には、外部関数シンボル毎に生成されたラッパコードが記憶部３０のどの位置に格納されているかを表すポインタ情報（格納場所情報）が設定されている。なお、コード生成部１２が、アドレス３２３およびラッパコード領域ポインタ３２４を設定する。
【００２７】
名称対応テーブル３３は、ＤＬＬ３１と当該ＤＬＬから生成されたラッパライブラリ３４とを対応付けたテーブルである。
【００２８】
図４は、名称対応テーブル３３の一例を示した図である。名称対応テーブル３３は、ＤＬＬ３１の名称であるＤＬＬ名称３３１と、当該ＤＬＬ３１に対応するラッパライブラリ３４の名称３３２と、を有する。なお、本実施形態では、ラッパライブラリ名称３３２は、ＤＬＬ名称３３１の先頭に「Ｗ」を付加した名称とする。
【００２９】
呼び出しプログラム３５は、仮想マシン上で動作するアプリケーションプログラムであって、当該プログラムの実行時にＤＬＬ３１を呼び出すプログラムである。なお、呼び出しプログラムが動作する仮想マシンのソフトウェア構成については後述する。
【００３０】
変更後呼び出しプログラム３６は、呼び出しコード生成部２０が呼び出しプログラム３５を変更した後のプログラムである。ラッパライブラリ３４は、呼び出しプログラム３５（変更後の呼び出しプログラム３６）毎に、ＤＬＬ３１の領域を確保し、初期化および再配置を行うダミーのＤＬＬである。なお、呼び出しプログラム３５、変更後呼び出しプログラム３６、および、ラッパライブラリ３４については、後述する。
【００３１】
以上説明した、ラッパライブラリ生成装置１は、例えば図５に示すようなＣＰＵ９０１と、メモリ９０２と、ＨＤＤ等の外部記憶装置９０３と、キーボードやマウスなどの入力装置９０４と、モニタやプリンタなどの出力装置９０５と、ネットワーク接続するための通信制御装置９０６と、これらの各装置を接続するバス９０７と、を備えた汎用的なコンピュータシステムを用いることができる。このコンピュータシステムにおいて、ＣＰＵ９０１がメモリ９０２上にロードされた所定のプログラムを実行することにより、ラッパライブラリ生成装置１の各機能が実現される。すなわち、ラッパライブラリ生成装置１の各機能は、ラッパライブラリ生成装置１のＣＰＵ９０１が、ラッパライブラリ生成装置１用のプログラムを実行することにより実現される。この場合、ラッパライブラリ生成装置１の記憶部３０には、ラッパライブラリ生成装置１のメモリ９０２または外部記憶装置９０３が用いられる。
【００３２】
次に、仮想マシンのソフトウェア構成について説明する。仮想マシンは、ＯＳの１つのプロセス（ジョブの単位）である。そして、仮想マシンは、当該プロセス内において、複数のアプリケーションプログラムを実行することができる。なお、アプリケーションプログラムは、本実施形態における呼び出しプログラム３５（または、変更後の呼び出しプログラム３６）である。
【００３３】
図１３は、仮想マシンのソフトウェア構成の一例を示した図である。図示するように、仮想マシン６２は、ＯＳ６１上で動作する。また、仮想マシン６２上では、少なくとも１つの呼び出しプログラム３５が実行される。なお、仮想マシン６２は、メモリ管理部６２１と、型管理部６２２と、実行管理部６２３とを有する。メモリ管理部６２１は、仮想マシン上で使用されるメモリを管理する。型管理部６２２は、オブジェクト指向プログラミングにおけるクラスを管理する。実行管理部６２３は、仮想マシン上で動作する各プログラムの実行を管理する。
【００３４】
次に、ラッパライブラリ生成装置１のラッパコード生成部１０の処理を説明する。
【００３５】
図６は、ラッパコード生成部１０のＤＬＬ入力部１１およびコード生成部１２の処理フローを示したものである。まず、ＤＬＬ入力部１１は、あらかじめ記憶部３０に記憶されたＤＬＬ３１を読み出し、当該ＤＬＬ３１のエクスポートシンボルセクション２４（図２参照）に記述された外部関数シンボルの一覧を取得する（Ｓ６１）。そして、ＤＬＬ入力部１１は、取得した外部関数シンボルの名称を、シンボル管理テーブル３２のシンボル名３２２に順に登録する（Ｓ６２）。なお、ＤＬＬ入力部１１は、外部関数シンボル名をシンボル名３２２に設定する際に、各シンボル番号３２１には「１」から順に連番を設定する。
【００３６】
そして、コード生成部１２は、シンボル番号３２１およびシンボル名称３２２が設定されたシンボル管理テーブル３２の各レコードを、シンボル番号３２１の小さい順に読み出す（Ｓ６３）。そして、コード生成部１２は、読み出したレコード毎（すなわち、外部関数シンボル毎）に、所定のアルゴリズム（または、所定のテンプレート）に従って、ラッパライブラリ３４の構成要素であるラッパコードを生成する。以下、ラッパコードの生成処理を説明する。
【００３７】
コード生成部１２は、ＤＬＬのロードイメージ選択コードを作成する（Ｓ６４）。そして、コード生成部１２は、呼び出し関数のアドレス計算コードを作成する（Ｓ６５）。そして、コード生成部１２は、アドレス計算コードにより算出されたアドレスを用いて関数を呼び出す関数呼び出しコードを生成する（Ｓ６６）。Ｓ６４からＳ６６により、コード生成部１２は、ラッパコードを生成し、記憶部３０に記憶する。なお、ラッパコードの処理については、後述する。
【００３８】
そして、コード生成部１２は、シンボル管理テーブル３２の当該レコードのラッパコード領域ポインタ３２４に、記憶部３０に記憶したラッパコードの先頭アドレス（格納場所）を設定する（Ｓ６７）。
【００３９】
そして、コード生成部１２は、シンボル管理テーブル３２のアドレス３２３の設定を行なう。すなわち、コード生成部１２は、Ｓ６３で読み出したレコードが最初のレコードか（シンボル番号３２１が「１」のレコードか）否かを判別する（Ｓ６８）。最初のレコードの場合（Ｓ６８：ＹＥＳ）、コード生成部１２は、当該最初のレコードのアドレス３２３に「00000000」を設定する（Ｓ６９）。
【００４０】
一方、最初のレコードでない場合（Ｓ６８：ＮＯ）、コード生成部１２は、当該レコードの直前のレコードのアドレス３２３に設定された値を読み出す。そして、コード生成部１２は、直前のレコードのアドレス３２３の値に、Ｓ６４からＳ６６において生成した直前のレコードのパッラコードのサイズを加算する。そして、コード生成部１２は、加算した値を当該レコードのアドレス３２３に設定する（Ｓ７０）。なお、直前のレコードは、本実施形態では、当該レコードのレコード番号３２１から「１」を引いたレコード番号３２１のレコードである。
【００４１】
そして、コード生成部１２は、シンボル管理テーブル３２を読み出し、未処理のレコード（ラッパコードを生成していないレコード）が存在するか否かを判別する（Ｓ７１）。未処理のレコードが存在する場合（Ｓ７１：ＹＥＳ）、コード生成部１２は、Ｓ６３に戻りシンボル管理テーブル３２の次のレコードの処理を行う。一方、未処理のレコードが存在しない場合（Ｓ７１：ＮＯ）、後述する出力部１３の処理を行う。
【００４２】
以上説明した図６の処理を、図２に示すＤＬＬ３１を例に具体的に説明する。
【００４３】
まず、ＤＬＬ入力部１１は、ＤＬＬ３１の外部関数シンボルの一覧を取得し、図３に示すシンボル管理テーブル３２を作成する（Ｓ６１、Ｓ６２）。なお、この時点では、アドレス３２３、ラッパコード領域ポインタ３２４は空欄である。
【００４４】
そして、コード生成部１２は、シンボル管理テーブル３２の最初のレコードの関数func_Aのラッパコードを生成し記憶部３０に記憶する（Ｓ６３〜Ｓ６６）。そして、コード生成部１２は、ラッパコードの格納場所の先頭アドレス）を、関数func_Aのラッパコード領域ポインタ３２４に設定する（Ｓ６７）。そして、現在処理中の「関数func_A」は、最初のレコードであるため（Ｓ６８：ＹＥＳ）、コード生成部１２は、シンボル管理テーブル３２のアドレス３２３に「00000000」を設定する（Ｓ６９）。
【００４５】
次に、コード生成部１２は、シンボル管理テーブル３２を読み出し、未処理のレコードである関数func_Bの処理を行なう（Ｓ７１：ＹＥＳ）。コード生成部１２は、関数func_Aの処理と同様に、ラッパコードを生成し、ラッパコード領域ポインタに格納場所を設定する（Ｓ６３〜Ｓ６７）。そして、関数func_Bのレコードは最初のレコードでないため（Ｓ６８：ＮＯ）、コード生成部１２は、１つ上のレコード（関数func_A）のアドレス３２３の値「00000000」に、生成された関数func_Aのラッパコードのサイズ(ここでは、「00000100」(16進数)とする)を加算した値「00000100」を、アドレス３２３に設定する。そして、コード生成部１２は、シンボル管理テーブル３２を読み出し、次（未処理）のレコードがないため図６に示す処理を終了する。
【００４６】
次に、ラッパコード生成部１０の出力部１３の処理について説明する。
【００４７】
図７は、ラッパコード生成部１０の出力部１３の処理フローを示したものである。出力部１３は、図６の処理の後に、シンボル管理テーブル３２にもとづいて、名称対応テーブル３３およびラッパライブラリ３４を出力する。
【００４８】
まず、出力部１３は、名称対応テーブル３３（図４参照）を出力する（Ｓ７１）。すなわち、出力部１３は、図６のＳ６１において読み出したＤＬＬ３１の名称と、当該ＤＬＬ３１から生成されるラッパライブラリ名称とを、名称対応テーブル３３に設定する。なお、本実施形態では、図４に示すように、ＤＬＬ３１の名称（ｓｕｂ．ｄｌｌ）の先頭に「Ｗ」を付加した名称（Ｗｓｕｂ．ｄｌｌ）を、ラッパライブラリの名称とする。
【００４９】
そして、出力部１３は、ラッパライブラリの出力に先立って、ラッパライブラリの各セクションのサイズを算出する（Ｓ７２）。すなわち、出力部１３は、テキストセクション、データセクション、および、エクスポートシンボルセクションのサイズを算出する。なお、テキストセクションのサイズは、シンボル管理テーブル３２に登録されている全ての外部関数シンボルのラッパコードのサイズの合計である。
【００５０】
データセクションのサイズは、各ラッパコードが使用するグローバル変数領域のデータサイズの合計である。なお、本実施形態では、ＤＬＬ３１のロードイメージの管理用に３６（１６進数で２０)バイトが必要であるものとする。なお、ロードイメージは、メモリにローディングされたロードモジュールである。
【００５１】
エクスポートシンボルセクションのサイズは、外部関数シンボル名称と、当該外部関数シンボルのアドレスとを書き出すために必要な大きさである。本実施形態では、６４（１６進数で４０）バイトが必要であるものとする。
【００５２】
そして、出力部１３は、以下の処理により、例えば、図８に示すようなラッパライブラリ３４を出力する。
【００５３】
まず、出力部１３は、ヘッダセクション（図８：８１）を出力する（Ｓ７３）。すなわち、出力部１３は、Ｓ７２で算出した各セクションのサイズを記述したヘッダセクションを出力する。
【００５４】
そして、出力部１３は、テキストセクション（図８：８２）を出力する（Ｓ７４）。すなわち、出力部１３は、シンボル管理テーブル３２のラッパコード領域ポインタ３２４でポインタされている各ラッパコードを記憶部３０から順次読み出し、テキストセクションとして出力する。なお、図示する例では、関数func_Aと、関数func_Bの２つのラッパコード８２１、８２２がテキストセクションに記述されている。
【００５５】
そして、出力部１３は、データセクション（図８：８３）を出力する（Ｓ７５）。データセクションのサイズは、ラッパコード固有の値であり、図示する例では前述した３６（１６進数で２０)バイトとする。
【００５６】
そして、出力部１３は、エクスポートシンボルセクション（図８：８４）を出力する（Ｓ７６）。すなわち、出力部１３は、シンボル管理テーブル３２のシンボル名称３２２およびアドレス３２３に設定されたデータを順次エクスポートシンボルセクションに出力する。そして、出力部１３は、各セクションを出力することにより図８に示すようなラッパライブラリ３４を生成し、記憶部３０に記憶する（Ｓ７７）。
【００５７】
次に、ラッパライブラリ生成装置１の呼び出しコード生成部２０の処理を説明する。
【００５８】
図９は、呼び出しコード生成部２０の処理フローである。まず、呼び出しコード生成部２０は、記憶部３０に記憶された呼び出しプログラム３５を読み出し解析する（Ｓ９１）。そして、呼び出しコード生成部２０は、呼び出しプログラム３５の中で、ＤＬＬの関数の呼び出しに対する外部宣言を特定し、修正する（Ｓ９２）。すなわち、呼び出しコード生成部２０は、ＤＬＬ３１を呼び出しているコード（記述）を、ラッパライブラリ３４を呼び出すように変更する。そして、コード生成部２０は、呼び出しプログラム３５の識別子である引数を１つ追加する。なお、呼び出しコード生成部２０は、名称対応テーブル３３を参照して、呼び出し先を変更するラッパライブラリの名称を取得する。
【００５９】
そして、呼び出しコード生成部２０は、識別子取得関数の定義を生成し、呼び出しプログラム３５の所定の部分に追加する（Ｓ９３）。識別子取得関数は、呼び出しプログラム３５を識別するための識別子（識別情報）を返す関数である。この識別子には、例えば、呼び出しプログラム３５が動作する実行環境が識別子を提供している場合、当該識別子を利用することができる。
【００６０】
また、識別子には、例えば、呼び出しプログラムが異なれば異なるメモリ領域を占め、呼び出しプログラムが同じなら常に同じメモリ領域を示す変数のアドレスを利用することができる。
【００６１】
そして、呼び出しコード生成部２０は、呼び出しプログラム３５の中から、ＤＬＬ３１の関数の呼び出しコード（例えば、ｃａｌｌ文）を特定する。そして、呼び出しコード生成部２０は、特定した呼び出しコードの直前に、Ｓ９３で生成した識別子取得関数の呼び出しコード（例えば、ｃａｌｌ文）を追加する（Ｓ９４）。そして、呼び出しコード生成部２０は、Ｓ９２からＳ９４で変更した変更後の呼び出しプログラム３６を出力し、記憶部３０に記憶する（Ｓ９５）。
【００６２】
次に、呼び出しプログラム３５、および、当該呼び出しプログラム３５に図９に示す処理を実行した変更後の呼び出しプログラム３６を説明する。
【００６３】
図１０は、呼び出しプログラム３５の一例を示したものである。図示する呼び出しプログラム３５は、ＤＬＬに含まれる関数func_Aを呼び出す関数呼出メソッド１０ａと、関数func_Aに対する外部宣言１０ｂとを有する。
【００６４】
図１１は、変更後の呼び出しプログラム３６の一例を示したものである。図示する呼び出しプログラム３５は、関数func_Aを呼び出す関数呼出メソッド１１ａと、func_Aに対する外部宣言１１ｂと、識別子取得関数１１ｃと、を有する。
【００６５】
呼び出しコード生成部２０は、関数func_Aの外部宣言（図１１：１１ｂ）において、ラッパライブラリ１１１を呼び出すように変更する。また、呼び出しコード生成部２０は、関数func_Aの外部宣言において、呼び出しプログラム３５の識別子である引数１１２を１つ追加する。なお、図示する例では、追加する引数は３２ビット整数型としている。
【００６６】
また、呼び出しコード生成部２０は、識別子取得関数１１ｃを生成する。また、呼び出しコード生成部２０は、関数呼出メソッド１１ａにおいて、関数 func_Aの呼び出しコードの直前に、識別子取得関数１１ｃを呼び出すＣａｌｌ文１１３を追加する。これにより、変更後の呼び出しプログラム３６は、識別子取得関数１１ｃを呼び出すことにより取得したプログラムの識別子を、関数func_Aの追加した引数の値とする。
【００６７】
以上説明したラッパコード生成部１０、および、呼び出しコード生成部２０の処理によりラッパライブラリ３４および変更後の呼び出しプログラム３６が生成される。変更後の呼び出しプログラム３６は、図１３に示すような仮想マシン上で実行され、生成されたラッパライブラリ３４を呼び出す。以下に変更後の呼び出しプログラム３６の実行時に呼び出されたラッパライブラリ３４の処理を説明する。
【００６８】
図１２は、ロードイメージ選択コードの処理フローである。なお、ロードイメージ選択コードは、外部関数シンボル毎に作成されるラッパコードの中の、図６のＳ６４で生成されるコードである。また、ラッパコードは、ラップ対象の外部関数シンボルに対して、変更後の読み出しプログラム３６を識別するための識別子を引数として追加したインタフェースを有する。
【００６９】
まず、ロードイメージ選択コードは、呼び出された変更後の読み出しプログラム３６の識別子を取得し、当該識別子に対するＤＬＬ３１のロードイメージがプロセスに作成済みか否かを判別する（Ｓ１２１）。なお、ＤＬＬ３１のロードイメージを作成した識別子については、後述するＳ１２４の処理により登録されているものとする。
【００７０】
ＤＬＬ３１のロードイメージが作成されていない場合（Ｓ１２１：ＮＯ）、ロードイメージ選択コードは、ＤＬＬ３１をメモリに展開し(Ｓ１２２)、再配置する(Ｓ１２３)ことにより、ロードイメージを作成する。そして、ロードイメージ選択コードは、作成したロードイメージと、当該識別子とを対応付けて登録（記憶）する（Ｓ１２４）。
【００７１】
一方、ＤＬＬ３１のロードイメージが既に作成済みの場合（１２１：ＹＥＳ）、ロードイメージ選択コードは、当該ロードイメージを取得する（Ｓ１２５）。なお、ＤＬＬ３１のメモリへの展開（Ｓ１２２）および再配置（Ｓ１２３）については、非特許文献１に詳しく述べられている。
【００７２】
次に、図６のＳ６５において生成される呼び出し関数のアドレス計算コードは、ＤＬＬ３１のエクスポートシンボルセクション（図２参照）を参照し、当該ラッパコードの外部関数シンボルのの仮想相対アドレスを取得する。そして、取得した仮想相対アドレスとロードイメージの先頭アドレスとから、実際の関数アドレスを算出する。
【００７３】
そして、図６のＳ６６において生成される関数呼び出しコードは、アドレス計算コードが算出した実際の関数アドレスを用いて、ＤＬＬ３１のロードイメージ中の関数の呼び出しを行なう。
【００７４】
以上、本発明の一実施形態について説明した。
【００７５】
本実施形態では、ラッパライブラリ生成装置１は既存のＤＬＬ３１を解析し、当該ＤＬＬ３１のラッパライブラリ３４を生成する。また、ラッパライブラリ生成装置１は既存の呼び出しプログラム３５から、ラッパライブラリ３４を呼び出す変更後の呼び出しプログラム３６を生成する。この変更後の呼び出しプログラム３６を実行することにより、ラッパライブラリ３４が呼び出され、変更後の呼び出しプログラム３６毎にＤＬＬ３１のロードイメージを作成することができる。
【００７６】
また、ラッパライブラリ３４は、アプリケーションプログラム（呼び出しプログラム）毎にＤＬＬ３１のロードイメージを作成する。これにより、１つのプロセス内で複数のアプロケーションプログラムが動作する実行環境であっても、所定のアプリケーションプログラムの処理が他のアプリケーションプログラムの処理に影響を及ぼすことを防止することができる。
【００７７】
また、ラッパライブラリ生成装置１がラッパライブラリ３４および変更後の呼び出しプログラム３６を自動生成することにより、１つのプロセス内で複数のアプリケーションプログラムが動作する実行環境においても、既存のシステムのリソース（ＤＬＬ３１、呼出プログラム３５）を有効活用することができる。
【００７８】
なお、本発明は上記の実施形態に限定されるものではなく、その要旨の範囲内で数々の変形が可能である。
【００７９】
例えば、上記実施形態では、ラッパライブラリ生成装置１が、あらかじめラッパライブラリ３４および変更後の呼び出しプログラム３６を生成する。しかしながら、本発明は、呼び出しプログラム３５の実行時に、動的にラッパライブラリ３４および変更後の呼び出しプログラム３６を生成してもよい。この場合、図１に示すラッパライブラリ生成装置１の各機能は、図１３に示す仮想マシンの実行管理部６２３において実装される。以下に、実行管理部６２３の処理について説明する。
【００８０】
図1４は、実行管理部６２３の処理フローを示したものである。まず、実行管理部６２３は、現在の処理対象の命令がＤＬＬ３１で定義される関数の呼び出しか否かを判定する（Ｓ１４１）。ＤＬＬ３１の呼び出しでない場合（Ｓ１４１：ＮＯ）、実行管理部６２３は、一般的なコード生成処理を実行する（Ｓ１４５）。
【００８１】
一方、ＤＬＬ３１の呼び出しの場合（Ｓ１４１：ＹＥＳ）、実行管理部６２３は、入力手段９０４や、実行時オプションや、ファイルなどの手段により入力されたユーザの指示を受け付け、ラッパコードを生成するか否かを判別する（Ｓ１４２）。ラッパコード生成指示を受け付けた場合（Ｓ１４２：ＹＥＳ）、実行管理部６２３は、識別子取得関数呼び出しコードを生成する（Ｓ１４３）。なお、Ｓ１４３の処理は、呼び出しコード生成部２０が図９のＳ９３において識別子取得関数コードを生成する処理と同様である。そして、実行管理部６２３は、ラッパコードを生成する（Ｓ１４４）。なお、Ｓ１４４の処理は、コード生成部１２が、図６のＳ６４からＳ６６においてラッパコードを生成する処理と同様である。一方、ラッパコード生成指示を受け付けない場合（Ｓ１４２：ＮＯ）、実行管理部６２３は、一般的なコード生成処理を行う（Ｓ１４５）。
【００８２】
なお、Ｓ１４２のラッパコードを生成する否かの処理を省略して、全てのＤＬＬ３１をラップの対象にすることもできる。また、呼び出しプログラム３５の実行前に、ラッパコード生成部１０があらかじめラッパライブラリ３４を作成し、Ｓ１４４のラッパコード生成処理を省略することもできる。
【００８３】
また、上記実施形態では、ＤＬＬを呼び出すプログラム毎に、ＤＬＬ全体のロードイメージを作成する。しかしながら、本発明は、ＤＬＬを呼び出すプログラム毎に、ロードイメージの一部を作成することとしてもよい。
【００８４】
すなわち、ＤＬＬの一部の領域が１つのプロセス内で動作する複数のプログラム間で共有可能な構成の場合、ラッパライブラリは、プログラム間で共有不可能な領域のみのロードイメージをプログラム毎に作成することとしてもよい。
【００８５】
図１５は、ロードイメージ選択コードの処理フローである。なお、上記実施形態におけるロードイメージ選択コードの処理フロー（図１２参照）に相当する処理である。なお、ここでは、ＤＬＬ３１のテキストセクション２２はプログラム間で共有可能な領域（以下、「共有部分」）であって、データセクション２３はプログラム間で共有不可能な領域（以下、「非共有部分」）とする。
【００８６】
まず、ロードイメージ選択コードは、テキストセクション２２（共有部分）のロードイメージが作成済みか否かを判定する（Ｓ１５１）。テキストセクション２２のロードイメージが作成済みの場合（Ｓ１５１：ＹＥＳ）、ロードイメージ選択コードは、当該ロードイメージを取得する（Ｓ１５２）。一方、テキストセクション２２のロードイメージが未作成の場合（Ｓ１５１：ＮＯ）、ロードイメージ選択コードは、テキストセクションをメモリに展開してロードイメージを作成し、当該ロードイメージを記録する（Ｓ１５３）。
【００８７】
そして、ロードイメージ選択コードは、変更後の読み出しプログラム３６の識別子を取得し、当該識別子に対する非共有部分のロードイメージがプロセスに作成済みか否かを判別する（Ｓ１５４）。作成済みの場合（Ｓ１５４：ＹＥＳ）、ロードイメージ選択コードは、当該ロードイメージを取得する（Ｓ１５５）。一方、非共有部分のロードイメージが未作成の場合（Ｓ１５４：ＮＯ）、ロードイメージ選択コードは、非共有部分をメモリへ展開し（Ｓ１５６）、再配置を行う（Ｓ１５７)。そして、ロードイメージ選択コードは、作成したロードイメージと、当該識別子とを対応付けて登録（記憶）する（Ｓ１５８）。そして、ロードイメージ選択コードは、アドレステーブルの先頭テーブルを、間接参照用のベースレジスタにロードする（Ｓ１５９）。
【００８８】
次に、ＤＬＬ３１のテキストセクション２２が非共有部分の場合のロードイメージ選択コードの処理を説明する。
【００８９】
図１６は、テキストセクションが非共有部分の場合の、ロードイメージ選択コードの処理フローである。図１６に示す処理フローは、以下の点において図１５に示す処理フローと異なる。すなわち、データのアドレステーブルの作成（Ｓ１６３）が追加されている点が、図１５に示す処理フローと異なる。また、図１５のＳ１５３に相当するＳ１６４の処理において、テキストセクションをメモリに展開するだけでなく、テキストセクションのデータの参照部分をデータのアドレステーブルを用いた間接参照に修正する点が異なる。これにより、テキストセクションを位置独立コードに修正することができ、プロセス内で動作する複数のプログラム間で共有可能なコードとなる。また、Ｓ１６３で作成したアドレステーブルは、非共有部分となる。そのため、Ｓ１６８において、データのアドレステーブルをメモリに展開し、アドレステーブルの再配置を行う点が異なる。
【図面の簡単な説明】
【００９０】
【図１】図１は、本発明の一実施形態が適用されたラッパライブラリ生成装置の概略構成図である。
【図２】図２は、ダイナミックリンクライブラリの一例を示す図である。
【図３】図３は、シンボル管理テーブルの一例を示す図である。
【図４】図４は、名称対応テーブルの一例を示す図である。
【図５】図５は、ラッパライブラリ生成装置のハードウェア構成を示す図である。
【図６】図６は、ＤＬＬ入力部およびコード生成部の処理フローを示す図である。
【図７】図７は、出力部の処理フローを示す図である。
【図８】図８は、ラッパライブラリの一例を示す図である。
【図９】図９は、呼び出しコード生成部の処理フローを示す図である。
【図１０】図１０は、呼び出しプログラムの一例を示す図である。
【図１１】図１１は、変更後の呼び出しプログラムの一例を示す図である。
【図１２】図１２は、ロードイメージ選択コードの処理フローを示す図である。
【図１３】図１３は、仮想マシンのソフトウェア構成の一例を示す図である。
【図１４】図１４は、プログラム実行時にラッパコードを生成する場合の処理フローを示す図である。
【図１５】図１５は、ロードイメージの一部を作成する場合の第１のロードイメージ選択コードの処理フローを示す図である。
【図１６】図１６は、ロードイメージの一部を作成する場合の第２のロードイメージ選択コードの処理フローを示す図である。
【符号の説明】
【００９１】
１：ラッパライブラリ生成装置、１０：ラッパコード生成部、１１：ＤＬＬ入力部、１２：コード生成部、１３：出力部、２０：呼び出しコード生成部、３０：記憶部、３１：ダイナミックリンクライブラリ、３２：シンボル管理テーブル、３３：名称対応テーブル、３４：ラッパライブラリ、３５：呼び出しプログラム、３６：変更後呼び出しプログラム
【図１】
2006113935.tif 000003
【図２】
2006113935.tif 000004
【図３】
2006113935.tif 000005
【図４】
2006113935.tif 000006
【図５】
2006113935.tif 000007
【図６】
2006113935.tif 000008
【図７】
2006113935.tif 000009
【図８】
2006113935.tif 000010
【図９】
2006113935.tif 000011
【図１０】
2006113935.tif 000012
【図１１】
2006113935.tif 000013
【図１２】
2006113935.tif 000014
【図１３】
2006113935.tif 000015
【図１４】
2006113935.tif 000016
【図１５】
2006113935.tif 000017
【図１６】
2006113935.tif 000018