(57)【要約】【課題】ソースコードやコンパイラやリンカが出力するシンボル情報やアセンブラコード出力を最大限利用して、エントリーポイントを的確に発見/抽出する技術を提供する。【解決手段】生成手段は、シンボル情報について対応するロケート情報を記述した情報である第１のエントリーポイントリストを生成する。変換手段は、バイナリーコードから分岐先を抽出したリストである第２のエントリーポイントリストを生成し、第１のエントリーポイントリストと第２のエントリーポイントリストとを結合し、結合後のエントリーポイントリストから重複しているエントリーポイントを削除して残ったエントリーポイントを第３のエントリーポイントリストとして記憶させ、第３のエントリーポイントリストを参照してソースコードの事前変換を行う。【選択図】図１
2014206948.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードの行番号とアセンブラコードの対からなる情報であるニーモニックを記憶する第１の記憶手段と、
前記ソースコード中に存在する関数、手続き名、外部公開ラベル、グローバルデータ名を抽出した情報であるシンボル情報を記憶する第２の記憶手段と、
前記シンボル情報に含まれるシンボルがどのメモリ番地に配置されるかを示す情報であるロケート情報を記憶する第３の記憶手段と、
前記ソースコードから生成されたバイナリーコードを記憶する第４の記憶手段と、
前記シンボル情報について対応するロケート情報を記述した情報である第１のエントリーポイントリストを生成する生成手段と、
前記バイナリーコードから分岐先を抽出したリストである第２のエントリーポイントリストを生成し、前記第１のエントリーポイントリストと前記第２のエントリーポイントリストとを結合し、結合後のエントリーポイントリストから重複しているエントリーポイントを削除して残ったエントリーポイントを第３のエントリーポイントリストとして記憶させ、前記第３のエントリーポイントリストを参照してソースコードの事前変換を行う変換手段と
を有するエントリーポイント抽出装置。
【請求項２】
前記バイナリーコードからではエントリーポイントとして抽出することが困難である命令文があらかじめ入力されている第５の記憶手段をさらに有しており、
前記生成手段は、前記ソースコードに前記命令文が存在するか検索し、前記命令文が存在する場合、当該命令文についてあらかじめ定められているエントリーポイントを前記第１のエントリーポイントリストに加える、
請求項１に記載のエントリーポイント抽出装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本明細書に記載の実施の形態は、エントリーポイント抽出装置に関する。
【背景技術】
【０００２】
社会システム事業を中心に、昔から利用しているソフトウェア資産を無修正で使用し続けたい、というニーズがある。ところが、ハードウェアの老朽化・生産終了に伴い、ソフトウェアを動かすハードウェアがなくなりつつある。また、ソフトウェア資産も顧客単位で機能がカスタマイズされる等の多様化のため、移植も難しい。一方、仮想化技術を利用して、多くのアーキテクチャマシンをソフトウェアエミュレーションすることでソフトウェア資産を延命できる可能性がある。オープンソースのプロセッサエミュレータであるＱＥＭＵに代表される仮想化エミュレータは、ターゲットコードを実行させながらホストコードへ変換（動的変換）するもので、リアルタイム性に乏しく、応答性能・起動時間の予測が困難であり、組み込み機器には向かない。
【０００３】
そこで、仮想化技術の高速化が求められている。仮想化技術の高速化の一環として行われる静的事前変換・動的事前変換に関しては、いろいろな提案がなされている。例えば、マルチコア環境において、静的解析結果と動的解析結果を組み合わせて利用し、精度よく重要度の高いプログラムブロックの事前コンパイルを行い、プログラムを高速化すること（事前変換）が提案されている。また、ターゲットコードの変換において、静的実行ないしは動的実行の分岐時の速度性能を高める提案がなされている。
【０００４】
応答性能・起動時間を安定させるため、ターゲットコード変換を事前に行う事前変換の場合、以下の問題があった。すなわち、ターゲットコードの動的変換が前提の現状の仮想マシンエミュレータでは、基本ブロックのエントリーポイントが分からなくなることがある。また、間接アドレス指定による分岐・サブルーチンコールやメモリ上に書き込まれた値を用いた分岐・サブルーチンコールでは、分岐発生時のジャンプ先アドレスの同定が困難なことがある。
【０００５】
そのため、基本ブロック抽出のために、バイナリーコードレベルでレジスタ値の依存関係・メモリアクセスの履歴を見て、エントリーポイントとなる可能性のあるところを全て取り出すことが提案された。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平９−２６８８４号公報
【特許文献２】特許第３９６４１４２号公報
【特許文献３】特許第４４０９３６０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
基本ブロックは、エントリーポイントと呼ばれる先頭位置から、分岐命令やＣＰＵ状態フラグを変更する命令までの命令列である。このため、基本ブロックを抽出するためには、エントリーポイントを正しく抽出するようにバイナリーコードレベルでレジスタ値の依存関係・メモリアクセスの履歴を見て、エントリーポイントとなる可能性のあるところを全て取り出す必要がある。
【０００８】
しかし、メモリアクセスの履歴を全て追いかけると状態爆発が生じることがあるため，命令によっては探索を打ち切らざるを得ない状態が生じ、バイナリーコードの探索のみでは全てを抽出することが困難になるという問題があった。
【０００９】
本発明は、ソースコードやコンパイラやリンカが出力するシンボル情報やアセンブラコード出力を最大限利用して、エントリーポイントを的確に発見/抽出する技術を提供することを目的とする。
【課題を解決するための手段】
【００１０】
一の実施の形態によれば、エントリーポイント抽出装置が提案される。エントリーポイント抽出装置は、第１の記憶手段と、第２の記憶手段と、第３の記憶手段と、第４の記憶手段と、生成手段と、変換手段とを有する。
【００１１】
第１の記憶手段は、ソースコードの行番号とアセンブラコードの対からなる情報であるニーモニックを記憶する
第２の記憶手段は、ソースコード中に存在する関数、手続き名、外部公開ラベル、グローバルデータ名を抽出した情報であるシンボル情報を記憶する。
第３の記憶手段は、シンボル情報に含まれるシンボルがどのメモリ番地に配置されるかを示す情報であるロケート情報を記憶する。
【００１２】
第４の記憶手段は、ソースコードから生成されたバイナリーコードを記憶する。
生成手段は、シンボル情報について対応するロケート情報を記述した情報である第１のエントリーポイントリストを生成する。
【００１３】
変換手段は、バイナリーコードから分岐先を抽出したリストである第２のエントリーポイントリストを生成し、第１のエントリーポイントリストと第２のエントリーポイントリストとを結合し、結合後のエントリーポイントリストから重複しているエントリーポイントを削除して残ったエントリーポイントを第３のエントリーポイントリストとして記憶させ、第３のエントリーポイントリストを参照してソースコードの事前変換を行う。
【図面の簡単な説明】
【００１４】
【図１】第1の実施の形態に係るエントリーポイント抽出装置の構成例を示すブロック図
【図２】エントリーポイント抽出装置の動作例を示すフローチャート
【図３】シンボル情報記憶部に記憶されたシンボル情報の例を示す
【図４】図３に示したシンボル情報から関数名とアドレスを抽出した中間データの例を示す図
【図５】図4に示した中間データに内部ラベルを付加することによって生成されたエントリーポイントリストの例を示す図
【図６】ソースコード記憶部１０に記憶されるソースコードの一部の例を示す図
【図７】図６に示したソースコードの一部に対応する、シンボル情報及びロケート情報の例を示す図
【図８】図７に示したシンボル情報及びロケート情報に対応する、エントリーポイントリストの例を示す図
【図９】第２の実施の形態に係るエントリーポイントリスト抽出装置の構成例を示すブロック図
【図１０】第２の実施の形態に係るエントリーポイント抽出装置の動作例を示すフローチャート
【図１１】図１０に続くフローチャート
【図１２】ジャンプテーブルの例を示す図
【図１３】図１２のジャンプテーブルから変換されたニーモニックの例を示す図
【図１４】ソースコード記憶部に記憶されているソースコードの一部分であって、例外パターンデータベース部に記憶されている例外パターン（命令文）の一つに合致する部分を示す図
【図１５】ニーモニック記憶部に記憶されるニーモニックの一部であって、図１４に示した例外パターンに合致するソースコードの部分に対応するニーモニックの一部を示す図
【図１６】シンボル情報記憶部に記憶されるシンボル情報の一部であって、図１４に示した例外パターンに合致するシンボル情報の一部を示す図
【図１７】図１４、図１５、図１６に示すソースコード、ニーモニック、シンボル情報から生成されるエントリーポイントリストの例を示す図
【発明を実施するための形態】
【００１５】
以下、図面を参照して本発明の実施の形態に係るエントリーポイント抽出装置を説明する。
【００１６】
[０．用語の定義]
本明細書で使用する用語の定義を述べる。
（１）シンボル（シンボル情報）
「シンボル」とは、デバッガが利用する変数名、関数名などの名前をいう。
【００１７】
（２）事前変換
「事前変換」とは、ソフトウェアをエミュレータにより安定的に実行するために、エミュレーション対象コードを事前に解析して基本ブロック単位にまとめたコードを作成することをいう。「事前変換」によって、エミュレーション中にコード変換を行わないようにすることで安定的な実行が可能となる。
【００１８】
（３）基本ブロック
「基本ブロック」とは、プログラム実行コード中で、内部に分岐を持たず、ＣＰＵの状態フラグも変更しない命令セット群を取り出したものをいう。コンパイラの制御フローグラフに用いる「基本ブロック」よりは広い概念であり、他の基本ブロックからの分岐先が当該ブロック内にあっても「基本ブロック」である。
【００１９】
（４）エントリーポイント
「エントリーポイント」とは、プログラムが開始される場所をいい、モジュールの最初、関数の先頭、ラベル、場合分けのcase文のはじめもエントリーポイントになり得る。
【００２０】
[１．第1の実施の形態]
本発明の第１の実施の形態について説明する。
[１．１．装置構成例]
第1の実施の形態に係るエントリーポイント抽出装置の構成例を図１に示す。
エントリーポイント抽出装置１は、例えばコンピュータ、ワークステーションなどの情報処理装置によって実現される装置である。この情報処理装置は、演算処理装置（ＣＰＵ）、主メモリ（ＲＡＭ）、読み出し専用メモリ（ROM）、入出力装置（Ｉ／Ｏ）、及び必要な場合にはハードディスク装置等の外部記憶装置を具備している装置である。
【００２１】
エントリーポイント抽出装置１は、ソースコード記憶部１０と、ソースコード記憶部１０に接続されたコンパイラ部１１及びニーモニック記憶部１３と、コンパイラ部１１に接続されたリンカ部１２と、リンカ部１２に接続されたシンボル情報記憶部１４並びにロケート情報記憶部１５と、ソースコード記憶部１０、ニーモニック記憶部１３、シンボル情報記憶部１４並びにロケート情報記憶部１５に接続されたエントリーポイントリスト生成部１６と、エントリーポイントリスト生成部１６に接続されたエントリーポイントリスト記憶部１７と、エントリーポイントリスト記憶部１７に接続された事前変換部２０と、前記リンカ部１２に接続されるとともに前記事前変換部２０に接続するバイナリーコード記憶部１８と、前記事前変換部２０に接続された事前変換対象エントリーポイントリスト記憶部１９と、前記事前変換部２０に接続された事前変換後実行イメージ記憶部２１と、前記事前変換後実行イメージ記憶部２１に接続されたローダー部２２と、ローダー部２２に接続されたシステムイメージ記憶部２５と、ローダー部２２に接続されたホストマシン部２３とを有する。また、ホストマシン部２３には、周辺デバイス２４が接続されている。
【００２２】
ソースコード記憶部１０は、ニーモニック記憶部１３は第１の記憶手段に相当し、シンボル情報記憶部１４は第２の記憶手段に相当し、ロケート情報記憶部１５は第３の記憶手段に相当し、バイナリーコード記憶部１８は第４の記憶手段に相当し、エントリーポイントリスト生成部１６は生成手段に相当し、事前変換部２０は変換手段に相当する。
【００２３】
なお、エントリーポイント抽出装置１のこれら構成要素はエントリーポイント抽出装置１の機能を、機能ごとにまとめてブロックとして捉えたものであり、エントリーポイント抽出装置１が各構成要素に対応する基板、装置、回路、部品などの物理的構成要素を備えていなければならないことを意味するわけではない。また、「接続されている」とは、データ、情報、命令などの送受信、受け取り、受け渡しなどが可能な状態になっていることをいい、互いに配線で連結されているような物理的な接続に限られる意味ではない。
【００２４】
［１．２．各部の説明］
ソースコード記憶部１０は、事前変換の対象となるプログラムのソースコードを記憶する機能を有する。
コンパイラ部１１は、プログラミング言語で書かれた、プログラムのソースコード（原始コード）を、機械語、バイトコードなどの中間言語によるオブジェクトコード（目的コード）に変換する機能を有する。また、コンパイラ部１１は、前記ソースコードから後述するニーモニックを生成し、出力する機能を有する。
【００２５】
リンカ部１２は、コンパイラによって変換されたオブジェクトコードに、必要なライブラリなどを付け加えて実行可能ファイルを生成する機能を有する。また、リンカ部１２は、前記ソースコードから後述するシンボル情報及びロケート情報を生成し、出力する機能を有する。
【００２６】
ニーモニック記憶部１３は、基となるソースコード行番号とアセンブラコードの対からなる情報であるニーモニックを記憶する機能を有する。
シンボル情報記憶部１４は、ソースコード中に存在する関数、手続き名・外部公開ラベル・グローバルデータ名を抽出した情報であるシンボル情報を記憶する機能を有する。
【００２７】
ロケート情報記憶部１５は、シンボル情報に含まれるシンボルがどのメモリ番地に配置されるかを示す情報であるロケート情報を記憶する機能を有する。
バイナリーコード記憶部１８は、リンカ部１２によってソースコードから生成されたバイナリーコードを記憶する機能を有する。
【００２８】
エントリーポイントリスト生成部１６は、アプリケーション層のソースコードを構文解析し、関数・手続き・外部公開ラベルのみをフィルタリング（抽出）し、そのフィルタリングの結果残ったシンボル情報について対応するロケート情報を記述した情報であるエントリーポイントリスト（「第１のエントリーポイントリスト」と呼ぶ）を生成する。
エントリーポイントリスト記憶部１７は、エントリーポイントリスト生成部１６によって生成されたエントリーポイントリストを記憶する機能を有する。
【００２９】
事前変換部２０は、バイナリーコード記憶部１８に記憶されているバイナリーコードをパースして、可能性のある分岐先を事前変換対象エントリーポイントリスト（「第３のエントリーポイントリスト」とも呼ぶ）に入力しながらバイナリーコードをホストコードに変換するコード変換を行うとともに、分岐先が多いあるいは分岐が深いなどの理由で、前記バイナリーコードからだけでは追跡できない場合には、先のフィルタリング処理で取得したエントリーポイントリスト（第１のエントリーポイントリスト）を事前変換対象エントリーポイントリストへ入力し、更にコード変換を試す機能を有する。あるいは、第１のエントリーポイントリストと第２のエントリーポイントリストを照合し、合併させて、第３のエントリーポイントを抽出する。可能性のある分岐先を抽出し、これを事前変換対象エントリーポイントリストに入力する方法は、どのような方法でもよいが、例えば本件出願人による日本国特許出願・出願番号２０１１−１７９８９号に記載された方法を用いてよい。
【００３０】
また、事前変換部２０は、事前変換対象エントリーポイントリストを生成し、事前変換対象エントリーポイントリスト記憶部１９に記憶させる機能を有する。事前変換対象エントリーポイントリストは、事前変換部２０によって生成される情報であって、前記エントリーポイントリスト記憶部１７に記憶された第１のエントリーポイントリストと、前記バイナリーコードを追跡することによって事前変換部２０が生成した第２のエントリーポイントリストとを結合し、これらの結合後のエントリーポイントリストから重複しているエントリーポイントを削除して残ったエントリーポイントのリストである。
【００３１】
事前変換対象エントリーポイントリスト記憶部１９は、事前変換対象エントリーポイントリストを記憶する機能を有する。事前変換対象エントリーポイントリストは第３のエントリーポイントリストに相当する。
【００３２】
事前変換後実行イメージ記憶部２１は、基本ブロックに分割されたターゲットコードに対応する中間コードについて、ホストコードに変換されたデータである実行イメージを記憶する機能を有する。
【００３３】
システムイメージ記憶部２５は、仮想化（エミュレータ）層の実行イメージとOS層の実行イメージを記憶する機能を有する。
【００３４】
ローダー部２２は、事前変換後実行イメージ記憶部２１から実行イメージを読み出し、システムイメージ記憶部２５の仮想化層の実行イメージとOS層の実行イメージと合併させ、ホストマシン部２３に渡す機能を有する。実行イメージはホストマシン部２３の実行コード格納用ROMに格納される。
【００３５】
ホストマシン部２３は、ローダー部２２から渡された実行イメージに基づいて、プロセスを実行する機能を有する。ホストマシン部２３は、バスによって相互接続されたＣＰＵ、実行用ＲＡＭ、実行コード格納用ROM、ドライバを有しており、ドライバは周辺デバイス２４に接続されている。
【００３６】
周辺デバイス２４は、ホストマシン部２３によって制御される機器群であって、例えば、プリンタやキーボードを接続するためのUSBポートあるいはCOMポート、インターネットへ接続するためのネットワークアダプタ、またはRAMやROMなどのメモリ、シリアルポートである。
【００３７】
［１．３．動作例］
図1に示したエントリーポイント抽出装置の動作例を、図２を参照しながら説明する。図２は、エントリーポイント抽出装置の動作例を示すフローチャートである。
まず、エントリーポイント抽出装置１、より詳しくはエントリーポイントリスト生成部１６はソースコード記憶部１０に記憶されたソースコードから一行読み出し、ソースコード解析を実行する（Ｓ１）。
【００３８】
なお、ステップＳ１に先立って、コンパイラ部１１はニーモニックを生成して、これをニーモニック記憶部１３に記憶させており、リンカ部１２は、コンパイラ部１１の出力に基づいて、シンボル情報並びにロケート情報を生成し、それぞれシンボル情報記憶部１４、ロケート情報記憶部１５に記憶させているものとする。
【００３９】
ここで、シンボル情報について説明する。図３にシンボル情報記憶部１４に記憶されたシンボル情報の例を示す。シンボル情報は、ソースコードの行（命令）ごとに、行番号とベースアドレスと、オフセットアドレスと、シンボル属性とラベル名との組を有する情報である。コンパイラやリンカーが出力するシンボル情報は、余分な情報が混入している。例えば、シンボル情報は行番号やベースアドレス、オフセットアドレスなどを含んでおり、かつ関数名などのラベルとデータ名が混在している状態である。
【００４０】
そこで、エントリーポイントリスト生成部１６は、関数名とデータ名も混在しているシンボル情報から関数名とその開始アドレスを構文解析により抽出する。図３に示したシンボル情報から関数名とアドレスを抽出した中間データの例を図４に示す。図に示すように中間データは、シンボル属性、ラベル名（関数名）、開始アドレスの組で構成されている。
しかし、この中間データには内部ラベル（jmp先の細かいラベル）は含まれないので、エントリーポイントリスト生成部１６は、内部ラベル（jmp先の細かいラベル）をソースコードから検出して中間データに付加し、エントリーポイントリストとして出力する。なお、内部ラベルについても開始アドレスを記述する。図５に、図4に示した中間データに内部ラベルを付加することによって生成されたエントリーポイントリストの例を示す。図5に示した例では、ラベル名が「label1」「label2」である行が内部ラベルとして検出され追加されたデータである。なお、図３から図５ではシンボル属性を含むデータ例を示したが、シンボル情報が無くとも本実施の形態は成立する。
【００４１】
エントリーポイントリスト生成部１６では、シンボル情報やニーモニックなどを利用して、内部ラベルも抽出する。
図２に戻りエントリーポイントリスト生成処理の説明を再開する。次に、エントリーポイント抽出装置１、より詳しくはエントリーポイントリスト生成部１６は、読み込んだ行（命令）からプロシージャ先頭若しくはラベルを発見したか否かを判定する（Ｓ２）。
【００４２】
読み込んだ行からプロシージャ先頭若しくはラベルを発見したと判定した場合（Ｓ２、Ｙｅｓ）、エントリーポイント抽出装置１、より詳しくはエントリーポイントリスト生成部１６はステップＳ２において発見したプロシージャ（関数）・ラベル名に対応するシンボルをシンボル情報記憶部１４に記憶されたシンボル情報から抽出する（Ｓ３）。次にエントリーポイント抽出装置１、より詳しくはエントリーポイントリスト生成部１６は、ロケート情報記憶部１５に記憶されたロケート情報から、ステップＳ３で抽出したシンボルに対応するロケート情報を抽出する（Ｓ４）。
【００４３】
次にエントリーポイント抽出装置１、より詳しくはエントリーポイントリスト生成部１６は、ステップＳ4において抽出したロケート情報に基づいて、エントリーポイント情報を生成し、エントリーポイントリスト記憶部１７に記憶されているエントリーポイントリスト（「第１のエントリーポイントリスト」と呼ぶ）にこのエントリーポイント情報を追加する（Ｓ５）。
【００４４】
一方、読み込んだ行からプロシージャ先頭若しくはラベルを発見しなかったと判定した場合（Ｓ２、Ｎｏ）、エントリーポイント抽出装置１、より詳しくはエントリーポイントリスト生成部１６は、ソースコード記憶部１０に記憶されたソースコードから全ての行を読み込んだか否かを判定する（Ｓ６）。
【００４５】
ステップＳ６において、ソースコード記憶部１０に記憶されたソースコードの全ての行を読み込んでいないと判定した場合（Ｓ６、Ｎｏ）、エントリーポイント抽出装置１、より詳しくはエントリーポイントリスト生成部１６は、ステップＳ１に戻り、ソースコード記憶部１０に記憶されたソースコードからいまだ読み込んでいない次の行を読み込んで、その行についてステップＳ１を実行する（Ｓ１）。
【００４６】
一方、ステップＳ６において、ソースコード記憶部１０に記憶されたソースコードの全ての行を読み込んだと判定した場合（Ｓ６、Ｙｅｓ）、エントリーポイント抽出装置１、より詳しくはエントリーポイントリスト生成部１６は、バイナリーコード記憶部１８に記憶されたバイナリーコードから別のエントリーポイントリスト（「第２のエントリーポイントリスト」と呼ぶ）を生成し、この第２のエントリーポイントリストとエントリーポイントリスト記憶部１７に記憶された第１のエントリーポイントリストとを結合し、結合後のリストから重複するエントリーポイントを削除して、もう一つ別のエントリーポイントリスト（「事前変換対象エントリーポイントリスト」と呼ぶ）を生成し、この事前変換対象エントリーポイントリストを事前変換対象エントリーポイントリスト記憶部１９に記憶させる。
以上で、エントリーポイントリスト生成処理が終了する。
【００４７】
なお、事前変換部２０は、事前変換対象エントリーポイントリスト記憶部１９に記憶された事前変換対象エントリーポイントリストからエントリーポイントを読みだして参照しながら、ソースコード（ターゲットコードともいう）について、分岐命令や特殊レジスタ値の有無を確認し、ソースコードを基本ブロックに分割し、基本ブロックに分割されたターゲットコードに対応するバイナリーコード（中間コードともいう）をホストコードに変換してゆく。
【００４８】
エントリーポイントリスト生成処理で生成されるエントリーポイントリストの例を掲げる。図６は、ソースコード記憶部１０に記憶されるソースコードの一部の例である。このソースコードにはエントリーポイントリストとして抽出される対象である関数名「ＰＲＯＣ１」と、内部ラベル「Ｌ２」及び「Ｌ２」が含まれているものとする。
【００４９】
図７は、図６に示したソースコードの一部に対応する、シンボル情報及びロケート情報の例を示す。シンボル情報及びロケート情報には、エントリーポイントとなり得る箇所（関数名、ラベル名など）の開始アドレス、シンボル属性、ラベル名が記述されている。
図８は、図７に示したシンボル情報及びロケート情報に対応する、エントリーポイントリストの例である。この例では、エントリーポイントとなる関数名「ＰＲＯＣ１」と、内部ラベル「Ｌ１」及び「Ｌ２」の開始アドレスのみ含まれている。事前変換部２０は、エントリーポイントリストに含まれる開始アドレスに基づいて基本ブロックの開始位置を取得し、基本ブロックのホストコードへの変換を行っていく。
【００５０】
［２．第２の実施の形態］
本発明の第２の実施の形態について説明する。第２の実施の形態に係るエントリーポイントリスト抽出装置は、基本的構成は前述の第1の実施の形態に係るエントリーポイントリスト抽出装置と同様であるが、ジャンプテーブルを用いた分岐命令などの複雑な形式のものをソースコード解析時に発見すると、ロケート情報及びニーモニックを利用して、それらをエントリーポイントリストに加えるための例外データベースをさらに有している点で相違している。
【００５１】
［２．１．エントリーポイントリスト抽出装置の構成例］
第２の実施の形態に係るエントリーポイントリスト抽出装置の構成について説明する。図９は、第２の実施の形態に係るエントリーポイントリスト抽出装置の構成例を示すブロック図である。なお、第１の実施の形態に係るエントリーポイントリスト抽出装置と同様の構成要素については、同一の参照符号を付しそれらの詳細な説明は省略する。
【００５２】
第２の実施の形態に係るエントリーポイントリスト抽出装置１Ａは、例えばコンピュータ、ワークステーションなどの情報処理装置によって実現される装置である。この情報処理装置は、演算処理装置（ＣＰＵ）、主メモリ（ＲＡＭ）、読み出し専用メモリ（ROM）、入出力装置（Ｉ／Ｏ）、及び必要な場合にはハードディスク装置等の外部記憶装置を具備している装置である。
【００５３】
エントリーポイント抽出装置１Ａは、ソースコード記憶部１０と、ソースコード記憶部１０に接続されたコンパイラ部１１及びニーモニック記憶部１３と、コンパイラ部１１に接続されたリンカ部１２と、リンカ部１２に接続されたシンボル情報記憶部１４並びにロケート情報記憶部１５と、ソースコード記憶部１０、ニーモニック記憶部１３、シンボル情報記憶部１４並びにロケート情報記憶部１５に接続されたエントリーポイントリスト生成部１６Ａと、エントリーポイントリスト生成部１６Ａに接続されたエントリーポイントリスト記憶部１７と、エントリーポイントリスト生成部１６Ａへ接続する例外パターンデータベース部２６と、エントリーポイントリスト記憶部１７に接続された事前変換部２０Ａと、前記リンカ部１２に接続されるとともに前記事前変換部２０Ａに接続するバイナリーコード記憶部１８と、前記事前変換部２０Ａに接続された事前変換対象エントリーポイントリスト記憶部１９と、前記事前変換部２０Ａに接続された事前変換後実行イメージ記憶部２１と、前記事前変換後実行イメージ記憶部２１に接続されたローダー部２２と、ローダー部２２に接続されたホストマシン部２３とを有する。
【００５４】
［２．２．各部の説明］
例外パターンデータベース部２６は、バイナリーコードからではエントリーポイントとして抽出することが困難な構文（命令文）を記憶する機能を有する。抽出することが困難な構文（命令文）は、例えばジャンプテーブルを用いた分岐命令である。なお、例外パターンデータベース部２６への構文（命令文）の入力は手入力などで事前に行っておく。例外パターンデータベース部２６は第５の記憶手段に相当する。
【００５５】
エントリーポイントリスト生成部１６Ａは、例外パターンデータベース部２６に記憶されている構文（ジャンプテーブルを用いた分岐命令など）をソースコード解析時に発見すると、ロケート情報及びニーモニックを利用して、アドレスデータやリンカでの呼称の形で指定されている分岐先などを含む複雑な形式のリストを抽出し、そのままでは使用しにくいので、変形し、それらを前記第１のエントリーポイントリストに追加したエントリーポイントリストを第４のエントリーポイントリストとして出力する機能を有する。第２の実施の形態では、エントリーポイントリスト記憶部１７はこの第４のエントリーポイントリストを記憶する。
【００５６】
事前変換部２０Ａは、バイナリーコード記憶部１８に記憶されているバイナリーコードをパースして、可能性のある分岐先を事前変換対象エントリーポイントリストに入力しながらバイナリーコードをホストコードに変換するコード変換を行うとともに、前記バイナリーコードからだけでは追跡できなくなったら、前記第４のエントリーポイントリストを事前変換対象エントリーポイントリストへ入力し、さらにコード変換を試す機能を有する。
また、事前変換部２０Ａは、事前変換対象エントリーポイントリストを生成し、事前変換対象エントリーポイントリスト記憶部１９に記憶させる機能を有する。事前変換対象エントリーポイントリストは、事前変換部２０Ａによって生成される情報であって、前記バイナリーコードを追跡することによって事前変換部２０Ａが生成した第２のエントリーポイントリストと、前記エントリーポイントリスト記憶部１７に記憶された前記第４のエントリーポイントリストとを結合し、重複しているエントリーポイントを削除して残ったエントリーポイントのリストである。
上記以外の各部は第１の実施の形態と同様なので、これらの機能の詳細な説明は省略する。
【００５７】
［２．３．第２の実施の形態における動作例］
図９に示した第２の実施の形態に係るエントリーポイント抽出装置の動作例を、図１０、図１１を参照しながら説明する。図１０は、第２の実施の形態に係るエントリーポイント抽出装置の動作例を示すフローチャートであり、図１１は図１０に続くフローチャートである。なお、第１の実施形態と同様の処理（ステップ）については、同一の参照符号を付す。
【００５８】
第２の実施の形態では、複雑な構文（命令文）を解析するための例外パターンデータベース部２６を用意しておき、シンボル情報からだけでは抽出できないエントリーポイントを探索する。シンボル情報からだけでは抽出できないエントリーポイントは、関数の先頭ではなくシンボル情報ファイルにも現れないが、内部ラベルやcase文の飛び先などを先頭（エントリーポイント）とした、基本ブロックになる部分である。例外パターンデータベース部２６に登録された命令文が見つかったら、当該命令文について例外パターンデータベースにあらかじめ登録されている例外パターンを参照して抽出されたエントリーポインを前述の第１のエントリーポイントリストに加えて、第４のエントリーポイントリストを生成する。このようにして生成された第４のエントリーポイントリストは第１のエントリーポイントリストに比べて、ジャンプテーブルなどの特殊な内部ラベルなどのエントリーポイントがより多く検出されている。
【００５９】
第２の実施の形態におけるエントリーポイントリスト生成処理は以下のとおりである。
まず、エントリーポイント抽出装置１Ａ、より詳しくはエントリーポイントリスト生成部１６Ａはソースコード記憶部１０に記憶されたソースコードから一行読み出し、ソースコード解析を実行する（Ｓ１）。
【００６０】
なお、ステップＳ１に先立って、コンパイラ部１１はニーモニックを生成して、これをニーモニック記憶部１３に記憶させており、リンカ部１２は、コンパイラ部１１の出力に基づいて、シンボル情報並びにロケート情報を生成し、それぞれシンボル情報記憶部１４、ロケート情報記憶部１５に記憶させているものとする。なお、シンボル情報、ロケート情報については第１の実施の形態と同様である。
【００６１】
次に、エントリーポイント抽出装置１Ａ、より詳しくはエントリーポイントリスト生成部１６Ａは、読み込んだ行（命令）からプロシージャ先頭若しくはラベルを発見したか否かを判定する（Ｓ２）。
【００６２】
読み込んだ行からプロシージャ先頭若しくはラベルを発見しないと判定した場合（Ｓ２、Ｎｏ）、エントリーポイント抽出装置１Ａ、より詳しくはエントリーポイントリスト生成部１６Ａは後述するステップＳ６に進む。
【００６３】
一方、読み込んだ行からプロシージャ先頭若しくはラベルを発見したと判定した場合（Ｓ２、Ｙｅｓ）、エントリーポイント抽出装置１Ａ、より詳しくはエントリーポイントリスト生成部１６ＡはステップＳ２において発見したプロシージャ（関数）・ラベル名に対応するシンボルをシンボル情報記憶部１４に記憶されたシンボル情報から抽出する（Ｓ３）。次にエントリーポイント抽出装置１Ａ、より詳しくはエントリーポイントリスト生成部１６Ａは、ロケート情報記憶部１５に記憶されたロケート情報から、ステップＳ３で抽出したシンボルに対応するロケート情報を抽出する（Ｓ４）。次にエントリーポイント抽出装置１Ａ、より詳しくはエントリーポイントリスト生成部１６Ａは、ステップＳ4において抽出したロケート情報に基づいてエントリーポイント情報を生成し、エントリーポイントリスト記憶部１７に記憶されているエントリーポイントリスト（第１のエントリーポイントリスト）にこのエントリーポイント情報を追加する（Ｓ５）。
【００６４】
次に、エントリーポイント抽出装置１Ａ、より詳しくはエントリーポイントリスト生成部１６Ａは、例外パターンデータベース部２６から例外命令文（例外パターン）を読みだす（Ｓ１１）。
【００６５】
次にエントリーポイント抽出装置１Ａ、より詳しくはエントリーポイントリスト生成部１６Ａは、プロシージャ（関数）内に、例外命令文があるか否かを調べる（Ｓ１２）。
例外命令文がプロシージャ内に無いと判定した場合（Ｓ１２，Ｎｏ）、エントリーポイント抽出装置１Ａ、より詳しくはエントリーポイントリスト生成部１６Ａは、後述するするステップＳ６に進む。
【００６６】
一方、例外命令文があると判定した場合（Ｓ１２，Ｙｅｓ）、エントリーポイント抽出装置１Ａ、より詳しくはエントリーポイントリスト生成部１６Ａは、ニーモニック記憶部１３に記憶されたニーモニックファイルから、その例外命令文に対応するアセンブラコードを抽出する（Ｓ１３）。
【００６７】
次にエントリーポイント抽出装置１Ａ、より詳しくはエントリーポイントリスト生成部１６Ａは、ロケート情報記憶部１５に記憶されたロケート情報を参照して、ステップＳ１３で抽出したアセンブラコードに対応する分岐先情報を抽出する。分岐先情報には、分岐先の開始アドレスが含まれる。
【００６８】
次にエントリーポイント抽出装置１Ａ、より詳しくはエントリーポイントリスト生成部１６Ａは分岐先情報を出力し、前記第１のエントリーポイントリストにこの分岐先情報を付加する（Ｓ１５）。
【００６９】
次にエントリーポイント抽出装置１Ａ、より詳しくはエントリーポイントリスト生成部１６Ａは、ソースコード記憶部１０に記憶されたソースコードから全ての行を読み込み済みか否かを判定する（Ｓ６）。
【００７０】
ステップＳ６において、ソースコード記憶部１０に記憶されたソースコードの全ての行を読み込んでいないと判定した場合（Ｓ６、Ｎｏ）、エントリーポイント抽出装置１Ａ、より詳しくはエントリーポイントリスト生成部１６Ａは、ステップＳ１に戻り、ソースコード記憶部１０に記憶されたソースコードからいまだ読み込んでいない次の行（命令文）を読み込んで、その行について構文解析を実行する（Ｓ１）。
【００７１】
一方、ステップＳ６において、ソースコード記憶部１０に記憶されたソースコードの全ての行を読み込んだと判定した場合（Ｓ６、Ｙｅｓ）、エントリーポイント抽出装置１Ａ、より詳しくはエントリーポイントリスト生成部１６Ａは、バイナリーコード記憶部１８に記憶されたバイナリーコードから第２のエントリーポイントリストを生成し、この第２のエントリーポイントリストとエントリーポイントリスト記憶部１７に記憶された第１のエントリーポイントリストとを結合し、結合後のリストから重複するエントリーポイントを削除して、さらに別のエントリーポイントリスト（「事前変換対象エントリーポイントリスト」と呼ぶ）を生成し、この事前変換対象エントリーポイントリストを事前変換対象エントリーポイントリスト記憶部１９に記憶させる（Ｓ７）。
以上で、エントリーポイントリスト生成処理は終了する。
【００７２】
［２．４．例外パターンについて］
バイナリー解析によるエントリーポイントリスト（第１のエントリーポイントリスト）だけでは、抽出が難しいエントリーポイントが存在する場合がある。例外パターンデータベース部２６は、このような場合にも適正なエントリーポイントの抽出を行うことを可能とする。
【００７３】
抽出が難しいエントリーポイントは、例えば、ジャンプ先が間接アドレスでかつ、その指す先がコード実行によってはじめて定まるケースである。１例として図１２にジャンプテーブルの例を示す。このジャンプテーブルの場合、分岐先を同定しようとするとき、どこまでがジャンプテーブルであるのかを決定することが難しい。なぜならINDEX値が別の基本ブロックで操作されるとき、その値の上限を追い切れないケースがあるためである。この場合、エントリーポイントの判定を次のように行う。
【００７４】
下記の例で、オリジナルの高位言語が次のようなジャンプテーブルで記述されているとき、コンパイラ部１１やリンカ部１２は、ニーモニックへ変換する。図１２のジャンプテーブルから変換されたニーモニックの例を図１３に示す。このとき、DO-CASE文が出現したことをソースコードの構文解析で検出することをトリガに、エントリーポイントリスト生成部１６Ａは、ニーモニック記憶部１３に記憶されているニーモニックを参照し、label1, label2, label3がジャンプテーブルのデータであると判定する。その結果、エントリーポイントリスト生成部１６Ａは、これらデータlabel1, label2, label3は、エントリーポイントとなり得るものと判定し、第１のエントリーポイントリストに追加する。
【００７５】
ソースコードに例外パターンが含まれている場合の別の例を示す。図１４は、ソースコード記憶部１０に記憶されているソースコードの一部分であって、例外パターンデータベース部２６に記憶されている例外パターン（命令文）の一つに合致する部分を示す図である。
【００７６】
図１５にニーモニック記憶部１３に記憶されるニーモニックの一部であって、図１４に示した例外パターンに合致するソースコードの部分に対応するニーモニックの一部を示す。エントリーポイントリスト生成部１６Ａは、ニーモニックにおけるジャンプテーブルに対応する箇所を特定する。
【００７７】
図１６にシンボル情報記憶部１４に記憶されるシンボル情報の一部であって、図１４に示した例外パターンに合致するシンボル情報の一部を示す。エントリーポイントリスト生成部１６Ａは、このシンボル情報を探索することにより、ジャンプテーブルのデータである「RUN1」、「RUN2」の開始アドレスを取得する。
【００７８】
図１７に、図１４、図１５、図１６に示すソースコード、ニーモニック、シンボル情報から生成されるエントリーポイントリストの例を示す。
このように、例外パターンデータベース部２６に記憶された例外パターン（命令文）に合致する部分から、通常では抽出することが困難なデータもエントリーポイントとして抽出することが可能となる。
【００７９】
[３．本実施の形態の利点]
従来の仮想化エミュレーションの事前変換アルゴリズムでは、エミュレーション対象のアプリケーションコードのバイナリー解析のみによってエントリーポイントを見つけていたが、多少の漏れが発生していた。本実施の形態によれば、コンパイラやリンカーが出力したシンボル情報を利用することで、より多くのエントリーポイントを確実に抽出し、より多くの基本ブロックを抽出することが可能となる。
【００８０】
［４．まとめ、その他］
以上、本発明の実施の形態を説明したが、本発明はこれらに限定されるものではなく、発明の趣旨を逸脱しない範囲内において、種々の変更、追加、組み合わせ等が可能である。
【符号の説明】
【００８１】
１、１Ａ・・・エントリーポイント抽出装置；  １０・・・ソースコード記憶部；  １１・・・コンパイラ部；  １２・・・リンカ部；  １３・・・ニーモニック記憶部；  １４・・・シンボル情報記憶部；  １５・・・ロケート情報記憶部；  １６，１６Ａ・・・エントリーポイントリスト生成部；  １７・・・エントリーポイントリスト記憶部；  １８・・・バイナリーコード記憶部；  １９・・・事前変換対象エントリーポイントリスト記憶部；  ２０，２０Ａ・・・事前変換部；  ２１・・・前記事前変換後実行イメージ記憶部；  ２２・・・ローダー部；  ２３・・・ホストマシン部；  ２４・・・周辺デバイス；  ２５・・・システムイメージ記憶部；  ２６・・・例外パターンデータベース部。
【図１】
2014206948.tif 000003
【図２】
2014206948.tif 000004
【図３】
2014206948.tif 000005
【図４】
2014206948.tif 000006
【図５】
2014206948.tif 000007
【図６】
2014206948.tif 000008
【図７】
2014206948.tif 000009
【図８】
2014206948.tif 000010
【図９】
2014206948.tif 000011
【図１０】
2014206948.tif 000012
【図１１】
2014206948.tif 000013
【図１２】
2014206948.tif 000014
【図１３】
2014206948.tif 000015
【図１４】
2014206948.tif 000016
【図１５】
2014206948.tif 000017
【図１６】
2014206948.tif 000018
【図１７】
2014206948.tif 000019