(57)【特許請求の範囲】
【請求項１】
メモリと、
プログラムローダにより修正前のプログラムと修正後のプログラムとを前記メモリにロードし、ダイナミックリンカにより前記修正後のプログラムの実行に用いられるライブラリを前記メモリにロードし、前記メモリにロードされた前記修正前のプログラムに対するデータ領域に、前記修正前のプログラムの実行中断時の情報を書き込み、前記情報に基づいて、前記修正前のプログラムの実行を中断した第１の位置に対応する前記修正後のプログラム上の第２の位置から、前記修正後のプログラムの実行を開始するプロセッサと、
を有する情報処理装置。
【請求項２】
前記プロセッサは、前記修正前のプログラムの第１のアドレスを基準とした前記データ領域の第１のオフセットに基づいて、前記修正後のプログラムの第２のアドレスを基準とした前記データ領域の第２のオフセットを算出する、請求項１記載の情報処理装置。
【請求項３】
前記プロセッサは、前記修正後のプログラムに対するグローバルオフセットテーブルに前記第２のオフセットを追加し、前記修正後のプログラムの実行に応じて前記グローバルオフセットテーブルから前記第２のオフセットを取得し、前記第２のオフセットに基づいて前記データ領域にアクセスする、請求項２記載の情報処理装置。
【請求項４】
前記プロセッサは、前記データ領域に含まれる複数のデータそれぞれの前記第１のオフセットに基づいて、前記複数のデータそれぞれの前記第２のオフセットを算出する、請求項２または３の何れか１項に記載の情報処理装置。
【請求項５】
前記プロセッサは、前記修正前のプログラムの実行中断時の前記情報を前記データ領域に書き込むことで、前記修正前のプログラムの実行中断時における実行バイナリのイメージを前記メモリに復元する、請求項１乃至４の何れか１項に記載の情報処理装置。
【請求項６】
前記プロセッサは、前記修正後のプログラムにより参照される複数のデータそれぞれに対して、前記メモリにおけるアクセス先を、前記修正前のプログラムの第１のデータ領域とするか、または、前記修正後のプログラムの第２のデータ領域とするかを決定する、請求項１乃至５の何れか１項に記載の情報処理装置。
【請求項７】
コンピュータに、
プログラムローダにより修正前のプログラムと修正後のプログラムとがメモリにロードされた後、前記修正後のプログラムの実行に用いられるライブラリを前記メモリにロードし、
前記メモリにロードされた前記修正前のプログラムに対するデータ領域に、前記修正前のプログラムの実行中断時の情報を書き込み、前記情報に基づいて、前記修正前のプログラムの実行を中断した第１の位置に対応する前記修正後のプログラム上の第２の位置から、前記修正後のプログラムの実行を開始する、
処理を実行させるダイナミックリンクプログラム。
【請求項８】
コンピュータが、
プログラムローダにより、修正前のプログラムと修正後のプログラムとをメモリにロードし、
ダイナミックリンカにより、前記修正後のプログラムの実行に用いられるライブラリを前記メモリにロードし、前記メモリにロードされた前記修正前のプログラムに対するデータ領域に、前記修正前のプログラムの実行中断時の情報を書き込み、前記情報に基づいて、前記修正前のプログラムの実行を中断した第１の位置に対応する前記修正後のプログラム上の第２の位置から、前記修正後のプログラムの実行を開始する、
プログラム再開方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は情報処理装置、ダイナミックリンクプログラムおよびプログラム再開方法に関する。
【背景技術】
【０００２】
メモリとプロセッサとを備えるコンピュータを用いて種々のソフトウェアが利用されている。ソフトウェアのプログラムを実行する際、コンピュータは、２次記憶装置（ＨＤＤ（Hard Disk Drive）など）に格納された実行可能形式のプログラム（実行バイナリと称することもある）をメモリにロードする。コンピュータは、メモリにロードされたプログラムを実行し、所定の機能を発揮する。ここで、プログラムの実行を効率化する種々の方法が考えられている。
【０００３】
例えば、コンピュータが、実行バイナリ中で使用されない領域を実行バイナリのアドレス解決情報から検出し、該当の領域を実行バイナリのロード時に削除することで、実行バイナリイメージのデータ量を減らす提案がある。
【０００４】
また、プロセス管理システムが、クラッシュ時のプロセスの再実行に用いるデータを保持する記憶領域を予め用意し、クラッシュがデータに起因しないときは当該プロセスを再実行し、データに起因するときは当該プロセスで用いたデータを初期化する提案もある。
【０００５】
また、コンピュータによりプログラム中に実行フェーズを複数定義し、実行フェーズ毎に復元するデータを予め用意し、再開した実行フェーズに応じてデータの再読み込みや再設定処理を行うことで途中フェーズから実行を再開する提案もある。
【０００６】
なお、主記憶装置の一部である不揮発性記憶部に予め記憶された主記憶イメージからシ
ステムの起動を行うことで、計算機システムの高速起動を実現する提案もある。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】国際公開第２００７／０２６４８４号
【特許文献２】特開２００６−６５４４０号公報
【特許文献３】特表２０１４−５０９０１２号公報
【特許文献４】特開２００５−１０８９７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
ところで、コンピュータの運用では、プログラムの実行中に、プログラムの誤りが発見され、プログラムの修正を行うことがある。プログラムの修正に伴って、修正前のプログラムの実行を中断し、修正後のプログラムを用いて処理を再実行することになる。このとき、修正後のプログラムを用いて処理を最初から再実行すると、再実行に伴う計算資源や時間の無駄が大きいという問題がある。
【０００９】
これに対し、例えば、中断時と再開時とで実行対象のプログラムが同じであれば、中断時のプログラム、データおよび実行時のレジスタなどの状態を補助記憶装置に保持し、保存した状態からプログラムを再開することも考えられる。ところが、プログラムの修正を行う場合、中断時と再開時とでプログラムの内容が変更される。したがって、修正後では、修正前と比べて実行バイナリの内部構造が変わっており、実行コードであるテキスト情報やデータの配置が異なる。このため、修正前のプログラムの中断時の状態を修正後のプログラムにおいて単純に引き継ぐことはできない。
【００１０】
１つの側面では、本発明は、プログラムを修正した後、中断位置から再開可能にすることを目的とする。
【課題を解決するための手段】
【００１１】
１つの態様では、情報処理装置が提供される。この情報処理装置は、メモリとプロセッサとを有する。プロセッサは、プログラムローダにより修正前のプログラムと修正後のプログラムとをメモリにロードし、ダイナミックリンカにより修正後のプログラムの実行に用いられるライブラリをメモリにロードし、メモリにロードされた修正前のプログラムに対するデータ領域に、修正前のプログラムの実行中断時の情報を書き込み、当該情報に基づいて、修正前のプログラムの実行を中断した第１の位置に対応する修正後のプログラム上の第２の位置から、修正後のプログラムの実行を開始する。
【００１２】
また、１つの態様では、ダイナミックリンクプログラムが提供される。このダイナミックリンクプログラムは、コンピュータに、プログラムローダにより修正前のプログラムと修正後のプログラムとがメモリにロードされた後、修正後のプログラムの実行に用いられるライブラリをメモリにロードし、メモリにロードされた修正前のプログラムに対するデータ領域に、修正前のプログラムの実行中断時の情報を書き込み、当該情報に基づいて、修正前のプログラムの実行を中断した第１の位置に対応する修正後のプログラム上の第２の位置から、修正後のプログラムの実行を開始する、処理を実行させる。
【００１３】
また、１つの態様では、プログラム再開方法が提供される。このプログラム再開方法では、コンピュータが、プログラムローダにより、修正前のプログラムと修正後のプログラムとをメモリにロードし、ダイナミックリンカにより、修正後のプログラムの実行に用いられるライブラリをメモリにロードし、メモリにロードされた修正前のプログラムに対するデータ領域に、修正前のプログラムの実行中断時の情報を書き込み、当該情報に基づいて、修正前のプログラムの実行を中断した第１の位置に対応する修正後のプログラム上の第２の位置から、修正後のプログラムの実行を開始する。
【発明の効果】
【００１４】
１つの側面では、プログラムを修正した後、中断位置から再開できる。
【図面の簡単な説明】
【００１５】
【図１】第１の実施の形態の情報処理装置を示す図である。
【図２】第２の実施の形態のサーバのハードウェア例を示す図である。
【図３】サーバのソフトウェア例を示す図である。
【図４】実行バイナリの生成例を示す図である。
【図５】ＧＯＴに追加される情報の例を示す図である。
【図６】ＧＯＴの例を示す図である。
【図７】記憶部に格納される情報の例を示す図である。
【図８】プログラムローダ処理の例を示す図である。
【図９】アプリケーション初期化処理の例を示す図である。
【図１０】ダイナミックリンカ初期化処理の例を示す図である。
【図１１】ダイナミックリンカ初期化処理の例（続き）を示す図である。
【図１２】実行イメージ記録処理の例を示す図である。
【図１３】ＧＯＴのオフセット更新の例を示す図である。
【図１４】修正後のプログラムによるデータアクセスの例を示す図である。
【図１５】プログラムの実行イメージの比較例を示す図である。
【図１６】ダイナミックリンカ初期化処理の他の例を示すフローチャートである。
【図１７】データ領域のアンマップの例を示す図である。
【図１８】実行イメージ記録処理の他の例を示すフローチャートである。
【図１９】修正後のプログラムによるデータアクセスの他の例を示す図である。
【発明を実施するための形態】
【００１６】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の情報処理装置を示す図である。情報処理装置１は、プログラムを実行する。情報処理装置１は、メモリ１ａとプロセッサ１ｂとを有する。情報処理装置１は、コンピュータと呼ばれてもよい。
【００１７】
メモリ１ａは、情報処理装置１の主記憶装置である。メモリ１ａは、ＲＡＭ（Random Access Memory）でもよい。プロセッサ１ｂは、情報処理装置１の演算装置である。プロセッサ１ｂは、ＣＰＵ（Central Processing Unit）でもよい。プロセッサ１ｂは、複数のプロセッサの集合（マルチプロセッサ）でもよい。
【００１８】
情報処理装置１は、記憶装置２に接続されている。記憶装置２は、ＨＤＤなどの不揮発性の記憶装置であり、情報処理装置１の補助記憶装置（２次記憶装置と呼ばれることもある）である。記憶装置２は、情報処理装置１に外付けされてもよいし、情報処理装置１に内蔵されてもよい。記憶装置２は、情報処理装置１により実行されるプログラムを記憶する。プログラムは、実行形式のデータ（実行バイナリと称することがある）として情報処理装置１により予め作成される。実行形式には、例えば、ＥＬＦ（Executable and Linkable Format）がある。ただし、ＥＸＥ、ＣＯＦＦ（Common Object File Format）またはＰＥＦ（Preferred Executable Format）などの他の実行形式でもよい。また、記憶装置２は、プログラムの実行に用いられる各種のライブラリ（静的共有ライブラリや動的共有ライブラリ）を記憶する。
【００１９】
プロセッサ１ｂは、記憶装置２に記憶されたプログラムを、メモリ１ａに格納し（ロードし）、実行する。プロセッサ１ｂは、プログラムのロードに、プログラムローダの機能を用いる。プログラムローダは、新たに実行開始するプログラムをメモリ１ａにロードするプログラムである。また、プロセッサ１ｂは、実行対象のプログラムのロード時に、当該プログラムで利用されるライブラリ（動的共有ライブラリ）をメモリ１ａにロードする。プロセッサ１ｂは、ライブラリのロードに、ダイナミックリンカの機能を用いる。ダイナミックリンカは、プログラムのロード時に、当該プログラムで利用されるライブラリをロードし、該当のプログラムからライブラリを利用できるように所定の設定（動的リンク処理）を行うプログラムである。
【００２０】
ここで、あるプログラムを情報処理装置１により実行している最中に、該当のプログラムを修正することがある。例えば、プログラムの未実行部分のコードに誤りが発見された場合が考えられる。実行中のプログラムを修正する場合、情報処理装置１は、修正前のプログラムの実行を中断し、修正後のプログラムで処理を最初から再実行することも考えられる。
【００２１】
しかし、処理を最初から再実行すると、修正前のプログラムの実行が無駄になり、処理の完了が遅れる。例えば、実行開始から実行完了までに３カ月を要するプログラムを考える。この場合、最初の１カ月が経過したタイミングで、プログラムの誤りが修正され、情報処理装置１が修正後のプログラムを最初から再実行したとすると、処理の完了は、当該タイミングから更に３カ月後となる。すなわち、実行完了が当初よりも１カ月遅延する。そこで、情報処理装置１は、修正後のプログラムによって修正前のプログラムの処理結果を再利用し、プログラム実行の効率を改善する機能を提供する。
【００２２】
プロセッサ１ｂは、修正前のプログラムの実行中に、修正のために当該プログラムの実行を中断する。プロセッサ１ｂは、修正前のプログラムの中断時の実行イメージ３を記憶装置２に保存する。ここで、実行イメージは、メモリ１ａにロードされている実行バイナリのイメージである。プログラムの実行イメージは、プログラムのコード本体であるプログラムコード、および、当該プログラムコードにより参照されるデータを格納するデータ領域を含む。実行イメージ（および実行バイナリ）に含まれる関数やデータはシンボルと呼ばれる抽象的な名前により識別される。
【００２３】
例えば、実行イメージ３は、プログラムコード３ａおよびデータ領域３ｂを含む。実行中断時において、データ領域３ｂは、データｄ１を含む。プロセッサ１ｂは、実行イメージ３を記憶装置２に保存しておくことで、修正前のプログラムの中断時の状態を保持できる。特に、プロセッサ１ｂは、実行イメージ３に含まれるデータｄ１の実行イメージ３内での相対的な配置アドレスを維持できる。
【００２４】
なお、プロセッサ１ｂは、修正前のプログラムの実行中断時に、当該プログラムの状態を示す情報として、当該プログラムの中断時の実行位置（メモリ１ａ上のアドレス）などを示すレジスタ情報（プログラムポインタやスタックポインタ）も記憶装置２に格納する。また、プロセッサ１ｂは、実行イメージ３のメモリ１ａ上における先頭アドレスの情報も記憶装置２に格納する。更に、プロセッサ１ｂは、修正前のプログラムの実行中断時に、メモリ１ａにおける当該プログラムのスタック領域の内容やヒープ領域の内容も記憶装置２に格納する。
【００２５】
また、記憶装置２は、実行イメージ３の他にも、修正前のプログラムに対して修正を行った修正後のプログラムを記憶する。情報処理装置１が当該修正を行い、修正後のプログラムを記憶装置２に格納してもよい。例えば、ユーザは、情報処理装置１を用いて、ソースプログラムの記述を変更する。プロセッサ１ｂは、ソースプログラムに対してコンパイル処理を実行することでオブジェクトデータを生成する。プロセッサ１ｂは、オブジェクトデータに対してリンク処理を実行することで、修正後のプログラムに相当する実行バイナリを生成し、記憶装置２に格納する。
【００２６】
プロセッサ１ｂは、修正後のプログラムの実行を開始する際、プログラムローダにより、修正前のプログラム、および、修正後のプログラムを、メモリ１ａにロードする。ここで、修正後のプログラムの実行イメージを、実行イメージ４とする。実行イメージ４は、プログラムコード４ａおよびデータ領域４ｂを含む。ここで、各プログラムのメモリ１ａ上の配置アドレスは、ロード時に決定される（位置独立実行形式）。このため、同じプログラムでもロードのたびに配置アドレスは変わる。また、修正前のプログラムの実行イメージもメモリ１ａに格納されることになるが、当該修正前のプログラムの実行イメージのデータ領域には中断時の状態が未だ反映されていない。
【００２７】
プロセッサ１ｂは、プログラムローダによる修正前のプログラムおよび修正後のプログラムのロード後に、ダイナミックリンカにより修正後のプログラムの実行に用いられるライブラリをメモリ１ａにロードする。プロセッサ１ｂは、記憶装置２に記憶された実行イメージ３に基づいて、メモリ１ａにロードされた修正前のプログラムに対するデータ領域３ｂに、修正前のプログラムの実行中断時の情報を書き込む。すると、例えば、データ領域３ｂに、修正前のプログラムの中断時に保持されていたデータｄ１が復元される。こうして、プロセッサ１ｂは、メモリ１ａ上に、修正前のプログラムの中断時の実行イメージである実行イメージ３を復元する。
【００２８】
プロセッサ１ｂは、メモリ１ａ上のデータ領域３ｂに格納された中断時の情報に基づいて、修正前のプログラムの実行を中断した第１の位置に対応する修正後のプログラム上の第２の位置から、修正後のプログラムの実行を開始する。ここで、例えば、プロセッサ１ｂは、修正前のプログラムの実行中断時における実行イメージ３内の相対的な実行位置（相対アドレス）を、中断時における実行イメージ３の先頭アドレスと、中断時に取得したプログラムポインタが示すアドレスとを用いて算出する。プロセッサ１ｂは、実行イメージ４の先頭アドレスに、算出した相対アドレスを加算することで、上記第２の位置に相当するメモリ１ａ上のアドレスを取得することができる。
【００２９】
そして、プロセッサ１ｂは、実行イメージ４に対して、修正前のプログラムの中断時におけるスタックポインタ、スタック領域およびヒープ領域などの内容を適用し、データ領域３ｂを参照しながら、第２の位置から修正後のプログラムの実行を開始する。なお、この場合に、プロセッサ１ｂは、修正前のプログラムを実行しない。実行イメージ３をメモリ１ａ上に配置する理由は、データ領域３ｂ内の各データを修正後のプログラムにより適切に利用可能とするためである。
【００３０】
特に、プロセッサ１ｂは、プログラムコード４ａの実行において、データ領域３ｂ内の各データの参照を適切に行える。理由は次の通りである。データ領域３ｂに含まれる各データの実行イメージ３内での相対的な配置アドレスは、中断時の状態で維持されている。このため、プロセッサ１ｂは、実行イメージ４の先頭アドレスに対するデータ領域３ｂ内の各データの相対アドレス（オフセット）を、プログラムコード４ａの処理において参照可能なメモリ１ａ上の所定の領域に設定することができる。例えば、プロセッサ１ｂは、データ領域３ｂ内の各データのシンボルと当該オフセットとの対応関係を示すオフセットテーブル５を作成し、プログラムコード４ａから参照可能な領域に配置してもよい。そうすれば、プロセッサ１ｂは、プログラムコード４ａの処理において、オフセットテーブル５に基づき、実行イメージ４の先頭アドレスに対してオフセットを適用し、データ領域３ｂ内の各データ（例えば、データｄ１）の絶対アドレスを取得し、アクセスできる。
【００３１】
ここで、オフセットテーブル５は、実行イメージ４に対して作成されたグローバルオフセットテーブル（ＧＯＴ：Global Offset Table）でもよい。ＧＯＴは、主に、実行中のプログラムから動的共有ライブラリ内のシンボルにアクセスするために用いられるテーブルである。ＧＯＴは、ダイナミックリンカにより作成される。
【００３２】
例えば、ダイナミックリンカ（ダイナミックリンクプログラム）に、オフセットテーブル５の情報を含むＧＯＴを作成する機能を組み込んでもよい。その場合、プロセッサ１ｂは、修正前のプログラムを実行するための動的リンク処理の際に、修正前のプログラムのＧＯＴに、実行イメージ３の先頭アドレスに対するデータ領域３ｂ内の各データの相対アドレスを記録しておく。そして、プロセッサ１ｂは、修正前のプログラムの実行中断時に、当該ＧＯＴも記憶装置２に格納する。そうすれば、プロセッサ１ｂは、修正後のプログラムの動的リンク処理の際に、記憶装置２に記憶されたＧＯＴ、および、その時点での実行イメージ３，４の配置アドレスから、オフセットテーブル５に相当する情報を作成することができる。
【００３３】
このように、情報処理装置１によれば、プログラムの実行を中断して、プログラムの修正を行った場合でも、修正後のプログラムにより、修正前のプログラムの処理結果を適切に参照して処理を開始できる。プロセッサ１ｂは、修正前のプログラムによる処理済のコード部分に対応する修正後のプログラムのコード部分を実行しなくてよいため、修正後のプログラムを最初から再実行するよりも、修正後のプログラムの実行完了までの時間を短縮できる。
【００３４】
ここで、例えば、デバッガなどを用いて、修正後のプログラムコードを実行中のプログラムから呼び出せるようにロード後にメモリ１ａの内容を書き換えるなどの作業を行って、中断時のデータを再利用することも考えられる。しかし、この場合の書き換えでは、アセンブラレベルでの命令の書き換えを要する。すなわち、プログラム開発者やプログラムの利用者に対して高度な技術が求められ、このような作業を伴うデータの再利用方法は限られたユーザでしか利用できず、多数のユーザが利用する環境には適さない。
【００３５】
これに対し、情報処理装置１では、上記のように、ＧＯＴなどの仕組みを用いてデータの再利用を行えるようにすることで、プログラム開発者などにメモリ１ａの内容を書き換える作業を強いずに済むという利点もある。また、プログラムを効率的に実行する仕組みをユーザにとって利用し易くすることで、情報処理装置１の利用効率の向上を図れる。
【００３６】
以下では、情報処理装置１の一例として、ソフトウェアの開発を支援するサーバコンピュータ（サーバと称することがある）を例示する。
［第２の実施の形態］
図２は、第２の実施の形態のサーバのハードウェア例を示す図である。サーバ１００は、ＣＰＵ１０１、ＲＡＭ１０２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、媒体リーダ１０６および通信インタフェース１０７を有する。各ユニットはサーバ１００のバスに接続されている。
【００３７】
ＣＰＵ１０１は、サーバ１００の情報処理を制御する演算装置である。ＣＰＵ１０１は、マルチプロセッサでもよい。
ＲＡＭ１０２は、サーバ１００の主記憶装置である。ＲＡＭ１０２は、ＣＰＵ１０１に実行させるＯＳ（Operating System）のプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。また、ＲＡＭ１０２は、ＣＰＵ１０１による処理に用いる各種データを記憶する。
【００３８】
ＨＤＤ１０３は、サーバ１００の補助記憶装置である。ＨＤＤ１０３は、内蔵の磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３は、ＯＳのプログラム、アプリケーションプログラム、および各種データを記憶する。サーバ１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
【００３９】
画像信号処理部１０４は、ＣＰＵ１０１からの命令に従って、サーバ１００に接続されたディスプレイ１１に画像を出力する。ディスプレイ１１としては、ＣＲＴ（Cathode Ray Tube）ディスプレイや液晶ディスプレイなどを用いることができる。
【００４０】
入力信号処理部１０５は、サーバ１００に接続された入力デバイス１２から入力信号を取得し、ＣＰＵ１０１に出力する。入力デバイス１２としては、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
【００４１】
媒体リーダ１０６は、記録媒体１３に記録されたプログラムやデータを読み取る装置である。記録媒体１３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）を使用できる。また、記録媒体１３として、例えば、フラッシュメモリカードなどの不揮発性の半導体メモリを使用することもできる。媒体リーダ１０６は、例えば、ＣＰＵ１０１からの命令に従って、記録媒体１３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００４２】
通信インタフェース１０７は、ネットワーク１０を介して他の装置と通信を行う。通信インタフェース１０７は、有線通信インタフェースでもよいし、無線通信インタフェースでもよい。
【００４３】
図３は、サーバのソフトウェア例を示す図である。サーバ１００は、ソフトウェアに関して複数の階層をもつ。第１の層は、カーネル層Ｌ１である。カーネル層Ｌ１は、ＯＳが属する階層である。第２の層は、アプリケーション層Ｌ２である。アプリケーション層Ｌ２は、ＯＳ上で動作するアプリケーションプログラムが属する階層である。アプリケーション層Ｌ２は、カーネル層Ｌ１よりも上位の階層である。
【００４４】
カーネル層Ｌ１は、ＯＳカーネルＫ１を含む。ＯＳカーネルＫ１は、ＯＳの中枢機能を担うソフトウェアである。ＯＳカーネルＫ１は、プログラムローダ１１０および実行イメージ記録処理部１２０を含む。
【００４５】
プログラムローダ１１０は、プログラムのロードを行う。具体的には、プログラムローダ１１０は、ＨＤＤ１０３に記憶された実行バイナリをＲＡＭ１０２にコピーする。このとき、プログラムローダ１１０は、実行バイナリに対するＲＡＭ１０２上の記憶領域の配置アドレスを決定する。
【００４６】
ここで、実行バイナリは、プログラムの実行形式のファイルであり、実行ファイル、実行可能ファイル、または、実行形式ファイルなどと呼ばれることもある。実行バイナリのファイル形式には、ＥＬＦ、ＥＸＥ、ＣＯＦＦおよびＰＥＦなどがある（例えば、ＯＳの種類に応じて使用される形式が異なる）。
【００４７】
また、実行バイナリは、位置独立実行形式で作成されるものとする。位置独立実行形式では、実行バイナリは、ＲＡＭ１０２上の任意のアドレスに配置可能なように作成され、ロード時に、プログラムローダ１１０によりロード先のアドレスが決定される。なお、以下の説明では、ＲＡＭ１０２にロードされた実行バイナリのイメージを、実行イメージと称することがある。
【００４８】
プログラムローダ１１０は、あるプログラムの実行を修正により中断させた後、修正後のプログラムを実行する際に、修正後のプログラムとともに修正前のプログラムもロードする。すなわち、プログラムローダ１１０は、修正前のプログラムに相当する実行イメージと、修正後のプログラムに相当する実行バイナリとをＲＡＭ１０２にロードする。このとき、プログラムローダ１１０は、修正前のプログラムに相当する実行イメージと、修正後のプログラムに相当する実行バイナリとのＲＡＭ１０２に占める記憶領域が互いに重なり合わないように配置する。プログラムローダ１１０は、ダイナミックリンカ１５０と連携して、修正前のプログラムの中断位置に対応する、修正後のプログラムの所定のアドレス位置から、修正後のプログラムの実行を開始させる。
【００４９】
実行イメージ記録処理部１２０は、あるプログラムを修正するために、当該プログラムの処理を中断する際、当該プログラムの実行イメージに関する情報を取得して、ＨＤＤ１０３に格納する。修正後のプログラムの処理において、修正前のプログラムの処理結果を再利用するためである。
【００５０】
アプリケーション層Ｌ２は、コンパイラ１３０、リンカ１４０およびダイナミックリンカ１５０を有する。
コンパイラ１３０は、ソースファイルのコンパイルを行う。ソースファイルは、ユーザにより記述されたソースコードを含むファイルである。コンパイラ１３０は、ソースファイルが入力されると、当該ソースファイルからオブジェクトファイルを生成し、ＨＤＤ１０２に格納する。ここで、コンパイラ１３０は、実行バイナリ内に含まれるデータ（データ要素やデータブロックなどと称してもよい）の参照が、ＧＯＴを介した間接参照により行われるようにオブジェクトファイル内のプログラムコードを生成する。
【００５１】
リンカ１４０は、コンパイラ１３０により作成された１以上のオブジェクトファイルと１以上のライブラリ（ここでは、静的共有ライブラリ）とをリンクする処理（静的リンク処理と称する）を行う。リンカ１４０は、静的リンク処理の結果として、実行形式のプログラム（実行バイナリ）を生成し、ＨＤＤ１０２に格納する。例えば、リンカ１４０は、複数のサブプログラムそれぞれをアドレス０番地を基準に再配置し（各サブプログラム内のシンボルを相対アドレスにバインドし）、アドレス０番地から始まる１つの実行バイナリを生成する。ここで、リンカ１４０は、通常の静的リンク処理に加えて、実行バイナリ内に含まれるデータの参照を、ＧＯＴ経由で行うように、実行バイナリにおけるシンボルテーブルの設定を行う。なお、リンカ１４０は、静的リンカ（スタティックリンカ）と呼ばれてもよい。
【００５２】
ダイナミックリンカ１５０は、プログラムのロード時に、当該プログラムと動的共有ライブラリとをリンクする動的リンク処理を行う。ダイナミックリンカ１５０は、動的共有ライブラリにおけるシンボルを解決し、当該シンボルと参照先アドレスとの対応情報を当該プログラムのＧＯＴに登録する。更に、ダイナミックリンカ１５０は、通常の動的リンク処理に加えて、実行バイナリ内に含まれるデータの参照先アドレスの情報をＧＯＴに記録する。なお、ダイナミックリンカ１５０は、プログラム毎（実行バイナリ毎）にＧＯＴを作成する。
【００５３】
また、ダイナミックリンカ１５０は、修正後のプログラムの実行時、修正前のプログラムに相当する実行イメージ内のシンボル情報を読み取り、当該実行イメージ内の各データの配置先アドレスの情報を、修正後の実行バイナリに対応するＧＯＴに書き込む。これにより、ダイナミックリンカ１５０は、修正後のプログラムの処理において、当該修正後のプログラムに相当する実行バイナリ中のデータ領域の代わりに、修正前のプログラムに相当する実行イメージ内のデータ領域を参照可能にする。
【００５４】
記憶部１６０は、ＨＤＤ１０３に確保された記憶領域である。記憶部１６０は、ソースファイル、オブジェクトファイル、実行バイナリ、静的共有ライブラリ、動的共有ライブラリ、および、実行イメージ記録処理部１２０により取得された各種の情報を記憶する。
【００５５】
図４は、実行バイナリの生成例を示す図である。ソースファイルＦ１は、ユーザにより作成され、記憶部１６０に格納されている。例えば、ユーザは、入力デバイス１２を操作して、ソースファイルＦ１にコードを記述することができる。
【００５６】
コンパイラ１３０は、ソースファイルＦ１が入力されると、ソースファイルＦ１に記述されたコードに応じたオブジェクトファイルＦ２を生成する。このとき、コンパイラ１３０は、各シンボル参照が、ＧＯＴによる間接参照で行われるようオブジェクトファイルＦ２内のプログラムコードを生成する。
【００５７】
リンカ１４０は、オブジェクトファイルＦ２および静的共有ライブラリＬＢ１に基づいて、静的リンク処理を行い、実行バイナリＦ３を生成する。前述のように、実行バイナリＦ３は、位置独立実行形式のファイルである。実行バイナリＦ３は、位置情報およびプログラムコードを含む。位置情報は、プログラムコードによって参照されるシンボルのアドレスを示す情報である。ここで、位置情報では、シンボルに対し、実行バイナリＦ３の先頭アドレス“０”を基準とした相対アドレスが登録されている。
【００５８】
また、実行バイナリＦ３は、シンボルの属性を登録したシンボルテーブルを含む（図４では図示を省略している）。リンカ１４０は、実行バイナリＦ３に含まれる各シンボルをＧＯＴを介して参照するようにシンボルテーブルを設定する。
【００５９】
ダイナミックリンカ１５０は、実行バイナリＦ３のＲＡＭ１０２へのロード時に、実行バイナリＦ３と動的共有ライブラリＬＢ２との動的リンク処理を行う。また、ダイナミックリンカ１５０は、実行バイナリＦ３に含まれる位置情報に基づいて、シンボルと当該シンボルのアドレスの情報（実行バイナリＦ３の先頭アドレスを基準とした相対アドレス）を、実行バイナリＦ３に対するＧＯＴに記録する。
【００６０】
図５は、ＧＯＴに追加される情報の例を示す図である。実行バイナリＦ３をＲＡＭ１０２上にロードした実行イメージを、実行イメージ２０とする。実行イメージ２０は、位置情報２１、プログラムコード２２およびデータ領域２３を含む。ここで、実行イメージ２０が配置されているＲＡＭ１０２上のアドレス（先頭アドレス）は、アドレスＡ１である。アドレスＡ１は、ＲＡＭ１０２上の絶対アドレスである。位置情報２１は、プログラムコード２２の処理を実行するために参照されるシンボルのアドレスの情報を含む。シンボルのアドレスの情報は、データ領域２３内の該当シンボルの内容が格納された領域の、アドレスＡ１を基準とした相対アドレスで表される。なお、図５では、上側から下側へ向かう方向がＲＡＭ１０２のアドレスの正の方向である。
【００６１】
例えば、データ領域２３は、シンボル名“α”、“β”のデータを格納する領域を含む。ここで、以下では、シンボル名“α”のデータを、アクセス対象データαのように称することがある。位置情報２１は、シンボル名“α”と相対アドレスＸ１との対応関係、および、シンボル名“β”と相対アドレスＸ２との対応関係の情報を含む。この場合、アクセス対象データαのＲＡＭ１０２上の絶対アドレスは、アドレスＡ１１＝Ａ１＋Ｘ１である。アクセス対象データβのＲＡＭ１０２上の絶対アドレスは、アドレスＡ１２＝Ａ１＋Ｘ２である。
【００６２】
ダイナミックリンカ１５０は、実行イメージ２０に対応するＧＯＴ３０に、シンボル名“α”と相対アドレスＸ１との対応関係を追加する。また、ダイナミックリンカ１５０は、シンボル名“β”と相対アドレスＸ２との対応関係を、ＧＯＴ３０に追加する。ここで、ＧＯＴ３０は、実行イメージ２０のアドレスに対して所定の相対アドレスに配置されるので、ダイナミックリンカ１５０やプログラムコード２２からは、当該相対アドレスによって実行イメージ２０のＧＯＴ３０にアクセスすることができる。
【００６３】
図６は、ＧＯＴの例を示す図である。ＧＯＴ３０は、シンボル名およびオフセットの項目を含む。シンボル名の項目には、シンボル名が登録される。オフセットの項目には、実行イメージ２０の先頭アドレスを基準とした相対アドレス（オフセット）が登録される。
【００６４】
例えば、ＧＯＴ３０には、シンボル名が“α”、オフセットが“Ｘ１”という情報が含まれている。これは、データ領域２３に含まれるアクセス対象データαが、実行イメージ２０の先頭アドレスを基準とした相対アドレス“Ｘ１”の位置に配置されていることを示す。
【００６５】
また、ＧＯＴ３０には、シンボル名が“β”、オフセットが“Ｘ２”という情報が含まれている。これは、データ領域２３に含まれるアクセス対象データβが、実行イメージ２０の先頭アドレスを基準とした相対アドレス“Ｘ２”の位置に配置されていることを示す。
【００６６】
このように、ダイナミックリンカ１５０は、通常の動的共有ライブラリに関するアドレス情報に加えて、実行イメージ２０のデータ領域２３に含まれるシンボルのアドレス情報も、ＧＯＴ３０に登録する。
【００６７】
図７は、記憶部に格納される情報の例を示す図である。記憶部１６０は、修正前のプログラムの実行イメージ２０および修正後のプログラムの実行バイナリＦ３１を記憶する。実行イメージ２０は、修正前のプログラムの実行中断時に、実行イメージ記録処理部１２０により取得される。実行バイナリＦ３１は、ユーザによりソースファイルＦ１が修正されて作成された修正後のソースファイルに基づいて、コンパイラ１３０およびリンカ１４０により作成された実行形式のファイルである。例えば、ユーザは、ソースファイルＦ１のうち、実行イメージ２０におけるプログラムコード２２の未実行部分に対応するコードの記述を修正することができる。実行バイナリＦ３１は、当該コードの修正が反映されたものとなる。
【００６８】
なお、記憶部１６０は、図７で例示した情報以外にも、前述のように、ソースファイルＦ１を含む複数のソースファイル、オブジェクトファイルＦ２を含む複数のオブジェクトファイル、実行バイナリＦ３を含む複数の実行バイナリを記憶する。記憶部１６０は、静的共有ライブラリＬＢ１、動的共有ライブラリＬＢ２を予め記憶する。また、記憶部１６０は、実行イメージ２０における中断時の状態を表す情報を記憶する。具体的には、記憶部１６０は、実行イメージ記録処理部１２０により取得される、ＣＰＵ１０１のレジスタ情報、実行イメージ２０に対するスタックメモリの内容、動的データ領域（ヒープ領域など）の内容、および、ＧＯＴ３０の内容も記憶する。
【００６９】
次に、サーバ１００が、修正後のプログラムを用いてアプリケーションを開始する際の処理手順を説明する。
図８は、プログラムローダ処理の例を示す図である。以下、図８に示す処理をステップ番号に沿って説明する。
【００７０】
（Ｓ１１）プログラムローダ１１０は、アプリケーションの起動指示を受け付ける。例えば、ユーザは、該当のアプリケーションの起動指示を、入力デバイス１２を用いて、サーバ１００に入力することができる。プログラムローダ１１０は、修正前の実行バイナリＦ３を記憶部１６０から取得し、ＲＡＭ１０２にロードする。プログラムローダ１１０は、記憶部１６０に記憶された実行イメージ２０に基づいて、当該ロードを行ってもよい。このとき、プログラムローダ１１０は、実行バイナリＦ３を配置する先頭アドレスを決定する。
【００７１】
（Ｓ１２）プログラムローダ１１０は、修正後の実行バイナリＦ３１を記憶部１６０から取得し、ＲＡＭ１０２にロードする。このとき、プログラムローダ１１０は、実行バイナリＦ３１を配置する先頭アドレスを決定する。また、プログラムローダ１１０は、ＲＡＭ１０２上の実行バイナリＦ３と重複しない領域に、実行バイナリＦ３１をロードする。
【００７２】
（Ｓ１３）プログラムローダ１１０は、修正前および修正後の実行バイナリ（すなわち、実行バイナリＦ３，Ｆ３１）の配置先をダイナミックリンカ１５０に通知する。ここで、ダイナミックリンカ１５０は、例えば、実行バイナリＦ３１のロードに伴ってＯＳにより起動されている。
【００７３】
（Ｓ１４）プログラムローダ１１０は、修正後の実行バイナリＦ３１の開始アドレスの通知を、ダイナミックリンカ１５０から受け付ける。そして、プログラムローダ１１０は、修正後の実行バイナリＦ３１の開始アドレスから実行を開始させる。
【００７４】
図９は、アプリケーション初期化処理の例を示す図である。以下、図９に示す処理をステップ番号に沿って説明する。
（Ｓ２１）ＯＳは、ダイナミックリンカ１５０の初期化処理を呼び出す。ステップＳ２１は、ステップＳ１３の直後に実行されてもよい。
【００７５】
（Ｓ２２）ＯＳは、アプリケーションのメイン処理へ制御を移行させる。ただし、ステップＳ１４で説明したように、ダイナミックリンカ１５０からプログラムローダ１１０へ実行バイナリＦ３１の開始アドレスが通知される場合、ステップＳ２２はスキップされる。
【００７６】
図１０は、ダイナミックリンカ初期化処理の例を示す図である。以下、図１０に示す処理をステップ番号に沿って説明する。以下に示す処理は、図９のステップＳ２１に相当する。
【００７７】
（Ｓ３１）ダイナミックリンカ１５０は、修正前の実行バイナリＦ３のＲＡＭ１０２上への配置を行う。これにより、ダイナミックリンカ１５０は、例えば、実行イメージ２０におけるプログラムコード２２やデータ領域２３の配置を把握する。
【００７８】
（Ｓ３２）ダイナミックリンカ１５０は、記憶部１６０に記憶された修正前のプログラム中断時点の静的データ（データ領域２３の内容）を、今回配置した修正前の実行バイナリＦ３のデータ領域２３に書き込む。すなわち、ダイナミックリンカ１５０は、中断時点の実行イメージ２０内での相対アドレスを維持して、データ領域２３の内容を復元する。このように、ダイナミックリンカ１５０は、修正前のプログラムの実行中断時の情報を今回配置したデータ領域２３に書き込むことで、修正前のプログラムの実行中断時における実行イメージ２０をＲＡＭ１０２上に復元する。
【００７９】
（Ｓ３３）ダイナミックリンカ１５０は、修正前のプログラム中断時点に保存したＧＯＴ３０の内容を記憶部１６０から取得し、ＧＯＴ３０の内容を修正後のプログラム（実行バイナリＦ３１）が使用するＧＯＴ領域にコピーする。
【００８０】
（Ｓ３４）ダイナミックリンカ１５０は、修正後のプログラムのデータ領域のシンボルを順番に読み込む。ここで、ダイナミックリンカ１５０は、修正後の実行バイナリのプログラムコード（テキスト領域の内容）を解析することで、修正後のプログラムで使用される複数のシンボルを検出することができる。ダイナミックリンカ１５０は、こうして検出された複数のシンボルの中から１つずつシンボルを読み込んで、下記の手順を実行する。
【００８１】
（Ｓ３５）ダイナミックリンカ１５０は、読み込んだシンボルのアドレスが修正後のプログラムにより使用されるＧＯＴに記録されているか否かを判定する。記録されている場合、処理をステップＳ３６に進める。記録されていない場合、処理をステップＳ３８に進める。ここで、ダイナミックリンカ１５０は、読み込んだシンボルが修正後のプログラムのＧＯＴに登録されているか否かを照合することで、ステップＳ３５の判定を行える。
【００８２】
（Ｓ３６）ダイナミックリンカ１５０は、修正前のプログラムの配置先アドレスから修正前の実行イメージ２０内の静的データ（データ領域２３における該当シンボル）のアドレス位置を算出する。具体的な算出方法は後述される。ダイナミックリンカ１５０は、当該アドレス位置として、実行バイナリＦ３１の先頭アドレスを基準とした相対アドレスを算出する。
【００８３】
（Ｓ３７）ダイナミックリンカ１５０は、修正後のプログラムが使用するＧＯＴ内の読み込んだシンボルに対するアドレス情報を、ステップＳ３６で計算したアドレス位置により更新する。
【００８４】
（Ｓ３８）ダイナミックリンカ１５０は、全てのシンボルを読み込んだか否かを判定する。全てのシンボルを読み込んだ場合、処理をステップＳ３９に進める。全てのシンボルを読み込んでいない場合、処理をステップＳ３４に進める。
【００８５】
図１１は、ダイナミックリンカ初期化処理の例（続き）を示す図である。以下、図１１に示す処理をステップ番号に沿って説明する。
（Ｓ３９）ダイナミックリンカ１５０は、修正前のプログラム中断時点に保存した動的データ領域の内容を記憶部１６０から取得し、当該動的データ領域の内容でＲＡＭ１０２を更新する。
【００８６】
（Ｓ４０）ダイナミックリンカ１５０は、動的共有ライブラリに関する初期化処理を行う。ダイナミックリンカ１５０は、ステップＳ３９で復元した動的データ領域の内容を基に、動的共有ライブラリについて、修正前のプログラム中断時点の状態を復元する。
【００８７】
（Ｓ４１）ダイナミックリンカ１５０は、再開時のプログラムポインタとスタックポインタとが指定されているか否かを判定する。指定されている場合、処理をステップＳ４２に進める。指定されていない場合、処理をステップＳ４３に進める。例えば、ユーザは、修正後のプログラムの実行開始位置を示すプログラムポインタ、および、当該実行開始位置までの実行経緯（例えば、分岐をどのように経由したか）を示すスタックポインタを、修正後のプログラムの実行指示と共に、サーバ１００に入力できる。
【００８８】
（Ｓ４２）ダイナミックリンカ１５０は、プログラムポインタとスタックポインタとを指定された値に更新し、結果をプログラムローダ１１０に通知する（開始アドレスの通知）。そして、処理を終了する。
【００８９】
（Ｓ４３）ダイナミックリンカ１５０は、プログラムポインタとスタックポインタとを修正前のプログラム中断時点の値に更新し、結果をプログラムローダ１１０に通知する（開始アドレスの通知）。ここで、ダイナミックリンカ１５０は、修正前のプログラム中断時点のプログラムポインタとスタックポインタとを、記憶部１６０から取得することができる。そして、処理を終了する。
【００９０】
次に、修正前のプログラム中断時点における実行イメージ記録処理部１２０の処理の手順を説明する。
図１２は、実行イメージ記録処理の例を示す図である。以下、図１２に示す処理をステップ番号に沿って説明する。
【００９１】
（Ｓ５１）実行イメージ記録処理部１２０は、修正前のプログラムの強制終了を検出すると、修正前の実行バイナリＦ３の位置情報（実行イメージ２０の位置情報２１）を記憶部１６０に書き込む。位置情報２１は、実行バイナリＦ３の先頭アドレスを基準としたプログラムコード２２、データ領域２３および各シンボルの相対アドレスの情報を含む。
【００９２】
（Ｓ５２）実行イメージ記録処理部１２０は、現在のＣＰＵ１０１のレジスタ情報（プログラムポインタ、スタックポインタを含む）とスタックメモリの内容（実行バイナリＦ３に対するスタック領域の内容）とを記憶部１６０に書き込む。
【００９３】
（Ｓ５３）実行イメージ記録処理部１２０は、実行イメージ２０に関する静的データ領域（データ領域２３）の内容を記憶部１６０に書き込む。
（Ｓ５４）実行イメージ記録処理部１２０は、実行イメージ２０に関する動的データ領域（ヒープ領域など）の内容を記憶部１６０に書き込む。
【００９４】
（Ｓ５５）実行イメージ記録処理部１２０は、実行イメージ２０に関する現在のＧＯＴ３０の内容を記憶部１６０に書き込む。
こうして、実行イメージ記録処理部１２０は、修正前のプログラムの中断時点（強制終了時点）の状態を取得し、修正前のプログラム（例えば、実行バイナリＦ３）に関連付けて記憶部１６０に格納する。
【００９５】
ここで、実行イメージ記録処理部１２０は、例えば、修正前のプログラム中断時点のプログラムコード２２の実行位置を、当該時点における実行イメージ２０の先頭アドレスからの相対アドレスとして取得しておく。そして、ダイナミックリンカ１５０は、修正後のプログラムに対してユーザにより開始位置が指定されない場合は、修正後のプログラムが配置された先頭アドレスからの当該相対アドレスで示されるアドレスを起点に、修正後のプログラムの実行を開始させる。一方、ダイナミックリンカ１５０は、開始位置が指定された場合は、当該開始位置から、修正後のプログラムの実行を開始させる。
【００９６】
次に、図１０のステップＳ３６，Ｓ３７で示した各シンボル（静的データ）のアドレスの更新方法を例示する。
図１３は、ＧＯＴのオフセット更新の例を示す図である。ここで、修正後のプログラムを実行するために、修正前のプログラムの中断時の実行イメージ２０および修正後のプログラムの実行イメージ２０ａが、ＲＡＭ１０２に配置されている。実行イメージ２０ａは、位置情報２１ａ、プログラムコード２２ａおよびデータ領域２３ａを含む。また、修正後のプログラムが使用するＧＯＴ３０ａがＲＡＭ１０２に配置されている。ＧＯＴ３０ａは、記憶部１６０に記憶されていた実行イメージ２０に関するアドレス情報３１ａを含む。アドレス情報３１ａは、アクセス対象データαのオフセットＸ１、および、アクセス対象データβのオフセットＸ２を含む。
【００９７】
ダイナミックリンカ１５０は、次のようにして、ＧＯＴ３０ａに含まれるアドレス情報３１ａを、アドレス情報３２ａへと更新する。
ダイナミックリンカ１５０は、実行イメージ２０の先頭アドレスＢ１および実行イメージ２０ａの先頭アドレスＢ２の通知を、プログラムローダ１１０から受け付ける。アドレスＢ１，Ｂ２は、絶対アドレスである。この場合、ＧＯＴ３０ａに含まれるアドレス情報３１ａによれば、アクセス対象データαの配置アドレスＢ１１は、Ｂ１１＝Ｂ１＋Ｘ１である。アクセス対象データβの配置アドレスＢ１２は、Ｂ１２＝Ｂ２＋Ｘ２である。
【００９８】
したがって、実行イメージ２０ａの先頭アドレスＢ２を基準にすると、アクセス対象データαの相対アドレス（オフセット）は、Ｘ３＝Ｂ１１−Ｂ２＝Ｂ１＋Ｘ１−Ｂ２である。同様に、先頭アドレスＢ２を基準にすると、アクセス対象データβの相対アドレス（オフセット）は、Ｘ４＝Ｂ１２−Ｂ２＝Ｂ１＋Ｘ２−Ｂ２である。このため、ダイナミックリンカ１５０は、ＧＯＴ３０ａにおいて、アクセス対象データαのオフセットを“Ｘ３”に、アクセス対象データβのオフセットを“Ｘ４”に更新する。アドレス情報３２ａは更新後を示している。
【００９９】
このように、ダイナミックリンカ１５０は、修正前のプログラムの第１のアドレス（例えばＢ１）を基準としたデータ領域２３の第１のオフセット（例えばＸ１）に基づいて、修正後のプログラムの第２のアドレス（例えばＢ２）を基準としたデータ領域２３の第２のオフセット（例えばＸ３）を算出し、ＧＯＴ３０ａに追加する。このとき、ダイナミックリンカ１５０は、データ領域２３に含まれる複数のデータそれぞれの第１のオフセットに基づいて、当該複数のデータそれぞれの第２のオフセットを算出する。修正後のプログラム（アプリケーション）は、ＧＯＴ３０ａを用いてシンボルを解決することで、実行イメージ２０のデータ領域２３の各シンボルを適切に参照してアクセスできる。
【０１００】
図１４は、修正後のプログラムによるデータアクセスの例を示す図である。例えば、アプリケーションは、シンボルα（アクセス対象データα）にアクセスする際、ＧＯＴ３０ａからシンボルαのオフセットアドレス“Ｘ３”を取得する。アプリケーションは、アドレスＢ１１＝Ｂ２＋Ｘ３を計算することで、アクセス対象データαのアドレスＢ１１（絶対アドレス）を得る。そして、アプリケーションは、ＲＡＭ１０２上のアドレスＢ１１にアクセスすることで、データ領域２３に存在するアクセス対象データαにアクセスする。
【０１０１】
図１５は、プログラムの実行イメージの比較例を示す図である。プログラムローダは、実行バイナリをロードするとき、実行バイナリに対応する実行イメージの先頭アドレスａを決定する。実行イメージ内でのデータ領域におけるアクセス対象データの先頭アドレスａからのオフセットアドレスｂは、リンク時にリンカ（静的リンカ）によって決定される。先頭アドレスａやオフセットアドレスｂの情報は、実行イメージ内の位置情報に含まれるが、ＧＯＴには記録されない。この場合、プログラムコードの処理において、アクセス対象データにアクセスするには、アプリケーションは、位置情報を参照して、先頭アドレスａにオフセットアドレスｂを加えたアドレスａ＋ｂ（絶対アドレス）を求める。アプリケーションは、アクセス先アドレスをａ＋ｂとして、当該アクセス対象データにアクセスする。図１５の例では、ＧＯＴは、動的共有ライブラリのデータアクセスにのみ使用され、データ領域内のシンボルの解決には使用されない。
【０１０２】
中断前および再開後で、実行イメージが同じであれば、当該実行イメージを保持し、再開後も保持した実行イメージの位置情報により、データ領域内のアクセス対象データの配置アドレスを取得することもできる。同一プログラムの実行中断および実行再開を行う手法の例として、チェックポイント・リスタートと呼ばれる方法が挙げられる。
【０１０３】
ところが、プログラムの修正を行う場合、中断時と再開時とでプログラムの内容が変更される。したがって、修正後では、修正前と比べて実行バイナリの内部構造が変わっており、実行コードであるテキスト情報やデータの実行バイナリ内の配置アドレスが異なる。このため、修正前のプログラムの中断時の状態を修正後のプログラムにおいて、チェックポイント・リスタートの方法のように、単純に引き継ぐことはできない。そこで、中断時の実行イメージが保持する静的データを、修正後の実行イメージのプログラムコードにより参照可能にする仕組みが問題になる。
【０１０４】
例えば、デバッガなどを用いて、修正後のプログラムコードを実行中のプログラム（修正前のプログラム）から呼び出せるように、ロード後にＲＡＭ１０２の内容を書き換えるなどの作業を行って、中断時のデータを再利用することも考えられる。しかし、この場合の書き換えでは、アセンブラレベルでの命令の書き換えを要する。すなわち、プログラム開発者やプログラムの利用者に対して高度な技術が求められ、このような作業を伴うデータの再利用方法は現実的ではない。
【０１０５】
そこで、サーバ１００では、ダイナミックリンカ１５０によりＧＯＴの仕組みを用いてデータの再利用を行えるようにすることで、プログラム開発者などにＲＡＭ１０２の内容を書き換える作業を強いずに済むという利点もある。また、プログラムを効率的に実行する仕組みをユーザにとって利用し易くすることで、サーバ１００の利用効率の向上を図れる。
【０１０６】
そして、サーバ１００によれば、プログラムの実行を中断して、プログラムの修正を行った場合でも、修正後のプログラムにより、修正前のプログラムの処理結果を適切に参照して処理を開始できる。サーバ１００は、修正前のプログラムによる処理済のコード部分に対応する修正後のプログラムのコード部分を実行しなくてよいため、修正後のプログラムを最初から再実行するよりも、修正後のプログラムの実行完了までの時間を短縮できる。
【０１０７】
第２の実施の形態のプログラム再開方法は、ＨＰＣ（High Performance Computing）システムに適用することもできる。ＨＰＣシステムでは、複数のユーザに演算リソースを貸し出し、各ユーザが貸し出された期間において、比較的大規模な演算を行うことが多い。ユーザが演算リソースを利用できる期間は限られており、できるだけ無駄な演算が生じないよう運用することが望ましい。また、動作のために消費される電力の観点からも、無駄な演算が生じないよう運用することが望ましい。そこで、ダイナミックリンカ１５０の機能をＨＰＣシステムにも適用することで、プログラム実行中にプログラムの修正が生じる場合にも、修正前の実行結果を再利用することが可能となり、無駄な演算の発生を防げる。その結果、プログラムの実行に要する期間を短縮できる。また、システムの省電力化を図れる。第２の実施の形態のプログラム再開方法は、比較的長期間（例えば、数日、数週間、数カ月など）の演算を伴うプログラムに対して特に有用である。
【０１０８】
次に、ダイナミックリンカ初期化処理の他の例を説明する。例えば、ダイナミックリンカ１５０は、修正後の実行イメージ２０ａのデータ領域２３ａをアンマップし、省メモリ化を図ってもよい。
【０１０９】
図１６は、ダイナミックリンカ初期化処理の他の例を示すフローチャートである。以下、図１６に示す処理をステップ番号に沿って説明する。ダイナミックリンカ１５０は、図１０の手順の後、図１１の手順（ステップＳ３９〜Ｓ４３）に加えて、以下に示すステップＳ４４を実行してもよい。ステップＳ４４は、ステップＳ４２またはステップＳ４３の次に実行される。
【０１１０】
（Ｓ４４）ダイナミックリンカ１５０は、修正後の実行バイナリＦ３１に対応するデータ領域２３ａをアンマップする。すなわち、ダイナミックリンカ１５０は、データ領域２３ａのＲＡＭ１０２への配置を解除する。
【０１１１】
図１７は、データ領域のアンマップの例を示す図である。図１４で例示したように、実行イメージ２０ａにより実現されるアプリケーションは、データ領域２３を参照して処理を実行する。このため、データ領域２３ａは、使用されない領域となる。このため、ダイナミックリンカ１５０は、実行イメージ２０ａにおいて、データ領域２３ａをアンマップすることで、ＲＡＭ１０２上のデータ領域２３ａに相当する記憶領域を空き状態とすることができる。これにより、省メモリ化を図れる。
【０１１２】
一方、ダイナミックリンカ１５０は、アプリケーションによりデータ領域２３，２３ａの両方を使用させるように制御することもできる。その場合、修正前のプログラム中断時点において、実行イメージ記録処理部１２０は、図１２の手順に代えて、次のように実行イメージ記録処理を行う。
【０１１３】
図１８は、実行イメージ記録処理の他の例を示すフローチャートである。以下、図１８に示す処理をステップ番号に沿って説明する。
（Ｓ６１）実行イメージ記録処理部１２０は、修正前のプログラムの強制終了を検出する。また、実行イメージ記録処理部１２０は、処理済のデータのうち、実行再開後に再利用するデータのシンボル名群を受け付ける。
【０１１４】
（Ｓ６２）実行イメージ記録処理部１２０は、修正前の実行バイナリＦ３の位置情報（実行イメージ２０の位置情報２１）を記憶部１６０に書き込む。位置情報２１は、実行バイナリＦ３の先頭アドレスを基準としたプログラムコード２２、データ領域２３および各シンボルの相対アドレスの情報を含む。
【０１１５】
（Ｓ６３）実行イメージ記録処理部１２０は、現在のＣＰＵ１０１のレジスタ情報（プログラムポインタ、スタックポインタを含む）とスタックメモリの内容（実行バイナリＦ３に関するスタック領域の内容）とを記憶部１６０に書き込む。
【０１１６】
（Ｓ６４）実行イメージ記録処理部１２０は、実行イメージ２０に関する静的データ領域（データ領域２３）の内容を記憶部１６０に書き込む。
（Ｓ６５）実行イメージ記録処理部１２０は、実行イメージ２０に関する動的データ領域（ヒープ領域など）の内容を記憶部１６０に書き込む。
【０１１７】
（Ｓ６６）実行イメージ記録処理部１２０は、実行イメージ２０に関する現在のＧＯＴ３０のシンボルを１つ読み出す。
（Ｓ６７）実行イメージ記録処理部１２０は、読み出したシンボルが、実行再開後に再利用するシンボルであるか否かを判定する。実行再開後に再利用するシンボルである場合、処理をステップＳ６８に進める。実行再開後に再利用するシンボルでない場合、処理をステップＳ６９に進める。ここで、実行イメージ記録処理部１２０は、読み出したシンボルが、ステップＳ６１で受け付けたシンボル名群に含まれる場合、当該シンボルを実行再開後に再利用するシンボルであると判定する。また、実行イメージ記録処理部１２０は、読み出したシンボルが、ステップＳ６１で受け付けたシンボル名群に含まれない場合、当該シンボルを実行再開後に再利用するシンボルでないと判定する。
【０１１８】
（Ｓ６８）実行イメージ記録処理部１２０は、該当のシンボルについて現在のＧＯＴ３０の内容を記憶部１６０に書き込む。
（Ｓ６９）実行イメージ記録処理部１２０は、現在のＧＯＴ３０に未読み出しのシンボルがあるか否かを判定する。未読み出しのシンボルがある場合、処理をステップＳ６６に進める。未読み出しのシンボルがない場合、処理を終了する。
【０１１９】
このように、実行イメージ記録処理部１２０は、ＧＯＴ３０のうち、修正後のプログラムによる実行再開後にも再利用する旨を指定されたシンボルのオフセットのみを記憶部１６０に格納する。ユーザは、実行再開後に再利用するデータのシンボル名群をサーバ１００に入力することで、修正後のプログラムによるデータの参照先をシンボルに応じて切り替えさせることができる。
【０１２０】
なお、このような切り替えを行うため、コンパイラ１３０およびリンカ１４０は、ステップＳ６１で受け付けたシンボル名群についてＧＯＴを介した間接参照でアクセスを行うようプログラムコードの生成およびシンボルテーブルの設定を行う。また、コンパイラ１３０およびリンカ１４０は、ステップＳ６１で受け付けたシンボル名群に含まれないシンボル（実行バイナリ内のシンボル）については、通常のアクセスを行うようプログラムコードの生成およびシンボルテーブルの設定を行う。こうして、コンパイラ１３０およびリンカ１４０は、一部のシンボルについては修正前のプログラムのデータ領域を参照し、他の一部のシンボルについては修正後のプログラムのデータ領域を参照するように設定した実行バイナリを生成する。
【０１２１】
図１９は、修正後のプログラムによるデータアクセスの他の例を示す図である。ここで、修正後のプログラムを実行するために、修正前のプログラムの中断時の実行イメージ２０および修正後のプログラムの実行イメージ２０ｂが、ＲＡＭ１０２に配置されている。実行イメージ２０ｂは、位置情報２１ｂ、プログラムコード２２ｂおよびデータ領域２３ｂを含む。また、実行イメージ２０ｂに対してＧＯＴ３０ｂがＲＡＭ１０２に配置されている。
【０１２２】
ダイナミックリンカ１５０は、図１８の手順で実行イメージ記録処理部１２０により取得されたＧＯＴに基づいて、図１０，図１１の手順を実行し、データ領域２３，２３ｂに含まれる各シンボルの参照先を切り替える。例えば、実行イメージ２０，２０ｂの何れも、シンボル名“α”、“β”、“γ”のシンボルを含むとする。ただし、図１９では、データ領域２３において、シンボル名“γ”の図示を省略している。また、図１９では、データ領域２３ｂにおいて、シンボル名“α”、“β”の図示を省略している。
【０１２３】
ここで、図１８のステップＳ６１で、実行再開後に再利用するシンボル名群として“α”、“β”が指定されたとする。この場合、ダイナミックリンカ１５０は、アクセス対象データα，βに関するアクセス情報をＧＯＴ３０ｂに登録するが、アクセス対象データγに関するアクセス情報をＧＯＴ３０ｂに登録しない。したがって、実行イメージ２０ｂにより実現されるアプリケーションは、ＧＯＴ３０ｂに基づいて、データ領域２３に含まれるアクセス対象データα，βにアクセスする。一方、当該アプリケーションは、位置情報２１ｂに基づいて、データ領域２３ｂに含まれるアクセス対象データγにアクセスする。
【０１２４】
このように、ダイナミックリンカ１５０は、プログラムコード２２ｂの処理において、データ領域２３，２３ｂの何れを参照するかをシンボル毎に切り替えるよう制御することもできる。ダイナミックリンカ１５０は、修正後のプログラムにより参照される複数のデータそれぞれに対して、ＲＡＭ１０２におけるアクセス先を、修正前のプログラムのデータ領域２３とするか、または、修正後のプログラムのデータ領域２３ｂとするかを決定する。こうして、アプリケーションによるシンボル毎の参照先の制御を柔軟化できる。
【０１２５】
なお、第１の実施の形態の情報処理は、プロセッサ１ｂにプログラムを実行させることで実現できる。また、第２の実施の形態の情報処理は、ＣＰＵ１０１にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体１３に記録できる。
【０１２６】
例えば、プログラムを記録した記録媒体１３を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体１３に記録されたプログラムまたは他のコンピュータから受信したプログラムを、ＲＡＭ１０２やＨＤＤ１０３などの記憶装置に格納し（インストールし）、当該記憶装置からプログラムを読み込んで実行してもよい。
【０１２７】
以上の第１，第２の実施の形態を含む実施形態に関し、更に以下の付記を開示する。
（付記１）  メモリと、
プログラムローダにより修正前のプログラムと修正後のプログラムとを前記メモリにロードし、ダイナミックリンカにより前記修正後のプログラムの実行に用いられるライブラリを前記メモリにロードし、前記メモリにロードされた前記修正前のプログラムに対するデータ領域に、前記修正前のプログラムの実行中断時の情報を書き込み、前記情報に基づいて、前記修正前のプログラムの実行を中断した第１の位置に対応する前記修正後のプログラム上の第２の位置から、前記修正後のプログラムの実行を開始するプロセッサと、
を有する情報処理装置。
【０１２８】
（付記２）  前記プロセッサは、前記修正前のプログラムの第１のアドレスを基準とした前記データ領域の第１のオフセットに基づいて、前記修正後のプログラムの第２のアドレスを基準とした前記データ領域の第２のオフセットを算出する、付記１記載の情報処理装置。
【０１２９】
（付記３）  前記プロセッサは、前記修正後のプログラムに対するグローバルオフセットテーブルに前記第２のオフセットを追加し、前記修正後のプログラムの実行に応じて前記グローバルオフセットテーブルから前記第２のオフセットを取得し、前記第２のオフセットに基づいて前記データ領域にアクセスする、付記２記載の情報処理装置。
【０１３０】
（付記４）  前記プロセッサは、前記データ領域に含まれる複数のデータそれぞれの前記第１のオフセットに基づいて、前記複数のデータそれぞれの前記第２のオフセットを算出する、付記２または３の何れか１つに記載の情報処理装置。
【０１３１】
（付記５）  前記プロセッサは、前記修正前のプログラムを実行する際に、前記第１のオフセットを前記修正前のプログラムのグローバルオフセットテーブルに追加し、前記修正前のプログラムの実行が中断された際に、中断時の当該グローバルオフセットテーブルを記憶装置に格納し、前記修正前のプログラムと前記修正後のプログラムとを前記メモリにロードすると、前記記憶装置に記憶された前記中断時のグローバルオフセットテーブルを参照して、前記第１のアドレスを取得する、付記１乃至４の何れか１つに記載の情報処理装置。
【０１３２】
（付記６）  前記プロセッサは、前記修正前のプログラムの実行中断時の前記情報を前記データ領域に書き込むことで、前記修正前のプログラムの実行中断時における実行バイナリのイメージを前記メモリに復元する、付記１乃至５の何れか１つに記載の情報処理装置。
【０１３３】
（付記７）  前記プロセッサは、前記修正後のプログラムにより参照される複数のデータそれぞれに対して、前記メモリにおけるアクセス先を、前記修正前のプログラムの第１のデータ領域とするか、または、前記修正後のプログラムの第２のデータ領域とするかを決定する、付記１乃至６の何れか１つに記載の情報処理装置。
【０１３４】
（付記８）  前記プロセッサは、前記修正後のプログラムの実行を開始する際に、前記メモリに配置された前記修正後のプログラムのデータ領域を解放する、付記１乃至６の何れか１つに記載の情報処理装置。
【０１３５】
（付記９）  前記プロセッサは、前記修正前のプログラムの実行を中断し、前記修正前のプログラムを修正した前記修正後のプログラムの実行を開始する際に、前記修正前のプログラムおよび前記修正後のプログラムを前記メモリにロードし、前記修正前のプログラムを実行せずに前記修正後のプログラムを実行する、付記１乃至８の何れか１つに記載の情報処理装置。
【０１３６】
（付記１０）  コンピュータに、
プログラムローダにより修正前のプログラムと修正後のプログラムとがメモリにロードされた後、前記修正後のプログラムの実行に用いられるライブラリを前記メモリにロードし、
前記メモリにロードされた前記修正前のプログラムに対するデータ領域に、前記修正前のプログラムの実行中断時の情報を書き込み、前記情報に基づいて、前記修正前のプログラムの実行を中断した第１の位置に対応する前記修正後のプログラム上の第２の位置から、前記修正後のプログラムの実行を開始する、
処理を実行させるダイナミックリンクプログラム。
【０１３７】
（付記１１）  コンピュータが、
プログラムローダにより、修正前のプログラムと修正後のプログラムとをメモリにロードし、
ダイナミックリンカにより、前記修正後のプログラムの実行に用いられるライブラリを前記メモリにロードし、前記メモリにロードされた前記修正前のプログラムに対するデータ領域に、前記修正前のプログラムの実行中断時の情報を書き込み、前記情報に基づいて、前記修正前のプログラムの実行を中断した第１の位置に対応する前記修正後のプログラム上の第２の位置から、前記修正後のプログラムの実行を開始する、
プログラム再開方法。
【符号の説明】
【０１３８】
１  情報処理装置
１ａ  メモリ
１ｂ  プロセッサ
２  記憶装置
３，４  実行イメージ
３ａ，４ａ  プログラムコード
３ｂ，４ｂ  データ領域
５  オフセットテーブル
【図１】
0006691294.tif 000002
【図２】
0006691294.tif 000003
【図３】
0006691294.tif 000004
【図４】
0006691294.tif 000005
【図５】
0006691294.tif 000006
【図６】
0006691294.tif 000007
【図７】
0006691294.tif 000008
【図８】
0006691294.tif 000009
【図９】
0006691294.tif 000010
【図１０】
0006691294.tif 000011
【図１１】
0006691294.tif 000012
【図１２】
0006691294.tif 000013
【図１３】
0006691294.tif 000014
【図１４】
0006691294.tif 000015
【図１５】
0006691294.tif 000016
【図１６】
0006691294.tif 000017
【図１７】
0006691294.tif 000018
【図１８】
0006691294.tif 000019
【図１９】
0006691294.tif 000020